首页 > 代码库 > MySQL6-数据库维护

MySQL6-数据库维护

一、数据备份
1、直接拷贝:有些文件处于打开和使用状态,不方便
2、mysqldump:
3、mysqlhotcopy:逻辑备份(即备份时执行sql语句);只支持MYSIAM
4、backup table或select into outfile将所有数据转储到某个外部文件;使用restore table来复原。
5、补充说明
(1)为保证所有数据被写到磁盘上(包括索引数据),需要在备份前使用flust tables语句。
(2)以上方法如果没有特殊说明,不限存储引擎。
(3)附录中有关于InnoDb备份的补充说明。
 
 
 
二、数据库维护
1、analyze table:用于分析和存储表的关键字分布【只读锁】。
按照MySQL文档的说法,对于Innodb和MyIsam,分析期间会对表加一个读锁。该语法对Innodb、MyIsam和NDB都有用;对于MyIsam,该语法相当于myisamchk --analyze。
MySQL使用已存储的关键字分布来决定当对除常数以外的对象执行join时,表按什么顺序进行联合。
【http://blog.csdn.net/alongken2005/article/details/6394016】该文章指出,analyze table可以修复表的索引的散列程度(cardinality);散列程度越大,索引效果越好。个人认为,这种散列程度只用于哈希索引。使用show index from tablename;语句可以查看表索引的散列程度。
 
2、check table:检查表【只读锁】。
检查InnoDB和MyISAM类型的表是否存在错误。而且,该语句还可以检查视图是否存在错误。该语句可以有选项,分别是QUICK、FAST、CHANGED、MEDIUM和EXTENDED;这5个参数的执行效率依次降低。option选项只对MyISAM类型的表有效,对InnoDB类型的表无效。
表的错误,如数据写入磁盘时发生错误,索引没有同步更新(对索引的检查貌似只对MyIsam进行),数据库没有关闭MySQL就停止了等等。
 
3、repaire table:修复表。
只对MyISAM和ARCHIVE类型的表有效;这条语句同样可以指定选项。该语句不应该经常使用;如果经常使用,说明有其他更重要的问题需要解决。
 
4、optimize table:优化表【只读锁】。
对InnoDB和MyISAM类型的表都有效;但是只能优化表中的VARCHAR、BLOB或TEXT类型的字段。可以消除删除和更新造成的磁盘碎片,从而减少空间的浪费。
 
 
三、查看日志文件
1、错误日志:记录启动和关闭问题以及任何关键错误的细节;通常名为hostname.err,位于data目录中;可用--log-error命令行选项更改此日志名。
2、查询日志:记录所有MySQL活动,在诊断问题时特别有用;通常名为hostname.log,位于data目录中;可用--log命令行选项更改此日志名。此日志文件可能会很快变得非常大,因此不应该长期使用。
3、二进制日志:记录更新或可能更新过数据的所有语句;通常名为hostname-bin,位于data目录中;可用--log-bin命令行选项更改此日志名。
4、慢查询日志
5、通过show variables like "log*"可以查看日志是否开启以及文件位置;在配置文件(如my.ini)中找到对应的日志配置,可以开启或关闭日志功能,并配置文件位置(把注释去掉可以开启-未验证)。
 
 
 
四、诊断启动问题
1、MySQL启动问题通常在MySQL配置改变或服务器本身进行更改时出现。要排查启动问题,应尽量使用mysqld手动启动服务器。通过mysqld的一些命令行选项进行排查:
--help
--safe-mode:装载减去某些最佳配置的服务器
--verbose:显示全文本消息(可以与help一起使用)
--version:版本信息
此外,日志功能也可以用于排查启动问题。
 
******************************************************************************************************************************

附录:主要涉及InnoDb表的备份/迁移【是否能够用于MyIsam未探究】

 
MySQL官方文档中(5.6),专门有一节介绍如何拷贝InnoDb表,即14.5.2 Moving or Copying InnoDB Tables to Another Machine
本节中主要介绍了4种方式
 
方法1:Transportable Tablespaces
MySQL原生支持的表拷贝方法,但是有很多限制条件,如MySQL版本在5.6.6以上;innodb_file_per_table必须为ON;源表和目标表的page size必须相同;不能用于分区表等
 
