Posts Tagged mysql

mysql的“降级”移植

开发了一个项目,在部署时遇到了一点问题。

开发环境原本是mysql5.1,可实际部署的时候才发现服务器端的环境是mysql4.0。可mysqldump出来的数据无法直接倒入4.0,直接拷贝出来的数据,mysql4.0根本无法识别。

研究了一下mysqldump的文档,找到了一个选项“–compatible=name” 问题迎刃而解。而且这个选项竟然支持在多个环境中的平移。 选项支持mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb,格式的SQL语句。

No Comments

请教mysql的数据备份

我想备份服务器(linux)上的数据 mysqldump -p db_name > backup.txt 提示Enter password : 但我输入不进去密码(光标不动),为什么? 急呀,请求帮助,谢谢了! MSN:zch1125@163.com email : linda.zh@vonno.com

3 Comments

Mysql的存储引擎

mysql5.1里包含了好几种存储引擎(Storage Engine )。性能各有千秋,究竟哪个才是您需要的?

功能列表:


MyISAM BDB Memory InnoDB Archive NDB
最大数据 256TB No Yes 64TB No 384EB[4]
事务处理 No Yes No Yes No Yes
锁定级别 Table Page Table Row Row Row
读取快照 No No No Yes Yes No
特殊类型字段支持 Yes Yes[1] No Yes[1] Yes[1] Yes[1]
B-tree 索引 Yes Yes Yes Yes No Yes
哈西索引 No No Yes No No Yes
全文搜索 Yes No No No No No
集群索引 No Yes No Yes No No
数据缓存 No Yes N/A Yes No Yes
索引缓存 Yes Yes N/A Yes No Yes
压缩数据 Yes No No No Yes No
加密[2] Yes Yes Yes Yes Yes Yes
集群数据库 No No No No No Yes
复制支持[3] Yes Yes Yes Yes Yes Yes
外键支持 No No No Yes No No
热备份热恢复[3] Yes Yes Yes Yes Yes Yes
结果缓存支持 Yes Yes Yes Yes Yes Yes
字典更新统计 Yes Yes Yes Yes Yes Yes

注:

[1]支持特殊的数据类型,但不可作为索引
[2] 通过编程在服务器执行,效果远胜于在存储引擎中执行
[3] 在服务器内执行,远胜过在存储引擎中执行
[4] EB = 1024 * 1024TB

其中最常用的非MyISAM莫数。也是mysql下功夫最多的一个引擎了,几乎所有的参数都可以调节。速度超快,适合存储网页数据。类似的还有一个ISAM引擎,但就我看来,它不过是MyISAM的前身为了保证兼容性保留下来的。

Memory首次接触是将php的seesion保存在数据库中,Memory顾名思义,将所有数据保存在内存中,访问速度有所提高,当然关机后数据消失。感觉这个引擎更加体现了mysql的“裸奔原则”,为了速度,能丢弃的全部丢弃。

InnoDB因为有了事务处理和外键支持,很适合做企业数据库。但说老实话,他的速度实在叫人提不起兴趣。支持COMMIT, ROLLBACK, 和 savepoints.

BDB,很接近于InnoDB,支持
RCOMMITROLLBACK 操作

NDB,如果你的mysql不得不作集群,这也是不得不选择的引擎。

一个数据库中每个表都可以用不同的引擎,你可以使用“CREATE TABLE engineTest (id INT) ENGINE = MyISAM;” 的方式来创建一个表,同时也可以使用“ALTER TABLE engineTest ENGINE = ARCHIVE;”的方式改变一个表的属性。

No Comments

细解mysqldump

mysqldump是mysql自带的一个强大的备份工具。如果您像装载整个数据库mydb的内容到一个文件中,可以使用下面的命令:

  #mysqldump –-database mydb –user=username –password=password > mydb.sql
  
  这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库db中的表table中的整个内容导出到一个文件,可以使用下面的命令:

  #mysqldump –database db table >db_table.sql
  
  这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。看过mysql官方手册中就介绍了这样一个实现mysql增量备份的例子:
      
        #mysqldump –where=“ last_modified < NOW() – INTERVAL 1 MONTH”  >backup.sql
    
  mysqldump工具有大量的选项,部分选项如下表:

  选项/Option 作用/Action Performed

  –add-drop-table

  这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除

  –add-locks

  这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
  
  -c or – complete_insert

  这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。

  –delayed-insert 在INSERT命令中加入DELAY选项

  -F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.

  -f or -force 使用这个选项,即使有错误发生,仍然继续导出

  –full 这个选项把附加信息也加到CREATE TABLE的语句中

  -l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

  -t or -no-create- info

  这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。
  
  -d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。

        –opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

  -q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。

   -T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命 名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。
  
  -w "WHERE Clause" or -where = "Where clause "

  如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。
  

