2010年11月29日星期一

使用maatkit来迁移MySQL数据库

   迁移MySQL一般会用两种方法:1、停掉数据库,直接拷贝数据文件。这种方法比较简单,合适用在迁移到更好的服务器上面,MySQL的版本没有大的变化。2、锁住数据库,将数据dump出来,再重新导入新的数据库。

   在第二种方法中,一般会用mysqldump来导出,用mysql来导入。这两个工具都是单线程的,所以在迁移表比较多的情况下,会影响速度。你可以使用Maatkit  里面的mk-parallel-dump和mk-parallel-restore来导出导入数据。这两个工具都是多线程,并且更好用。

    步骤如下:
  1. 锁住需要导出数据的数据库:flush tables with read lock;
  2. 导出数据: ./mk-parallel-dump -udeploy -p123 -h172.28.29.209 --databases  cloud --tables t_test --chunk-size 100000 --threads 8 --base-dir /data/dump_data  --charset binary --no-gzip   。其中的chunk-size 100000是指每次导出的记录数为10w,那么一个1000w的表,就会执行100次SQL语句,生成100个数据文件; threads 8是指用8个线程来导出数据,优先导出大表;charset binary指定用二进制来导出数据,可以避免乱码的问题。
  3. 在要导入的数据库上面修改允许接收的最大包大小为100M,防止导入SQL语句被这个限制住而报错:set global max_allowed_packet=104857600
  4. 导入数据:./mk-parallel-restore -udeploy -p123 -h172.28.28.90 --databases    cloud --fast-index  --threads 8   /sandata/cloud 。其中fast-index适用于innodb plugin和XtraDB,可以提高创建索引的速度(先插入数据,再创建索引。如果先创建索引,再插入数据,那么对于几千万表来说,后面的插入速度会很慢)。 
  5. 解锁原有数据库,max_allowed_packet改回正常值。迁移完成。 
    ps:把数据导入innodb plugin 或者XtraDB时,可能会报错errno: 1478。解释在这里:http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-compression-syntax-warnings.html,因为my.cnf里面指定了 innodb_strict_mode=1

没有评论: