TiDB 的数据迁移工具现已开源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TiDB 的数据迁移工具现已开源相关的知识,希望对你有一定的参考价值。
参考技术A TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库,支持包括传统 RDBMS 和 NoSQL 的特性。现已将 DM(data migration platform,该数据迁移工具)开源。该数据迁移工具遵循 Apache-2.0 开源协议,允许用户自由地使用及修改。
据介绍,DM (Data Migration) 是一体化数据同步任务管理平台,支持从 mysql/MariaDB 到 TiDB 的数据迁移、全量备份和 MariaDB/MySQL binlog 增量同步,有助于减少操作成本和简化错误处理流程。架构图如下所示:
从架构图可以看到,DM 包括三大组件:DM-master、DM-worker 和 dmctl。其中,DM-master 管理和调度数据同步任务的操作、DM-worker 执行特定的数据同步任务、dmctl 则是控制 DM 集群的命令行工具。更详细的组件功能介绍,可以查阅官方文档。
TIDB数据迁移
使用 mydumper/loader 全量导出导入数据
将 MySQL 的数据迁移到 TiDB,TIDB完全兼容 MySQL 协议和生态,迁移便捷
使用官方提供的迁移工具
注:工具可以下载安装在两款数据库的任何一端,我这边是起了另一台机器,因为不仅要全量导出导入,还需要使用syncer工具不停机的数据同步
# 下载 tool 压缩包
wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz
wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256
# 检查文件完整性,返回 ok 则正确
sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256
# 解开压缩包
tar xzf tidb-enterprise-tools-latest-linux-amd64.tar.gz
cd tidb-enterprise-tools-latest-linux-amd64
从 MySQL 导出数据
注:因为我们这边的MySQL是阿里云的RDS,因此需要ping一下内网地址才能得到IP地址
使用 mydumper 从 MySQL 导出数据,如下:
./bin/mydumper -h 172.16.93.68 -P 3306 -u root -t 16 -F 64 -B 510CTO --skip-tz-utc -o /var/test
-
使用 -B 510CTO 这个 database 操作,用 -T t1,t2 表明只导出 t1,t2 两张表。
- -t 16 表明使用 16 个线程去导出数据。-F 64 是将实际的 table 切分成多大的 chunk,这里就是 64MB 一个 chunk。
- 可以了解下 mydumper 的参数配置
向 TiDB 导入数据
使用 loader 将之前导出的数据导入到 TiDB
./bin/loader -h 172.16.100.129 -u root -P 4000 -t 32 -d /var/test
导入成功之后,我们可以用 MySQL 官方客户端进入 TiDB,查看:
mysql -h 172.16.100.129 -P4000 -uroot
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 增量导入数据
获取同步 position
mydumper 导出的数据目录里面有一个 metadata 文件,里面就包含了我们所需的 position 信息。
[[email protected] ~]# cat /var/test/metadata
Started dump at: 2018-09-09 10:48:10
SHOW MASTER STATUS:
Log: mysql-bin.000003
Pos: 930143241
GTID:
Finished dump at: 2018-09-09 10:48:11
我们将 position 相关的信息保存到一个 syncer.meta 文件里面,用于 syncer 的同步:
[[email protected] /]# vi syncer.meta
binlog-name = "mysql-bin.000003"
binlog-pos = 930143241
binlog-gtid =
注意:syncer.meta 只需要第一次使用的时候配置,后续 syncer 同步新的 binlog 之后会自动将其更新到最新的 position。
设置 syncer 参数
[[email protected] tidb-enterprise-tools-latest-linux-amd64]# vi config.toml
log-level = "info"
server-id = 101
## meta 文件地址
meta = "./syncer.meta"
worker-count = 16
batch = 10
## pprof 调试地址, Prometheus 也可以通过该地址拉取 syncer metrics
## 将 127.0.0.1 修改为相应主机 IP 地址
status-addr = "127.0.0.1:10086"
## 跳过 DDL 或者其他语句,格式为 **前缀完全匹配**,如: `DROP TABLE ABC`,则至少需要填入`DROP TABLE`.
# skip-sqls = ["ALTER USER", "CREATE USER"]
## 在使用 route-rules 功能后,
## replicate-do-db & replicate-ignore-db 匹配合表之后(target-schema & target-table )数值
## 优先级关系: replicate-do-db --> replicate-do-table --> replicate-ignore-db --> replicate-ignore-table
## 指定要同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
#replicate-do-db = ["~^b.*","s1"]
## 指定要同步的 db.table 表
## db-name 与 tbl-name 不支持 `db-name ="dbname,dbname2"` 格式
#[[replicate-do-table]]
#db-name ="dbname"
#tbl-name = "table-name"
#[[replicate-do-table]]
#db-name ="dbname1"
#tbl-name = "table-name1"
## 指定要同步的 db.table 表;支持正则匹配,表达式语句必须以 `~` 开始
#[[replicate-do-table]]
#db-name ="test"
#tbl-name = "~^a.*"
## 指定**忽略**同步数据库;支持正则匹配,表达式语句必须以 `~` 开始
#replicate-ignore-db = ["~^b.*","s1"]
## 指定**忽略**同步数据库
## db-name & tbl-name 不支持 `db-name ="dbname,dbname2"` 语句格式
#[[replicate-ignore-table]]
#db-name = "your_db"
#tbl-name = "your_table"
## 指定要**忽略**同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
#[[replicate-ignore-table]]
#db-name ="test"
#tbl-name = "~^a.*"
# sharding 同步规则,采用 wildcharacter
# 1. 星号字符 (*) 可以匹配零个或者多个字符,
# 例子, doc* 匹配 doc 和 document, 但是和 dodo 不匹配;
# 星号只能放在 pattern 结尾,并且一个 pattern 中只能有一个
# 2. 问号字符 (?) 匹配任一一个字符
#[[route-rules]]
#pattern-schema = "route_*"
#pattern-table = "abc_*"
#target-schema = "route"
#target-table = "abc"
#[[route-rules]]
#pattern-schema = "route_*"
#pattern-table = "xyz_*"
#target-schema = "route"
#target-table = "xyz"
[from]
host = "172.16.93.68"
user = "root"
password = "passwd"
port = 3306
[to]
host = "172.16.100.12"
user = "root"
password = ""
port = 4000
启动 syncer:
注:可以直接放在后台运行
./bin/syncer -config config.toml
2018/09/09 15:22:01 binlogsyncer.go:552: [info] rotate to (mysql-bin.000003, 1280)
2018/09/09 15:22:01 syncer.go:549: [info] rotate binlog to (mysql-bin.000003, 1280)
注:
保障机器不停机运行而且任务不能结束
在 MySQL 插入新的数据,然后登录TIDB查看,syncer 每隔 30s 会输出当前的同步统计
以上是关于TiDB 的数据迁移工具现已开源的主要内容,如果未能解决你的问题,请参考以下文章
TIDB - 使用TiDB Lightning 迁移Mysql数据至TIDB中
DM 分库分表 DDL “悲观协调” 模式介绍丨TiDB 工具分享
Facebook 开源 Golang 实体框架 Ent 现已支持 TiDB