PS: 如果你的mysql是运行在*nix平台上的,可以利用其强大的pipe连接一下,输出压缩后的数据:mysqldump -A | bzip2 -9 -f > db_backup.sql.bz2。直接从一个服务器备份到另一服务器:mysqldump –opt database | mysql –host=remote-host -C database  。

No Comments

优化你的数据库

最近一段时间似乎是受到了刺激,弄来弄去都是优化各种数据库的活所以继续还是写这一类的东西。凡是运行中的数据库,总会数据越来越多(废话!),性能同时也会越来越差。这里就按照一般的顺序,从应用逐步提高到硬件升级。

应用优化

任何一个数据库他的作用都不是全力运行算术运算的,所以除了必须的工作之外,其他的还是交给外部软件来完成吧。让数据库来执行类似于计算器功能的算术运算或者执行一系列无谓的数据校验可谓是愚蠢至极,过于复杂的函数最好也不要使用,记住数据库的优势在于:

  • SELECTINSERT 指定的行

  • JOIN

  • GROUP BY

  • ORDER BY

  • DISTINCT

 对于一般的简单运算,类似于sum avg之类的操作,出于节省连接时间的考虑还是交给外部软件吧。当然不要查询应用中不需要的列同时可以试试看UPDATE table set count=count+1 where key,性能可能会有不少提升。如果在一个批处理中进行大量修改,可以使用LOCK TABLES例如将多个UPDATESDELETES集中在一起;Insert使用默认值也是一个不错的选择。当然可以多试试EXPLAIN 工具,总会找到一种适合的最优化操作的。

优化数据结构

注意的是,这里说的并不是让你去更改系统的数据结构,特别是在运行中的系统中,这样做是“相当”危险的。

  • 明智地使用键码。
  • 键码适合搜索,但不适合索引列的插入/更新。

  • 不要索引你不想用的东西。

  • 虽说有种说法叫做“同样的数据只保存一次”但前提是“在所有的运算只做一次且有用”的前提下,创建足够总结表、简化表是非常有益的

  • 在大表上不做GROUP BY,相反创建大表的总结表/简化表并查询它。

  • ANALYSE过程可以帮助你找到表的最优类型:SELECT * FROM table_name PROCEDURE ANALYSE()

数据库优化

这里一句话也讲不清这么多种数据库的优化,本站有不少相关的东西可供大家参考,并且本站会不断更新和完善,同时也希望大家协助。

磁盘优化

磁盘系统通常是影响数据库第二个重要的因素(第一重要的是内存,但内存的优化相比较复杂)

  • 为系统、程序和临时文件配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。

  • 低寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表,索引Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。

  • 然而对于写入(如上),你将需要4次寻道请求来找到在哪里存放新键码,而且一般要2次寻道来更新索引并写入一行。

  • 对于非常大的数据库,你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈N log N数据级递增。

  • 将数据库和表分在不同的磁盘上。在MySQL中,你可以为此而使用符号链接。

  • RAID 0将提高读和写的吞吐量。

  • RAID 0+1将更安全并提高读取的吞吐量,写入的吞吐量将有所降低。

  • 不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)

  • Linux上,在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%

  • Linux上,用async (默认)noatime挂载磁盘(mount)

  • 对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。

升级硬件

按照数据库对于硬件的依赖程度,内存、硬盘、CPU的顺序来升级硬件,包括操作系统。

  • 如果你需要庞大的数据库表(>2G) ,最好采用64位的CPU64位的操作系统。

  • 如果有足够大的内存,关掉Swap分区吧。

  • 更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新 ,但前提是要正确的设置而且配置好这些内存——这正是我前些天碰到的比较讽刺的例子,空有24G的内存只执行了2秒钟的“F5攻击”就死的一塌胡图。

  • 如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭

  • 如果数据库单独列出来需要网络连接,请选择至少千兆网卡和交换机的连接,如果采用了类似于8139的烂网卡你会抓狂的。

