TiDB DM是一体化的数据迁移任务管理平台,本文简要介绍了DM的架构和原理,DM的使用和运维操作,并结合MySQL实例到TiDB迁移简单的使用场景进行测试验证。
1、TiDB Data Migration介绍
TiDB Data Migration (DM)是针对MySQL或MariaDB到TiDB的一体化数据迁移任务管理平台,DM通过解析binlog event将数据以SQL语句的形式迁移到TiDB中,可以完成全量数据迁移和增量数据复制。
1.1 DM架构
DM主要包括三个组件:DM-master、DM-worker和dmctl。
1.2 DM-worker处理单元
DM-worker负责执行具体的数据迁移任务,主要功能为注册为mysql或mariadb的slave节点,然后读取mysql或mariadb的binlog event并保存到本地为relay log,再将这些binlog数据解析为SQL语句应用到TiDB节点。DM-worker包括以下逻辑处理单元:
- Relay log:持久化保存从上游MySQL或MariaDB读取的binlog,并对binlog replication处理单元提供读取binlog event的功能
- Dump处理单元:从上游MySQL或MariaDB导出全量数据到本地磁盘
- Load处理单元:读取Dump处理单元的数据文件,然后加载到下游TiDB
- Binlog replication/sync处理单元:读取relay log处理单元的binlog event,将这些event转化为SQL语句,再将这些SQL语句应用到下游TiDB
1.3 DM迁移工具特性
1)Table Routing
Table Routing 是指将上游MySQL或MariaDB实例的某些表迁移到下游指定表的路由功能,可以用于分库分表的合并迁移。以下在分库分表合并场景中,将schema-pattern: “test_" 和 table-pattern: "t_” 的表的DML/DDL语句迁移到下游的 test.t中。
routes:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
target-schema: "test"
target-table: "t"
2)Block & Allow Table Lists
根据规则过滤或者只迁移上游数据库实例某些 database/table 的所有操作。
block-allow-list: # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
rule-1:
do-dbs: ["~^test.*"] # 以 ~ 字符开头,表示规则是正则表达式。
ignore-dbs: ["mysql"]
do-tables:
- db-name: "~^test.*"
tbl-name: "~^t.*"
- db-name: "test"
tbl-name: "t"
ignore-tables:
- db-name: "test"
tbl-name: "log"
- do-dbs:要迁移的库的白名单,类似于 MySQL 中的 replicate-do-db。
- ignore-dbs:要迁移的库的黑名单,类似于 MySQL 中的 replicate-ignore-db。
- do-tables:要迁移的表的白名单,类似于 MySQL 中的 replicate-do-table。
- ignore-tables:要迁移的表的黑名单,类似于 MySQL 中的 replicate-ignore-table。
3)Binlog event filter
Binlog event filter可以指定只迁移或者过滤掉某些schema/table的指定类型binlog,比如 INSERT、TRUNCATE TABLE。
filters:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table"]
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
- schema-pattern/table-pattern:对匹配上的上游MySQL/MariaDB实例的表的binlog events或者DDL SQL语句通过以下规则进行过滤。
- events:binlog events数组
- sql-pattern:用于过滤指定的DDL SQL语句,支持正则表达式匹配
其它功能特性还包括column mapping和online DDL工具支持,但由于使用限制较多,这里不再赘述,可参考官网相关部分内容深入了解。
2、DM集群部署
TIDB DM集群的部署可以使用TiUP在线以及离线方式,也可以使用Binary安装包的方式,这里主要介绍使用TiUP在线方式部署DM集群环境。
1)安装TiUP组件
- 执行如下命令安装TiUP工具:
[root@tango-centos01 ~]# curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
- 重新声明全局环境变量:
[root@tango-centos01 ~]# source .bash_profile
- 确认TiUP工具是否安装:
[root@tango-centos01 ~]# which tiup
/root/.tiup/bin/tiup
- 安装TiUP DM组件
[root@tango-centos01 ~]# tiup install dm
- 如果已经安装,则更新TiUP DM组件至最新版本:
tiup update --self && tiup update dm
预期输出 Update successfully! 字样。
2)编辑初始化配置文件
新建一个配置文件 topology.yaml,部署3个DM-master、3个DM-worker与1个监控组件:
---
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/usr/local/tidb/dm/deploy"
data_dir: "/usr/local/tidb/dm/data"
# arch: "amd64"
master_servers:
- host: 192.168.112.101
- host: 192.168.112.102
- host: 192.168.112.103
worker_servers:
- host: 192.168.112.101
- host: 192.168.112.102
- host: 192.168.112.103
monitoring_servers:
- host: 192.168.112.101
grafana_servers:
- host: 192.168.112.101
alertmanager_servers:
- host: 192.168.112.101
- 如果不需要确保DM集群高可用,则可只部署1个DM-master节点,且部署的DM-worker节点数量不少于上游待迁移的MySQL/MariaDB实例数。
- 如果需要确保DM集群高可用,则推荐部署3个DM-master节点,且部署的 DM-worker 节点数量大于上游待迁移的MySQL/MariaDB实例数。
3)执行部署命令
[root@tango-centos01 ~]# tiup dm deploy dm-test v2.0.1 ./topology.yaml --user root -p
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm deploy dm-test v2.0.1 ./topology.yaml --user root -p
Please confirm your topology:
Cluster type: dm
Cluster name: dm-test
Cluster version: v2.0.1
Type Host Ports OS/Arch Directories
---- ---- ----- ------- -----------
dm-master 192.168.112.101 8261/8291 linux/x86_64 /usr/local/tidb/dm/deploy/dm-master-8261,/usr/local/tidb/dm/data/dm-master-8261
dm-master 192.168.112.102 8261/8291 linux/x86_64 /usr/local/tidb/dm/deploy/dm-master-8261,/usr/local/tidb/dm/data/dm-master-8261
dm-master 192.168.112.103 8261/8291 linux/x86_64 /usr/local/tidb/dm/deploy/dm-master-8261,/usr/local/tidb/dm/data/dm-master-8261
dm-worker 192.168.112.101 8262 linux/x86_64 /usr/local/tidb/dm/deploy/dm-worker-8262,/usr/local/tidb/dm/data/dm-worker-8262
dm-worker 192.168.112.102 8262 linux/x86_64 /usr/local/tidb/dm/deploy/dm-worker-8262,/usr/local/tidb/dm/data/dm-worker-8262
dm-worker 192.168.112.103 8262 linux/x86_64 /usr/local/tidb/dm/deploy/dm-worker-8262,/usr/local/tidb/dm/data/dm-worker-8262
prometheus 192.168.112.101 9090 linux/x86_64 /usr/local/tidb/dm/deploy/prometheus-9090,/usr/local/tidb/dm/data/prometheus-9090
grafana 192.168.112.101 3000 linux/x86_64 /usr/local/tidb/dm/deploy/grafana-3000
alertmanager 192.168.112.101 9093/9094 linux/x86_64 /usr/local/tidb/dm/deploy/alertmanager-9093,/usr/local/tidb/dm/data/alertmanager-9093
Attention:
1. If the topology is not what you expected, check your yaml file.
2. Please confirm there is no port/directory conflicts in same host.
Do you want to continue? [y/N]: y
- 通过TiUP DM部署的集群名称为dm-test。
- 部署版本为${version},可以通过执行tiup list dm-master来查看TiUP支持的最新版本。
- 初始化配置文件为topology.yaml。
- –user root:通过root用户登录到目标主机完成集群部署,该用户需要有ssh到目标机器的权限,并且在目标机器有sudo权限。也可以用其他有ssh和sudo权限的用户完成部署。
- -p:交互式输入该用户的密码
预期日志结尾输出会有“Deployed cluster dm-test
successfully”关键词,表示部署成功。
4)查看TiUP管理的集群情况
tiup dm list
TiUP支持管理多个DM集群,该命令会输出当前通过TiUP DM管理的所有集群信息,包括集群名称、部署用户、版本、密钥信息等:
[root@tango-centos01 ~]# tiup dm list
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm list
Name User Version Path PrivateKey
---- ---- ------- ---- ----------
dm-test tidb v2.0.1 /root/.tiup/storage/dm/clusters/dm-test /root/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa
5)检查部署的DM集群情况
[root@tango-centos01 ~]# tiup dm display dm-test
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm display dm-test
Cluster type: dm
Cluster name: dm-test
Cluster version: v2.0.1
SSH type: builtin
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
192.168.112.101:9093 alertmanager 192.168.112.101 9093/9094 linux/x86_64 inactive /usr/local/tidb/dm/data/alertmanager-9093 /usr/local/tidb/dm/deploy/alertmanager-9093
192.168.112.101:8261 dm-master 192.168.112.101 8261/8291 linux/x86_64 Down /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.102:8261 dm-master 192.168.112.102 8261/8291 linux/x86_64 Down /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.103:8261 dm-master 192.168.112.103 8261/8291 linux/x86_64 Down /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.101:8262 dm-worker 192.168.112.101 8262 linux/x86_64 N/A /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.102:8262 dm-worker 192.168.112.102 8262 linux/x86_64 N/A /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.103:8262 dm-worker 192.168.112.103 8262 linux/x86_64 N/A /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.101:3000 grafana 192.168.112.101 3000 linux/x86_64 inactive - /usr/local/tidb/dm/deploy/grafana-3000
192.168.112.101:9090 prometheus 192.168.112.101 9090 linux/x86_64 inactive /usr/local/tidb/dm/data/prometheus-9090 /usr/local/tidb/dm/deploy/prometheus-9090
Total nodes: 9
预期输出包括dm-test集群中实例ID、角色、主机、监听端口和状态(由于还未启动,所以状态为Down/inactive)、目录信息。
6)启动集群
[root@tango-centos01 ~]# tiup dm start dm-test
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm start dm-test
Starting cluster dm-test...
+ [ Serial ] - SSHKeySet: privateKey=/root/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa, publicKey=/root/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa.pub
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.101
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.101
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.102
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.103
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.101
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.102
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.103
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.101
+ [Parallel] - UserSSH: user=tidb, host=192.168.112.101
+ [ Serial ] - StartCluster
Starting component dm-master
Starting instance dm-master 192.168.112.103:8261
Starting instance dm-master 192.168.112.101:8261
Starting instance dm-master 192.168.112.102:8261
Start dm-master 192.168.112.103:8261 success
Start dm-master 192.168.112.102:8261 success
Start dm-master 192.168.112.101:8261 success
Starting component dm-worker
Starting instance dm-worker 192.168.112.101:8262
Starting instance dm-worker 192.168.112.102:8262
Starting instance dm-worker 192.168.112.103:8262
Start dm-worker 192.168.112.102:8262 success
Start dm-worker 192.168.112.103:8262 success
Start dm-worker 192.168.112.101:8262 success
Starting component prometheus
Starting instance prometheus 192.168.112.101:9090
Start prometheus 192.168.112.101:9090 success
Starting component grafana
Starting instance grafana 192.168.112.101:3000
Start grafana 192.168.112.101:3000 success
Starting component alertmanager
Starting instance alertmanager 192.168.112.101:9093
Start alertmanager 192.168.112.101:9093 success
Started cluster `dm-test` successfully
预期结果输出“Started cluster dm-test
successfully”表示启动成功。
7)验证集群运行状态
[root@tango-centos01 ~]# tiup dm display dm-test
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm display dm-test
Cluster type: dm
Cluster name: dm-test
Cluster version: v2.0.1
SSH type: builtin
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
192.168.112.101:9093 alertmanager 192.168.112.101 9093/9094 linux/x86_64 Up /usr/local/tidb/dm/data/alertmanager-9093 /usr/local/tidb/dm/deploy/alertmanager-9093
192.168.112.101:8261 dm-master 192.168.112.101 8261/8291 linux/x86_64 Healthy /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.102:8261 dm-master 192.168.112.102 8261/8291 linux/x86_64 Healthy /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.103:8261 dm-master 192.168.112.103 8261/8291 linux/x86_64 Healthy|L /usr/local/tidb/dm/data/dm-master-8261 /usr/local/tidb/dm/deploy/dm-master-8261
192.168.112.101:8262 dm-worker 192.168.112.101 8262 linux/x86_64 Free /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.102:8262 dm-worker 192.168.112.102 8262 linux/x86_64 Free /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.103:8262 dm-worker 192.168.112.103 8262 linux/x86_64 Free /usr/local/tidb/dm/data/dm-worker-8262 /usr/local/tidb/dm/deploy/dm-worker-8262
192.168.112.101:3000 grafana 192.168.112.101 3000 linux/x86_64 Up - /usr/local/tidb/dm/deploy/grafana-3000
192.168.112.101:9090 prometheus 192.168.112.101 9090 linux/x86_64 Up /usr/local/tidb/dm/data/prometheus-9090 /usr/local/tidb/dm/deploy/prometheus-9090
在输出结果中,如果Status状态信息为Up,说明集群状态正常
3、DM运维操作
3.1 使用TiUP运维DM集群
1)查看集群列表
集群部署成功后,可以通过 tiup dm list 命令在集群列表中查看该集群:
tiup dm list
2)启动集群
集群部署成功后,可以执行以下命令启动该集群
tiup dm start dm-test
3)检查集群状态
如果想查看集群中每个组件的运行状态,使用tiup dm display命令,用法如下:
tiup dm display dm-test
Status列用Up或者Down表示该服务是否正常。对于DM-master组件,同时可能会带有|L表示该DM-master是 Leader, 对于DM-worker组件,Free表示当前DM-worker没有与上游绑定。
4)缩容节点
缩容即将指定的节点从集群中移除,并删除遗留的相关数据文件。缩容操作时,内部对DM-master、DM-worker组件的操作流程为:
- 停止组件进程
- 调用DM-master删除member的API
- 清除节点的相关数据文件
缩容命令的基本用法如下,它需要指定至少两个参数,一个是集群名字,另一个是节点ID。节点ID可以参考上一节使用tiup dm display命令获取。
tiup dm scale-in <cluster-name> -N <node-id>
比如想缩容192.168.112.103上的DM-worker节点(DM-master 的缩容类似),可以执行:
tiup dm scale-in dm-test -N 192.168.112.103:8262
5)扩容节点
扩容的内部逻辑与部署类似,TiUP DM组件会先保证节点的SSH连接,在目标节点上创建必要的目录,然后执行部署并且启动服务。例如,在集群 dm-test 中扩容一个 DM-worker 节点(DM-master 的扩容类似):
- 新建scale.yaml文件,添加新增的woker节点信息,文件中只写入扩容节点的描述信息,不要包含已存在的节点
---
worker_servers:
- host: 192.168.112.104
- 执行扩容操作。TiUP DM根据scale.yaml文件中声明的端口、目录等信息在集群中添加相应的节点:
tiup dm scale-out dm-test scale.yaml
执行完成之后可以通过tiup dm display dm-test命令检查扩容后的集群状态。
6)滚动升级
滚动升级过程中尽量保证对前端业务透明、无感知,其中对不同节点有不同的操作。可使用tiup dm upgrade命令来升级集群。例如,把集群升级到v2.0.1的命令为:
tiup dm upgrade dm-test v2.0.1
7)更新配置
如果想要动态更新组件的配置,TiUP DM 组件为每个集群保存了一份当前的配置,如果想要编辑这份配置,则执行 tiup dm edit-config 命令。例如:
tiup dm edit-config dm-test
此时的配置并没有应用到集群,如果想要让它生效,还需要执行:
tiup dm reload dm-test
该操作会将配置发送到目标机器,滚动重启集群,使配置生效。
8)更新组件
常规的升级集群可以使用 upgrade 命令,但是在某些场景下(例如 Debug),可能需要用一个临时的包替换正在运行的组件,此时可以用patch命令。例如,有一个DM-master的hotfix包放在/tmp/dm-master-hotfix.tar.gz,如果此时想要替换集群上的所有DM-master,则可以执行:
tiup dm patch dm-test /tmp/dm-master-hotfix.tar.gz -R dm-master
或者只替换其中一个DM-master:
tiup dm patch dm-test /tmp/dm--hotfix.tar.gz -N 192.168.112.101:8261
9)查看操作日志
操作日志的查看可以借助audit命令,其用法如下:
tiup dm audit [audit-id] [flags]
在不使用[audit-id] 参数时,该命令会显示执行的命令列表,如下:
[root@tango-centos01 ~]# tiup dm audit
Starting component `dm`: /root/.tiup/components/dm/v1.3.2/tiup-dm audit
ID Time Command
-- ---- -------
fyvRpzrqDXV 2021-02-23T22:41:23+08:00 /root/.tiup/components/dm/v1.3.2/tiup-dm display dm-test
fyvQZ6k5n3F 2021-02-23T22:35:06+08:00 /root/.tiup/components/dm/v1.3.2/tiup-dm start dm-test
fyvPWNdvsm7 2021-02-23T22:19:27+08:00 /root/.tiup/components/dm/v1.3.2/tiup-dm display dm-test
fyvPCb1Xwrk 2021-02-23T22:14:36+08:00 /root/.tiup/components/dm/v1.3.2/tiup-dm list
fyvGdcDzkvT 2021-02-23T20:24:20+08:00 /root/.tiup/components/dm/v1.3.2/tiup-dm deploy dm-test v2.0.1 ./topology.yaml --user root -p
第一列为audit-id,如果想看某个命令的执行日志,则传入这个audit-id:
tiup dm audit fyvQZ6k5n3F
10)在集群节点机器上执行命令
exec命令可以很方便地到集群的机器上执行命令,使用方式如下:
tiup dm exec <cluster-name> [flags]
例如,如果要到所有的DM节点上执行ls /tmp,则可以执行:
tiup dm exec dm-test --command='ls /tmp'
11)集群控制工具(dmctl)
TiUP集成了DM的控制工具dmctl,运行命令如下:
tiup dmctl [args]
3.2 DM任务管理
1)管理上游数据源
operate-source命令用于将数据源配置加载到DM集群中。
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 operate-source create ./source.toml
其中source.toml的配置参考如下:
source-id: "mysql-replica-01"
# 是否开启 GTID
enable-gtid: false
# 是否开启 relay log
enable-relay: false
relay-binlog-name: '' # 拉取上游 binlog 的起始文件名
relay-binlog-gtid: '' # 拉取上游 binlog 的起始 GTID
from:
host: "192.168.112.10"
port: 3306
user: "root"
password: "G26MfwrUEFXmZdXC8+G2CEAJjOpJZGMGa38=" # 推荐使用 dmctl 对上游数据库的用户密码加密之后的密码
参数解释
-
create:创建一个或多个上游的数据库源。创建多个数据源失败时,会尝试回滚到执行命令之前的状态
-
update:更新一个上游的数据库源
-
stop:停止一个或多个上游的数据库源。停止多个数据源失败时,可能有部分数据源已成功停止
-
show:显示已添加的数据源以及对应的DM-worker
-
config-file:指定source.yaml的文件路径,可传递多个文件路径
-
–print-sample-config:打印示例配置文件。该参数会忽视其余参数
-
返回结果示例
Starting component `dmctl`: /root/.tiup/components/dmctl/v2.0.1/dmctl/dmctl --master-addr 192.168.112.103:8261 operate-source create ./source.toml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.103-8262"
}
]
}
- 查看DM-master中生效参数
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 get-config source mysql-replica-01
{
"result": true,
"msg": "",
"cfg": "enable-gtid: false\nauto-fix-gtid: false\nrelay-dir: \"\"\nmeta-dir: \"\"\nflavor: mysql\ncharset: \"\"\nenable-relay: false\nrelay-binlog-name: \"\"\nrelay-binlog-gtid: \"\"\nsource-id: mysql-replica-01\nfrom:\n host: 192.168.112.10\n port: 3306\n user: root\n password: '******'\n max-allowed-packet: null\n session: {}\n security: null\npurge:\n interval: 3600\n expires: 0\n remain-space: 15\nchecker:\n check-enable: true\n backoff-rollback: 5m0s\n backoff-max: 5m0s\n check-interval: 5s\n backoff-min: 1s\n backoff-jitter: true\n backoff-factor: 2\nserver-id: 429559177\ntracer: {}\n"
}
2)配置实例前置检查
DM提供前置检查功能,通过check-task命令在数据迁移任务启动时提前检查上游MySQL实例配置中的可能错误。检查内容包括以下:
- 数据库版本:5.5 < MySQL 版本 < 8.0
- 数据库配置:是否设置server_id
- MySQL binlog配置:binlog是否开启;binlog_format=row;binlog_row_image=FULL
- 上游MySQL实例用户的权限
- 上游MySQL表结构兼容性:TiDB不支持外键;字符集的兼容性
- 上游MySQL分库分表的一致性:表结构是否一致;自增主键冲突检查
DM会根据任务类型进行相应检查,可以在任务配置文件中使用使用 ignore-checking-items 配置关闭相关检查项,ALL表示关闭所有检查项。
{
"result": false,
"msg": "[code=26005:class=dm-master:scope=internal:level=medium], Message: fail to check synchronization configuration with type: check was failed, please see detail
detail: {
"results": [
{
"id": 1,
"name": "mysql_server_id",
"desc": "check whether mysql server_id has been greater than 0",
"state": "fail",
"errorMsg": "server_id is 0",
"instruction": "please set server_id greater than 0",
"extra": "address of db instance - 192.168.112.10:3306"
},
{
"id": 3,
"name": "mysql_binlog_format",
"desc": "check whether mysql binlog_format is ROW",
"state": "fail",
"errorMsg": "binlog_format is STATEMENT, and should be ROW",
"instruction": "please execute 'set global binlog_format=ROW;'",
"extra": "address of db instance - 192.168.112.10:3306"
},
{
"id": 2,
"name": "mysql_binlog_enable",
"desc": "check whether mysql binlog is enabled",
"state": "fail",
"errorMsg": "log_bin is OFF, and should be ON",
"instruction": "ref document: https://dev.mysql.com/doc/refman/5.7/en/replication-howto-masterbaseconfig.html",
"extra": "address of db instance - 192.168.112.10:3306"
}
],
"summary": {
"passed": false,
"total": 8,
"successful": 5,
"failed": 3,
"warning": 0
}
}",
"sources": [
]
}
3)创建数据迁移任务
start-task命令用于创建数据迁移任务
start-task [ -s "mysql-replica-01"] ./task.yaml
- -s:指定在特定的一个MySQL源上执行task.yaml。如果设置,则只启动指定任务在该MySQL源上的子任务
- config-file:指定task.yaml的文件路径
- remove-meta:如果设置,则在启动指定任务时会移除该任务之前存在的metadata
输出结果如下:
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
4)查询状态
DM query-status命令可以查询结果、任务状态和子任务状态
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 query-status
{
"result": true, # 查询是否成功
"msg": "", # 查询失败原因描述
"tasks": [ # 迁移 task 列表
{
"taskName": "test", # 任务名称
"taskStatus": "Running", # 任务运行状态
"sources": [ # 该任务的上游 MySQL 列表
"mysql-replica-01"
]
}
]
}
首先使用query-status查看各个task的运行状态是否正常。如果发现其中某一task状态有问题,通过query-status <出错任务的 taskName>来得到更详细的错误信息。
- 子任务之间状态转换如下:
- New:初始状态;如果子任务没有发生错误,状态切换为Running,否则切换为Paused
- Running:正常运行状态
- Paused:暂停状态;子任务发生错误,状态切换为Paused;子任务为Running状态下执行pause-task命令,任务状态会切换为Paused,这种情况可以使用resume-task命令恢复任务
- Stopped:停止状态;子任务为Running或Paused状态下执行stop-task命令,任务状态会切换为Stopped,这种情况不可使用resume-task命令恢复任务
- Finished:任务完成状态;只有 task-mode 为 full 的任务正常完成后,任务才会切换为该状态。
5)暂停任务
DM pause-task命令用于暂停数据迁移任务:
pause-task [-s "mysql-replica-01"] task-name
输出如下:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 pause-task test
{
"op": "Pause",
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
6)恢复任务
DM resume-task命令用于恢复处于Paused状态的数据迁移任务,通常用于故障后的手动恢复迁移任务。
resume-task [-s "mysql-replica-01"] task-name
输出结果如下:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 resume-task test
{
"op": "Resume",
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
7)停止任务
stop-task命令用于停止数据迁移任务
stop-task [-s "mysql-replica-01"] task-name
输出结果如下:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 stop-task test
{
"op": "Stop",
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
- pause-task与stop-task的区别如下:
- 使用pause-task仅暂停迁移任务的执行,但仍然会在内存中保留任务的状态信息等,且可通过query-status进行查询;使用stop-task会停止迁移任务的执行,并移除内存中与该任务相关的信息,且不可再通过query-status进行查询,但不会移除已经写入到下游数据库中的数据以及其中的checkpoint等dm_meta信息。
- 使用pause-task暂停迁移任务期间,由于任务本身仍然存在,因此不能再启动同名的新任务,且会阻止对该任务所需relay log的清理;使用stop-task停止任务后,由于任务不再存在,因此可以再启动同名的新任务,且不会阻止对relay log的清理。
- pause-task一般用于临时暂停迁移任务以排查问题等;stop-task一般用于永久删除迁移任务或通过与start-task配合以更新配置信息。
8)处理出错的DDL语句
在迁移过程中,如果上游执行了TiDB不支持的DDL语句并迁移到了DM,造成迁移任务的中断,可以通过handle-error命令来处理错误的DDL语句。
- 使用 handle-error skip 跳过当前错误的 DDL 语句
- 迁移中断执行替代操作handle-error test replace
3.3 管理迁移表的表结构
DM迁移数据表时对表结构会进行以下处理
- 对于全量导出与导入,DM直接导出当前时刻上游的表结构到 SQL 格式的文件中,并将该表结构直接应用到下游。
- 对于增量复制,在整个数据链路中则包含以下几类可能相同或不同的表结构。
- 上游当前时刻的表结构(记为 schema-U)。
- 当前DM正在消费的binlog event的表结构(记为schema-B,其对应于上游某个历史时刻的表结构)。
- DM内部(schema tracker组件)当前维护的表结构(记为schema-I)。
- 下游TiDB集群中的表结构(记为schema-D)。
当上游执行DDL变更表结构后,schema-U即会发生变更;DM通过将该DDL应用于内部的schema tracker组件及下游TiDB,会先后更新schema-I、schema-D以与schema-U保持一致,因而随后能正常消费binlog中在DDL之后对应表结构为schema-B的binlog event。即当DDL被复制成功后,仍能保持schema-U、schema-B、schema-I及schema-D的一致。
1)获取表结构
假设要获取 test任务对应于 mysql-replica-01 MySQL源的tidbdm
.t1
表的表结构,则执行如下命令,注task不能为running状态,否则会失败:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 operate-schema get -s mysql-replica-01 test -d tidbdm -t t1
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "CREATE TABLE `t1` ( `id` int(11) NOT NULL, `uid` int(11) DEFAULT NULL, `name` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
2)设置表结构
假设要设置 test 任务对应于 mysql-replica-01 MySQL 源的 tidbdm
.t2
表的表结构为
CREATE TABLE `t2` (
`c1` int(11) NOT NULL,
`c2` varchar(11) DEFAULT NULL,
PRIMARY KEY (`c1`)
)
则将上述 CREATE TABLE 语句保存为文件(如 tidbdm.t2-schema.sql)后执行如下命令:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 operate-schema set -s mysql-replica-01 test -d tidbdm -t t2 tidbdm.t2-schema.sql
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
3)删除表结构
注:删除DM内部维护的表结构后,如果后续有该表的DDL/DML需要复制到下游,则DM会依次尝试从checkpoin表里 table_info字段、乐观shard DDL协调中的元信息以及下游TiDB中对应的该表获取表结构。
假设要删除test任务对应于mysql-replica-01 MySQL源的tidbdm
.t2
表的表结构,则执行如下命令:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 operate-schema remove -s mysql-replica-01 test -d tidbdm -t t2
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
4、DM应用场景
4.1 将MySQL数据迁移到下游TiDB集群
1)测试环境配置
实例 | 服务器地址 | 端口 |
---|---|---|
MySQL | 192.168.112.10 | 3306 |
TiDB | 192.168.112.101 | 4000 |
DM-master | 192.168.112.103 | 8261 |
2)运行上游MySQL并准备数据
[root@tango-01 /]# service mysql start
Starting MySQL........ SUCCESS!
[root@tango-01 /]# service mysql status
SUCCESS! MySQL running (9155)
[root@tango-01 mysql]# ./bin/mysql -uroot -p
mysql> create database tidbdm;
Query OK, 1 row affected (0.13 sec)
mysql> use tidbdm;
Database changed
mysql> create table t1 ( id int,uid int,name varchar(100), primary key(id));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1 (id,uid,name) values(1,10001,'Zhang San');
Query OK, 1 row affected (0.05 sec)
mysql>
建表需创建primary key,否则提示错误:
"msg": "[code=26005:class=dm-master:scope=internal:level=medium], Message: fail to check synchronization configuration with type: check was failed, please see detail
detail: {
"results": [
{
"id": 7,
"name": "table structure compatibility check",
"desc": "check compatibility of table structure",
"state": "fail",
"errorMsg": "********** table `tidbdm`.`t1` **********\nstatement: CREATE TABLE `t1` (\n `id` int(11) DEFAULT NULL,\n `uid` int(11) DEFAULT NULL,\n `name` varchar(100) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4\n---------- error messages ----------\ninformation: primary/unique key does not exist\ninstruction: please set primary/unique key for the table\n\n",
"instruction": "",
"extra": "address of db instance - 192.168.112.10:3306"
}
3)运行下游TiDB
[root@tango-01 ~]# tiup cluster start tidb-test
[root@tango-01 mysql]# ./bin/mysql -uroot -h192.168.112.101 -P4000
mysql> create database dmtest;
Query OK, 0 rows affected (1.04 sec)
mysql> use dmtest;
Database changed
mysql> create table dmt1 ( id int,uid int,name varchar(100),primary key(id));
Query OK, 0 rows affected (1.54 sec)
4)创建配置任务
- 迁移任务配置task.yaml
---
name: test
task-mode: all
shard-mode: "pessimistic"
target-database:
host: "192.168.112.101"
port: 4000
user: "root"
password: "" # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
mysql-instances:
- source-id: "mysql-replica-01"
block-allow-list: "instance" # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
route-rules: ["route-rules-table", "route-rules-schema"]
mydumper-thread: 4
loader-thread: 16
syncer-thread: 16
block-allow-list: # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
instance:
do-dbs: ["tidbdm"]
do-tables:
- db-name: "tidbdm"
tbl-name: "t1"
routes:
route-rules-table:
schema-pattern: tidbdm
table-pattern: t1
target-schema: dmtest
target-table: dmt1
route-rules-schema:
schema-pattern: tidbdm
target-schema: dmtest
- 使用dmctl创建数据迁移任务
tiup dmctl --master-addr 192.168.112.103:8261 start-task ./task.yaml
输出结果如下:
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 start-task ./task.yaml
Starting component `dmctl`: /root/.tiup/components/dmctl/v2.0.1/dmctl/dmctl --master-addr 192.168.112.103:8261 start-task ./task.yaml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262"
}
]
}
[root@tango-centos01 ~]# tiup dmctl --master-addr 192.168.112.103:8261 query-status test
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"sourceStatus": {
"source": "mysql-replica-01",
"worker": "dm-192.168.112.102-8262",
"result": null,
"relayStatus": null
},
"subTaskStatus": [
{
"name": "test",
"stage": "Running",
"unit": "Sync",
"result": null,
"unresolvedDDLLockID": "",
"sync": {
"totalEvents": "2",
"totalTps": "0",
"recentTps": "0",
"masterBinlog": "(mysql-bin.000001, 1886)",
"masterBinlogGtid": "",
"syncerBinlog": "(mysql-bin.000001, 1464)",
"syncerBinlogGtid": "",
"blockingDDLs": [
],
"unresolvedGroups": [
],
"synced": false,
"binlogType": "remote"
}
}
]
}
]
}
- 修改上游MySQL中表的数据,确认下游TiDB中数据已经更新
mysql> use dmtest;
mysql> select * from dmt1;
+----+-------+-----------+
| id | uid | name |
+----+-------+-----------+
| 1 | 10001 | Zhang San |
| 2 | 10002 | Zhang San |
+----+-------+-----------+
2 rows in set (0.00 sec)
在grafana监控页面能看到DM任务的性能情况:
至此,使用TiDB DM工具完成了MySQL实例到TiDB数据库的数据迁移。
参考资料:
- https://docs.pingcap.com/zh/tidb-data-migration/stable
转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/118719385
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!