阿里云分布式数据库全量迁移

全量导入使用mydumper/loader全量导入数据

mydumper是一个更强大的数据迁移工具,具体可以参考https://github.com/maxbube/mydumper。

你可以使用mydumper从MySQL导出数据,然后用loader将其导入到阿里云分布式数据库里面。

注意:虽然阿里云分布式数据库也支持使用MySQL官方的mysqldump工具来进行数据的迁移工作,但相比于mydumper/loader,性能会慢很多,大量数据的迁移会花费很多时间,这里并不推荐。

mydumper/loader全量导入数据最佳实践

为了快速的迁移数据(特别是数据量巨大的库),可以参考以下建议:

  • mydumper导出数据至少要拥有SELECT,RELOAD,LOCKTABLES权限
  • 使用mydumper导出来的数据文件尽可能的小,最好不要超过64M,可以设置参数-F64
  • loader的-t参数可以根据tikv的阿里云数据库个数以及负载进行评估调整,例如3个tikv的场景,此值可以设为3(1~n);当tikv负载过高,loader以及tidb日志中出现大量backoffer.maxSleep15000msisexceeded可以适当调小该值,当tikv负载不是太高的时候,可以适当调大该值。

某次导入示例,以及相关的配置

  • mydumper导出后总数据量214G,单表8列,20亿行数据
  • 集群拓扑

    • TIKV12
    • TIDB4
    • PD3
  • mydumper-F设置为16,loader-t参数64

结果:导入时间11小时左右,19.4G/小时

从MySQL导出数据

使用mydumper从MySQL导出数据,如下:

./bin/mydumper-h127.0.0.1-P3306-uroot-t16-F64-Btest-Tt1,t2--skip-tz-utc-o./var/test

上面,使用-Btest表明是对test这个database操作,然后用-Tt1,t2表明只导出t1,t2两张表。

-t16表明使用16个线程去导出数据。-F64是将实际的table切分成多大的chunk,这里就是64MB一个chunk。

--skip-tz-utc添加这个参数忽略掉MySQL与导数据的机器之间时区设置不一致的情况,禁止自动转换。

注意:在阿里云等一些需要superprivilege的云上面,mydumper需要加上--no-locks参数,否则会提示没有权限操作。

向阿里云分布式数据库导入数据

注意:目前阿里云分布式数据库支持UTF8mb4字符编码,假设mydumper导出数据为latin1字符编码,请使用iconv-flatin1-tutf-8$file-o/data/imdbload/$basename命令转换,$file为已有文件,$basename为转换后文件。

注意:如果mydumper使用-m参数,会导出不带表结构的数据,这时loader无法导入数据。

使用loader将之前导出的数据导入到阿里云分布式数据库。Loader的下载和具体的使用方法见Loader使用文档

./bin/loader-h127.0.0.1-uroot-P4000-t32-d./var/test

导入成功之后,可以用MySQL官方客户端进入阿里云分布式数据库,查看:

mysql-h127.0.0.1-P4000-urootmysqlshowtables;+----------------+|Tables_in_test|+----------------+|t1||t2|+----------------+mysqlselectfromt1;+----+------+|id|age|+----+------+|1|1||2|2||3|3|+----+------+mysqlselectfromt2;+----+------+|id|name|+----+------+|1|a||2|b||3|c|+----+------+