其他的类似于定期优化表、修复磁盘、消除碎片等等工作属于一般性的维护操作,这里不加深解。

, ,

1 Comment

数据库系统升级

根据PostgresSQL8.1的手册所描述,8.1新增了诸如数据库自动清理和自动备份等新功能。在本地测试了大约3周,确实如实。故今天上午9:00~11:00升级了网站的数据库至8.1的版本,同时连带升级还有PHP5的pgsql模块和perl。

整体性能有了一定提高,首页的平均载入时间减少了百分之三秒且还有潜力可挖。升级过程中可能部分用户会注册失败,还请重新注册。

No Comments

让Openoffic与你的数据库对接

Openoffice从2.0版本开始,增加了Openoffic Base组件。这个组件功能类似于MS Access,同样允许你通过ODBC 或 JDBC 连接到外部数据库。本文就Ubuntu下的ODBC连接mysql为例。

安装 unixODBC 和 MyODBC :
#sudo apt-get install unixodbc unixodbc-bin libmyodbc
其中“unixodbc-bin”是一系列图形化的工具,可以不安装。

设置unixODBC:
#sudo ODBCConfig
开启ODBC的控制面板,与windows的几乎一样的布局。

System DSN->ADD…按钮

继续ADD

这里的Name和Description随便写就可以了,Driver 为 /usr/lib/odbc/libmyodbc.so
Setup 为 /usr/lib/odbc/libodbcmyS.so ,其余的默认就好了。对于其它不是Ubuntu的用户,只要确保安装了MyODBC,不妨直接搜索文件名将路径贴过来就可。结束后“对勾”按钮保存结束。

到了这一步就没有太大难度了,Name随便,Server添数据库服务器的IP地址,Port Mysql的端口,默认3306,Database下拉列表中选择需要连接的数据库。其余空着,对勾。

设置成功!OK结束。

设置OpenOffice Base:

这里选择“连接到现有数据库”下拉列表选择ODBC,我试过选择Mysql不过到头来还是通过了ODBC连接。

如果前面ODBC设置正确,这里会出现数据源列表。

数据库的用户名、密码,同时还有测试按钮。

OK,搞定!

现在就可以利用OpenOffice Base来直接向数据库中导入、导出数据了,对于数据库开发来说,利用图形化的界面搭建数据库是非常惬意的了。

,

No Comments

Samba 3.0.10 的 MySQL 用户表验证

Samba 让 Linux 的灵活性表露无遗。在公司的局域网内部,我十分喜欢 Samba 的自由自在。

  安装和编译的步骤并不复杂,但是需要了解为了支持 MySQL 认证,编译时需要的参数,以及配置时采用正确的参数。

编译命令:

$ ./configure –with-expsam=mysql –with-mysql-prefix=/opt/mysql

如果以上命令成功的话,然后就是 make ; make install 了。
然后拷贝一个 examples 下的 smb.conf 到 /usr/local/samba/lib 。
用 /usr/local/samba/sbin/smbd -D 即可启动。
用 smbstatus 命令可以查看 Samba 服务器的状态。

下面配置 MySQL 的支持。 和 MYSQL 相关的配置有以下几行:

[global]

# passdb backend = plugin:/usr/local/samba/lib/pdb/mysql.so:mysql
passdb backend = mysql:mysql
mysql:mysql host = localhost #主机名
mysql:mysql port = nnnn #端口号,默认3306
mysql:mysql user = samba #mysql用户
mysql:mysql password = password #mysql密码
mysql:mysql database = smb_user #数据库名
mysql:mysql table = user #数据表,似乎没有用处

……
  建立 smb_user.user 表的脚本可以从 examples/pdb/mysql 目录下的 mysql.dump 导入,如果使用的版本是samba3,还需要单独手工增加“logon_hours"键值,这个目录下的 smb.conf 是一个最简单的配置,可以供参考。但是这个文件有几个地方是错的。

  最主要的就是上面注释掉的那行,我发现根据这个 sample 不能使用,后来修改为简单的
