MySQL数据库迁移到分布式数据库

数据迁移概述概述

详细介绍如何将MySQL的数据迁移到阿里云分布式数据库。

这里假定MySQL以及阿里云分布式数据库服务信息如下:

NameAddressPortUserPasswordMySQL127.0.0.13306root阿里云分布式数据库127.0.0.14000root

在这个数据迁移过程中,会用到下面四个工具:

  • checker检查schema能否被阿里云分布式数据库兼容
  • mydumper从MySQL导出数据
  • loader导入数据到阿里云分布式数据库
  • syncer增量同步MySQL数据到阿里云分布式数据库

两种迁移场景

  • 第一种场景:只全量导入历史数据(需要checker+mydumper+loader);
  • 第二种场景:全量导入历史数据后,通过增量的方式同步新的数据(需要checker+mydumper+loader+syncer)。该场景需要提前开启binlog且格式必须为ROW。

MySQL开启binlog

注意:只有上文提到的第二种场景才需要在dump数据之前先开启binlog

  • MySQL开启binlog功能,参考SettingtheReplicationMasterConfiguration
  • Binlog格式必须使用ROWformat,这也是MySQL5.7之后推荐的binlog格式,可以使用如下语句打开:

SETGLOBALbinlog_format=ROW;使用checker进行Schema检查

在迁移之前,可以使用阿里云分布式数据库的checker工具,来预先检查阿里云分布式数据库是否能支持需要迁移的tableschema。如果check某个tableschema失败,表明阿里云分布式数据库当前并不支持,不能对该table里面的数据进行迁移。checker包含在阿里云分布式数据库工具集里面,可以直接下载。

下载阿里云分布式数据库工具集(Linux)#下载tool压缩包wgethttp://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gzwgethttp://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256#检查文件完整性,返回ok则正确sha256sum-ctidb-enterprise-tools-latest-linux-amd64.sha256#解开压缩包tar-xzftidb-enterprise-tools-latest-linux-amd64.tar.gzcdtidb-enterprise-tools-latest-linux-amd64使用checker检查的一个示范

  • 在MySQL的testdatabase里面创建几张表,并插入数据:

USEtest;CREATETABLEt1(idINT,ageINT,PRIMARYKEY(id))ENGINE=InnoDB;CREATETABLEt2(idINT,nameVARCHAR(256),PRIMARYKEY(id))ENGINE=InnoDB;INSERTINTOt1VALUES(1,1),(2,2),(3,3);INSERTINTOt2VALUES(1,"a"),(2,"b"),(3,"c");

  • 使用checker检查testdatabase里面所有的table

./bin/checker-host127.0.0.1-port3306-userroottest2016/10/2713:11:49checker.go:48:[info]Checkingdatabasetest2016/10/2713:11:49main.go:37:[info]DatabaseDSN:root:@tcp(127.0.0.1:3306)/test?charset=utf82016/10/2713:11:49checker.go:63:[info]Checkingtablet12016/10/2713:11:49checker.go:69:[info]Checktablet1succ2016/10/2713:11:49checker.go:63:[info]Checkingtablet22016/10/2713:11:49checker.go:69:[info]Checktablet2succ

  • 使用checker检查testdatabase里面某一个table这里,假设只需要迁移tablet1。

./bin/checker-host127.0.0.1-port3306-userroottestt12016/10/2713:13:56checker.go:48:[info]Checkingdatabasetest2016/10/2713:13:56main.go:37:[info]DatabaseDSN:root:@tcp(127.0.0.1:3306)/test?charset=utf82016/10/2713:13:56checker.go:63:[info]Checkingtablet12016/10/2713:13:56checker.go:69:[info]Checktablet1succCheckdatabasesucc!一个无法迁移的table例子

在MySQL里面创建如下表:

CREATETABLEt_error(aINTNOTNULL,PRIMARYKEY(a))ENGINE=InnoDBTABLESPACEts1PARTITIONBYRANGE(a)PARTITIONS3(PARTITIONP1VALUESLESSTHAN(2),PARTITIONP2VALUESLESSTHAN(4)TABLESPACEts2,PARTITIONP3VALUESLESSTHAN(6)TABLESPACEts3);

使用checker进行检查,会报错,表明没法迁移t_error这张表。

./bin/checker-host127.0.0.1-port3306-userroottestt_error2017/08/0411:14:35checker.go:48:[info]Checkingdatabasetest2017/08/0411:14:35main.go:39:[info]DatabaseDSN:root:@tcp(127.0.0.1:3306)/test?charset=utf82017/08/0411:14:35checker.go:63:[info]Checkingtablet12017/08/0411:14:35checker.go:67:[error]Checktablet1failedwitherr:line3column29near"ENGINE=InnoDBDEFAULTCHARSET=latin1/!50100PARTITIONBYRANGE(a)(PARTITIONP1VALUESLESSTHAN(2)ENGINE=InnoDB,PARTITIONP2VALUESLESSTHAN(4)TABLESPACE=ts2ENGINE=InnoDB,PARTITIONP3VALUESLESSTHAN(6)TABLESPACE=ts3ENGINE=InnoDB)/"(totallength354)github.com/pingcap/tidb/parser/yy_parser.go:96:github.com/pingcap/tidb/parser/yy_parser.go:109:/home/jenkins/workspace/build_tidb_tools_master/go/src/github.com/pingcap/tidb-tools/checker/checker.go:122:parseCREATETABLE`t1`(`a`int(11)NOTNULL,PRIMARYKEY(`a`))/!50100TABLESPACEts1/ENGINE=InnoDBDEFAULTCHARSET=latin1/!50100PARTITIONBYRANGE(a)(PARTITIONP1VALUESLESSTHAN(2)ENGINE=InnoDB,PARTITIONP2VALUESLESSTHAN(4)TABLESPACE=ts2ENGINE=InnoDB,PARTITIONP3VALUESLESSTHAN(6)TABLESPACE=ts3ENGINE=InnoDB)/error/home/jenkins/workspace/build_tidb_tools_master/go/src/github.com/pingcap/tidb-tools/checker/checker.go:114:2017/08/0411:14:35main.go:83:[error]Checkdatabasetestwith1errorsand0warnings.