方法2:MySQL Enterprise Backup
企业版才有,普通版没有
对于InnoDb,是热备份,不影响读写;对于非InnoDb,如MyIsam,温备份,即备份期间只能读不能写。
更多参考:http://dev.mysql.com/doc/mysql-enterprise-backup/4.0/en/
 
方法3:Copying Data Files (Cold Backup Method)
冷备份,需要关闭MySQL;是否可以只备份单表呢【貌似不支持单表:单表其实就是方法1了,不能用于分区表】
流程如下:
1. Do a slow shutdown of the MySQL server and make sure that it stops without errors.
2. Copy all InnoDB data files (ibdata files and .ibd files) into a safe place.
3. Copy all the .frm files for InnoDB tables to a safe place.
4. Copy all InnoDB log files (ib_logfile files) to a safe place.
5. Copy your my.cnf configuration file or files to a safe place.
 
方法4:Export and Import (mysqldump)逻辑备份
One way to increase the performance of this method is to switch off autocommit mode when importing data, assuming that the tablespace has enough space for the big rollback segment that the import transactions generate. Do the commit only after importing a whole table or a segment of a table
 
mysqldump不是mysql语句,而是与mysql并列的命令,需要在cmd中执行,举例如下:
mysqldump -h 192.168.65.66 -u root -p cadserverdb ta_user_info > C:\Users\lizy-i\Desktop\ta_user_info.sql
其中cadserverdb是数据库名称,ta_user_info是表名。也可以加入条件,只导出部分表数据,如
mysqldump -h 192.168.65.66 -u root -p cadserverdb ta_user_info --where="id<10000" > C:\Users\lizy-i\Desktop\ta_user_info.sql
 
mysqldump导出的内容是sql语句,既包括表结构(即建表语句),也包括表数据(即insert指令);可以使用-d或-t指定只导出表结构或表中数据。由于这种方法先建表再插入,因此如果是分区表,则数据可以进入正确的分区。
 
测试:1万条3列的数据,用了8秒钟左右导入
 
方法5:select与load(非官方文档的方法,测试可用;可能不限于Innodb表)
这种方法与mysqldump的区别在于,首先它只导出表中数据,不导出表结构;其次它导出的是文本数据本身,而不是sql命令。
在cmd下执行如下代码(没有使用into outfile,效果一样),可以将数据存入文本中
mysql -u root -p sample -e "select * from ta_user_info" > C:\Users\lizy-i\Desktop\ta_user_info.txt
在cmd或mysql中执行以下代码,可以将文件中的数据导入数据库(注意local不可以省略否则报错:permission denied)
mysql -h localhost -u root -p sample -e "load data local infile ‘C:/Users/lizy-i/Desktop/ta_user_info.txt‘ into table ta_user_info2"
经测试,导入的数据能够进入正确的分区。
测试:1万条3列的数据,用了6秒钟左右导入
【注意,关于速度的测试数据,并没有精确测量,也没有多次测量取平均值】
 
注意,Navicat提供了导出和导入功能,既可以是sql形式,也可以是txt形式。对比后发现,导入速度相对更慢一些;而且,txt的导入比sql的导入快很多,可能差个几十倍都不止。
下面比较一下Navicat导出导入txt和上述select/load导入导出txt的速度对比。
表如下:ta_device_cad_ios有150万行数据;ta_device_cad_andr有641万行数据。导出是在正式服务器上进行,性能较好,导入是在测试服务器上进行,性能相对较弱,因此对于同一个表格,导入和导出的速度对比并不公平,重点关注两种方式的速度对比。
对于ios数据,Navicat导出耗时43s,导入耗时1079s;select/load导出耗时16s,导入耗时30s。后者速度快很多很多。
对于andr数据,Navicat每次导出的数据大小不同,耗时不同,行数不同,而且数据显示是16进制形式;导入时Navicat崩溃。个人猜测是表格太大,Navicat导出时进行了编码;在导入时要解码需要一次将所有数据读入,导致内存不足。
而是用select/load方式,导出耗时43s,导入耗时128s。
综上所述,使用select/load方式导数据,比Navicat自带的导出/导入向导,性能强很多。
 
 

MySQL6-数据库维护