在将数据迁移到 TiDB 过程中,通过使用 mydumper 和 loader 可以实现存量数据的整体迁移,之后的增量数据可以借助官方提供工具 syncer。其基本原理就是将 syncer 作为待同步数据的 MySQL 服务器的一个 slave,通过读取 binlog 实现和 master 的同步。
因为我们迁移的情况和官方文档示例的情况不太相同,因此也遇到一些坑,在此总结一下。
指定待同步的binlog
syncer 同步时需要一个用于指定 binlog pos 的 meta 文件,binlog 相关的信息可以从 loader 导出的文件 metadata
中看到
binlog-name = "mysql-bin.000700"
binlog-pos = 281874470
binlog-gtid = ""
metadata
文件内容一般是如下形式
Started dump at: 2018-12-24 17:26:37
SHOW MASTER STATUS:
Log: mysql-bin.000700
Pos: 281874470
GTID:
SHOW SLAVE STATUS:
Host: 10.x.1x.2xx
Log: mysql-bin.007363
Pos: 971282247
GTID:
Finished dump at: 2018-12-24 18:49:05
我们在同步过程中是将 syncer 连接了从库 db05 上,使用的是 master 的 binlog mysql-bin.000700,使用 slave 的 binlog 将无法正常同步。
数据库重命名
另外由于我们要同步的数据库发生了重命名,比如源数据库是 online_1
,现在在 TiDB 上重命名为 online_2
,这种情况在官方文档没有配置说明,正确的配置应该是下面这样,才能将 online_1
上的表同步到 ask_1
。注意 replicate-do-table
配置下面需要制定的是目的方数据库,配置为源数据库不能同步数据。另外路由表本是由于合并分库分表数据,这里用来迁移不同数据库甚至不同表名的数据。
[[replicate-do-table]]
db-name ="online_2"
tbl-name = "ask_1"
[[route-rules]]
pattern-schema = "online_1"
pattern-table = "ask_1"
target-schema = "online_2"
target-table = "ask_1"
同步完成之后就可以在monitor查看同步情况了