mysql:mysql 后就能使用了。

  具体的调试还是必须看相关的日志文件,如果是数据库连接错误,相关的日志文件会报告数据库不能连接的错误。

  这样,一个基于 MySQL 用户的 Samba 系统建立了起来。
       如果安装了swat,可以运行一下,重新格式化一下配置文件,这样看起来更方便一些。

   但是,目前没有现成的完全基于 PHP 的针对 Samba 口令的修改程序。因为 user 表中的 lm_pw 和 nt_pw 分别代表口令的散列,其算法相对比较复杂, 远远不是 PHP 和 MySQL 提供的 encrypt() md5() 之类的函数能解决的。

  如果有读者已经发现或者已经研发出纯 PHP 的修改 lm_pw 和 nt_[pw 字段的程序,欢迎一起交流。

,

No Comments

mysql在不同操作系统下的性能

网上有很多关于硬件的测评,前不久,我找到了不同操作系统下Mysql的测评,比较有趣。不过讲老实话,由于我刚刚经历了数月的mysql折磨—传说中mysql的极限竟然被我遇上了(话外音:应该买彩票)。我现在似乎已经不太敢用mysql做项目了。

操作系统:
    gentoo (kernel 2.4.28)
    gentoo (kernel 2.6.10)
    NetBSD 2.0
    FreeBSD 5.3 KSE
    FreeBSD 5.3 LT
    FreeBSD 4.11 (libc_r)
    FreeBSD 4.11 LT
    OpenBSD 3.6
    Solaris 10 (b69)

Super Smack 1.2测试1,2cpu下的SELECT-KEY和UPDATE-KEY的效能:

命令:
super-smack /usr/share/smacks/select-key.smack 10 10000

super-smack /usr/share/smacks/update-select.smack 10 10000

v2graphs_1-CPU-select-key.gif
v2graphs_2-CPU-select-key.gif
v2graphs_1-CPU-update-select.gif
v2graphs_2-CPU-update-select.gif

SysBench 0.3.1 1M 的数据Rows测试数据库性能,同样也是1,2CPU的资料:

命令:
To setup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 prepare

To run:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 run

To cleanup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 cleanup

10M Rows:

To setup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 prepare

To run:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 run

To cleanup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 cleanup


v2graphs_1-CPU-1M-rows.gif
v2graphs_2-CPU-1M-Rows.gif

同上,只是 10M 的Row

v2graphs_1-CPU-10M-Rows.gif
v2graphs_2-CPU-10M-Rows.gif

Super Smack的综合

v2graphs-Delta-Super-Smack.gif

SysBench 的综合:


v2graphs_Delta-1M-Rows.gif
v2graphs_Detla-10M-Rows.gif

该测评的最终结论:
Linux2.4 2.6 以及Solaris比较适合运行mysql, FreeBSD 5.3 (KSE and linuxthreads), and FreeBSD 4.11 表现一般,而其余的很不适合多处理器,而个别案例说明他对于单个处理器还是有优势可言的。

后面的还有很多评语,苦于本人的英语水平有限,只等说看出大概。(原文在 http://www.newsforge.com/article.pl?sid=04/12/27/1243207)

其实本人对某些测试结果持怀疑态度:
    1.其实操作系统内核是可以根据需要进行优化和重编的,
    2.而且对于FreeBSD的测试都是基于Linux模拟方式进行的,对于FreeBSD评价有失公平。
    3.Solaris的磁盘格式非常适合数据库存储,本人就有采用Solairs的磁盘格式优化linux下mysql的经历。

No Comments

启动多个mysqld

为达到启动多个mysqld服务,只要启动时使用不同pid-file,datadir,socket,port是完全的可行。

步骤:
1、准备目录
mkdir /mysql1
chown mysql:mysql /mysql1
chmod 755 mysql /mysql1
2、准备新的服务要读取的数据库
cp /path/to/mysql/var /mysql1
3、创建mysqld启动脚本
#start_msyql
#!/bin/sh
rundir="$1"
port="$2"
echo "$rundir"
/www/mysql/bin/safe_mysqld –user=mysql –pid-file="$rundir"/mysql.pid 

–datadir="$rundir"/var -O max_connections=500 -O wait_timeout=600 -O key_buffer=32M 

–port="$port" –socket="$rundir"/mysql.sock &
说明:
脚本使用方法./start_mysql /mysql1 3307
./start_mysql dir port
dir:指的是mysql数据库及运行时产生的文件所在目录
port:指新的mysqld监听的端口

4、创建mysqld的停止脚本
#stop_mysql
#!/bin/sh
rundir="$1"
echo "$rundir"
/www/mysql/bin/mysqladmin -u root -p -S"$rundir"/mysql.sock shutdown

No Comments