数据迁移概述概述
详细介绍如何将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.