数据迁移
我们使用 mydumper
从 MySQL 导出数据,然后用 loader
将其导入到 TiDB 里面。
为了快速的迁移数据 (特别是数据量巨大的库), 可以参考下面建议
- mydumper 导出数据至少要拥有
SELECT
,RELOAD
,LOCK TABLES
权限 - 使用 mydumper 导出来的数据文件尽可能的小, 最好不要超过 64M, 可以设置参数 -F 64
- loader的 -t 参数可以根据 tikv 的实例个数以及负载进行评估调整,例如 3个 tikv 的场景, 此值可以设为 3 *(1 ~ n);当 tikv 负载过高,loader 以及 tidb 日志中出现大量
backoffer.maxSleep 15000ms is exceeded
可以适当调小该值,当 tikv 负载不是太高的时候,可以适当调大该值。
某次导入示例,以及相关的配置
- mydumper 导出后总数据量 214G,单表 8 列,20 亿行数据
- 集群拓扑
- TIKV * 12
- TIDB * 4
- PD * 3
- mydumper -F 设置为 16, loader -t 参数 64
结果:导入时间 11 小时左右,19.4 G/小时
从 MySQL 导出数据
我们使用 mydumper
从 MySQL 导出数据,如下:
上面,我们使用 -B test
表明是对 test
这个 database 操作,然后用 -T t1,t2
表明只导出 t1
,t2
两张表。
-t 16
表明使用 16 个线程去导出数据。-F 64
是将实际的 table 切分成多大的 chunk,这里就是 64MB 一个 chunk。
--skip-tz-utc
添加这个参数忽略掉 MySQL 与导数据的机器之间时区设置不一致的情况,禁止自动转换。
我们使用 loader
将之前导出的数据导入到 TiDB。Loader 的下载和具体的使用方法见 Loader 使用文档
./bin/loader -h 127.0.0.1 -u root -P 4000 -t 32 -d ./var/test
导入成功之后,我们可以用 MySQL 官方客户端进入 TiDB,查看:
mysql> show tables;
| Tables_in_test |
+----------------+
| t1 |
| t2 |
+----------------+
mysql> select * from t1;
+----+------+
| id | age |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
mysql> select * from t2;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
使用 syncer
增量导入数据
上面我们介绍了如何使用 mydumper
/loader
将 MySQL 的数据全量导入到 TiDB,但如果后续 MySQL 的数据有更新,我们仍然希望快速导入,使用全量的方式就不合适了。
TiDB 提供 syncer
工具能方便的将 MySQL 的数据增量的导入到 TiDB 里面。
syncer
属于 TiDB 企业版工具集,如何获取可以参考 下载 TiDB 企业版工具集。
下载 TiDB 企业版工具集 (Linux)
假设我们之前已经使用 mydumper
/loader
导入了 t1
和 两张表的一些数据,现在我们希望这两张表的任何更新,都是实时的同步到 TiDB 上面。
medadata 文件信息内容举例:
SHOW MASTER STATUS:
Log: mysql-bin.000003
Pos: 930143241
GTID:
Finished dump at: 2017-04-28 10:48:11
我们将 position 相关的信息保存到一个 syncer.meta
文件里面,用于 syncer
的同步:
# cat syncer.meta
binlog-name = "mysql-bin.000003"
binlog-pos = 930143241
binlog-gtid = "2bfabd22-fff7-11e6-97f7-f02fa73bcb01:1-23,61ccbb5d-c82d-11e6-ac2e-487b6bd31bf7:1-4"
注意:
syncer.meta
只需要第一次使用的时候配置,后续syncer
同步新的 binlog 之后会自动将其更新到最新的 position。注意: 如果使用 binlog position 同步则只需要配置 binlog-name binlog-pos; 使用 gtid 同步则需要设置 gtid,且启动 syncer 时带有
--enable-gtid
启动 syncer
启动 syncer 服务之前请详细阅读
syncer
的配置文件 config.toml
:
启动 syncer
:
./bin/syncer -config config.toml
2016/10/27 15:22:01 binlogsyncer.go:226: [info] begin to sync binlog from position (mysql-bin.000003, 1280)
2016/10/27 15:22:01 binlogsyncer.go:130: [info] register slave for master server 127.0.0.1:3306
2016/10/27 15:22:01 binlogsyncer.go:552: [info] rotate to (mysql-bin.000003, 1280)
2016/10/27 15:22:01 syncer.go:549: [info] rotate binlog to (mysql-bin.000003, 1280)
INSERT INTO t1 VALUES (4, 4), (5, 5);
登录到 TiDB 查看:
2017/06/08 01:18:51 syncer.go:934: [info] [syncer]total events = 15, total tps = 130, recent tps = 4,
master-binlog = (ON.000001, 11992), master-binlog-gtid=53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-74,
syncer-binlog = (ON.000001, 2504), syncer-binlog-gtid = 53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-17
2017/06/08 01:19:21 syncer.go:934: [info] [syncer]total events = 15, total tps = 191, recent tps = 2,
可以看到,使用 syncer
,我们就能自动的将 MySQL 的更新同步到 TiDB。