前置条件
- 已使用TiUP部署DM集群:参考此前文章。
- 已添加使用DM-worker时所需的上下游数据库用户权限、以及各处理单元所需的用户权限:参考如下表格。
上游数据库 (MySQL/MariaDB) 用户必须拥有以下权限:
| 权限 | 作用域 |
|---|---|
| SELECT | Tables |
| RELOAD | Global |
| REPLICATION SLAVE | Global |
| REPLICATION CLIENT | Global |
下游数据库 (TiDB) 用户必须拥有以下权限:
| 权限 | 作用域 |
|---|---|
| SELECT | Tables |
| INSERT | Tables |
| UPDATE | Tables |
| DELETE | Tables |
| CREATE | Databases,tables |
| DROP | Databases,tables |
| ALTER | Tables |
| INDEX | Tables |
处理单元所需的最小权限:
| 处理单元 | 最小上游 (MySQL/MariaDB) 权限 | 最小下游 (TiDB) 权限 | 最小系统权限 |
|---|---|---|---|
| Relay log | REPLICATION SLAVE (读取 binlog)、REPLICATION CLIENT (show master status, show slave status) | 无 | 本地读/写磁盘 |
| Dump | SELECT、RELOAD(获取读锁将表数据刷到磁盘,进行一些操作后,再释放读锁对表进行解锁) | 无 | 本地写磁盘 |
| Load | 无 | SELECT(查询 checkpoint 历史)、CREATE(创建数据库或表)、DELETE(删除 checkpoint)、INSERT(插入 dump 数据) | 读/写本地文件 |
| Binlog replication | REPLICATION SLAVE(读 binlog)、REPLICATION CLIENT (show master status, show slave status) | SELECT(显示索引和列)、INSERT (DML)、UPDATE (DML)、DELETE (DML)、CREATE(创建数据库或表)、DROP(删除数据库或表)、ALTER(修改表)、INDEX(创建或删除索引) | 本地读/写磁盘 |
创建MySQL数据源
“小数据量”通常指MySQL 数据在 TB 级别以下。
如果是极小量数据(MB级别),还可以使用数据库连接工具的功能直接导。
一般而言,受到表结构索引数目等信息、硬件以及网络环境影响,迁移速率在 30~50GB/h 不等。
首先,新建 source1.yaml 文件,写入以下内容:
# 唯一命名,不可重复。
source-id: "mysql-01"
# DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是上游 MySQL 已开启 GTID 模式。若上游存在主从自动切换,则必须使用 GTID 模式。
enable-gtid: true
from:
host: "10.0.8.86" # 例如:172.16.10.81
user: "wenjie.wang"
password: "xxxxxx" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用
port: 3306
然后使用 tiup dmctl 将数据源配置加载到 DM 集群中:
tiup dmctl --master-addr ${advertise-addr} operate-source create source1.yaml
该命令中的参数描述如下:
参数 描述
- –master-addr dmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如:172.16.10.71:8261
- operate-source create 向 DM 集群加载数据源
我们测试环境是:
cd /home/tidb/.tiup/bin
tiup dmctl --master-addr 10.0.8.86:8261 operate-source create /data/tidb/source1.yaml
可以看到输出结果:
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 operate-source create /data/tidb/source1.yaml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-01",
"worker": "dm-10.0.8.86-8262"
}
]
}
创建迁移任务
新建 task1.yaml 文件
vim /data/tidb/task1.yaml
写入以下内容:
# 任务名,多个同时运行的任务不能重名。
name: "test01"
# 任务模式,可设为
# full:只进行全量数据迁移
# incremental: binlog 实时同步
# all: 全量 + binlog 迁移
task-mode: "all"
# 下游 TiDB 配置信息。
target-database:
host: "10.0.8.88" # 例如:172.16.10.83
port: 4000
user: "wenjie.wang"
password: "xxxxxx" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用
# 当前数据迁移任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
# 上游实例或者复制组 ID。
source-id: "mysql-01"
# 需要迁移的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `block-allow-list` 的配置。
block-allow-list: "listA"
# 黑白名单全局配置,各实例通过配置项名引用。
block-allow-list:
listA: # 名称
do-dbs: [pingcap", "test_collation"]
关于任务的更多配置项,可以参考 DM 任务完整配置文件介绍。
启动任务
在你启动数据迁移任务之前,建议使用 check-task 命令检查配置是否符合 DM 的配置要求,以避免后期报错。
tiup dmctl --master-addr ${advertise-addr} check-task task.yaml
我们测试环境是:
cd /home/tidb/.tiup/bin
tiup dmctl --master-addr 10.0.8.86:8261 check-task /data/tidb/task1.yaml
返回结果为:
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 check-task /data/tidb/task1.yaml
{
"result": true,
"msg": "pre-check is passed. "
}
使用 tiup dmctl 执行以下命令启动数据迁移任务。
tiup dmctl --master-addr ${advertise-addr} start-task task.yaml
该命令中的参数描述如下:
- –master-addr dmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如: 172.16.10.71:8261
- start-task 参数用于启动数据迁移任务
如果任务启动失败,可根据返回结果的提示进行配置变更后执行 start-task task.yaml 命令重新启动任务。遇到问题请参考故障及处理方法以及常见问题。
我们测试环境中执行:
tiup dmctl --master-addr 10.0.8.86:8261 start-task /data/tidb/task1.yaml
测试环境由于数据量少,很快完成迁移,返回结果为:
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 start-task /data/tidb/task1.yaml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-01",
"worker": "dm-10.0.8.86-8262"
}
],
"checkResult": "pre-check is passed. "
}
检查目标tidb数据,已全部同步过来,如果collation为utf8mb3,则迁移后会变为utf8_bin,而utf8mb4则不会变。
目标tidb会新增两个迁移相关的库:
- dm_meta
- lightning_task_info
查看任务状态
如需了解 DM 集群中是否存在正在运行的迁移任务及任务状态等信息,可使用 tiup dmctl 执行 query-status 命令进行查询:
tiup dmctl --master-addr ${advertise-addr} query-status ${task-name}
关于查询结果的详细解读,请参考查询状态。
监控任务与查看日志
(此步骤为非必要项。)
要查看迁移任务的历史状态以及更多的内部运行指标,可参考以下步骤。
如果使用 TiUP 部署 DM 集群时,正确部署了 Prometheus、Alertmanager 与 Grafana,则使用部署时填写的 IP 及端口进入 Grafana,选择 DM 的 Dashboard 查看 DM 相关监控项。
DM 在运行过程中,DM-worker、DM-master 及 dmctl 都会通过日志输出相关信息。各组件的日志目录如下:
- DM-master 日志目录:通过 DM-master 进程参数 --log-file设置。如果使用 TiUP 部署 DM,则日志目录默认位于 /dm-deploy/dm-master-8261/log/。
- DM-worker 日志目录:通过 DM-worker 进程参数 --log-file 设置。如果使用 TiUP 部署 DM,则日志目录默认位于 /dm-deploy/dm-worker-8262/log/。




