数据库系列之TiDB Data Migration工具

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包括以下逻辑处理单元:

  1. Relay log:持久化保存从上游MySQL或MariaDB读取的binlog,并对binlog replication处理单元提供读取binlog event的功能
  2. Dump处理单元:从上游MySQL或MariaDB导出全量数据到本地磁盘
  3. Load处理单元:读取Dump处理单元的数据文件,然后加载到下游TiDB
  4. 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)测试环境配置

实例服务器地址端口
MySQL192.168.112.103306
TiDB192.168.112.1014000
DM-master192.168.112.1038261

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数据库的数据迁移。


参考资料:

  1. https://docs.pingcap.com/zh/tidb-data-migration/stable

转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/118719385
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值