TiDB-301课程中DM数据迁移实验练习

TiDB Data Migration(DM)

概述

着手部署一个 Data Migration(DM) 集群后,将MySQL数据同步到已有的TiDB中。

实验环境说明

组件 IP 端口
DM集群:V5.4.0
dm-master 192.168.10.217 8261/8291
dm-worker1 192.168.10.218 8262
dm-worker2 192.168.10.219 8262
上游MySQL-V5.7.36 192.168.10.214 3308
TiDB 集群:V5.4.0
tidb 192.168.10.214 4000/10080
tidb 192.168.10.215
tidb 192.168.10.216
pd 192.168.10.214
pd 192.168.10.215
pd 192.168.10.216
tikv 192.168.10.210 20160/20180
tikv 192.168.10.211 20160/20180
tikv 192.168.10.212 20160/20180

任务内容

  1. 使用tiup工具部署一个DM集群
  2. 将MySQL中的数据表同步到TiDB

详细过程

任务1:部署DM集群

检查dm组件软件版本信息
tiup list dm-master
安装dm组件
tiup install dm dmctl
更新组件到最新版本(可选)
tiup update --self && tiup update dm
准备部署拓扑结构配置文件
生成模板文件
tiup dm template > topology.yaml
编辑拓扑配置文件
# The topology template is used deploy a minimal DM cluster, which suitable
# for scenarios with only three machinescontains. The minimal cluster contains
# - 3 master nodes
# - 3 worker nodes
# You can change the hosts according your environment
---
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/ups/app/tidb/tidm"
  data_dir: "/ups/data/tidb/dmdata"
  # arch: "amd64"

master_servers:
  - host: 192.168.10.217

worker_servers:
  - host: 192.168.10.218
  - host: 192.168.10.219

monitoring_servers:
  - host: 192.168.10.219

grafana_servers:
  - host: 192.168.10.219

alertmanager_servers:
  - host: 192.168.10.219

部署集群
tiup dm deploy tidm v5.4.0 ./dm_topo.yaml --user tidb -y
检查集群状态
tiup dm display tidm
启动集群
tiup dm start tidm

任务2:同步MySQL数据到TiDB

上游MySQL端配置

为 dm-worker 组件创建连接MySQL数据库用户账号并授权;初始化实验数据用于全量数据同步测试

开通账号权限
create user 'syncer'@'192.168.10.218' identified by 'syncer';
create user 'syncer'@'192.168.10.219' identified by 'syncer';

GRANT RELOAD, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'syncer'@'192.168.10.218';
GRANT RELOAD, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'syncer'@'192.168.10.219';

GRANT SELECT ON *.* TO 'syncer'@'192.168.10.218';
GRANT SELECT ON *.* TO 'syncer'@'192.168.10.219';
实验数据
cat > mydbinit.sql <<-'EOF'
create database user;
use user;
create table information(id int primary key, info varchar(64));
create table trace(id int primary key, content varchar(64));

insert into information(id, info) values(1, 'andy'),(2, 'candy');
insert into trace(id, content) values(1,'error');
commit;

create database store;
use store;
create table store_bj(id int primary key, pname varchar(64));
create table store_tj(id int primary key, pname varchar(64));
create table store_sh(id int primary key, pname varchar(64));
-- create table store_suzhou(id int primary key, pname varchar(64));
create table store_sz(id int primary key, pname varchar(64));

insert into store_bj values(1,'book');
insert into store_tj values(1,'cup');
insert into store_sh values(1,'bike');
insert into store_sz values(1,'hat');
commit;

# 实验原题
create database salesdb;
use salesdb;  -- 分库合并到tidb中 salesdb
create table sales(id int primary key, pname varchar(20), cnt int);
-- 3308 库
insert into sales values(1, 'book', 100);

-- 3309 库
insert into sales values(2, 'cup', 200);
-- insert into sales values(3,'shose',120);

# 下面单库中分表合并

create database salesdb;
use salesdb;
create table sales_01(id int primary key, pname varchar(20), cnt int);
-- 3308 库
insert into sales_01 values(1, 'book', 100);

create table sales_02(id int primary key, pname varchar(20), cnt int);
-- 3308 库
insert into sales_02 values(2, 'cup', 200);


create database log;
use log;
create table messages(id int primary key, msg varchar(64));
insert into messages values(1, 'hello');
-- insert into messages values(2,'world');

EOF

# 导入数据
mysql -uroot -proot -h2db4 -P3308 < mydbinit.sql

# 清理binlog
show binary logs;
flush logs;

PURGE BINARY LOGS TO 'blg.000008';
TiDB 端数据库配置

为 dm-worker/dm-master 组件创建连接TiDB数据库用户账号并授权

开通账号权限
create user 'syncer'@'192.168.10.218' identified by 'syncer';
create user 'syncer'@'192.168.10.219' identified by 'syncer';
create user 'syncer'@'192.168.10.217' identified by 'syncer';

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX  ON *.* TO 'syncer'@'192.168.10.218';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX  ON *.* TO 'syncer'@'192.168.10.219';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX  ON *.* TO 'syncer'@'192.168.10.217';

flush privileges;
DM 集群配置
配置数据源
  • 生成加密密码

    # 加密
    tiup dmctl encrypt 'syncer'
    # 解密
    tiup dmctl decrypt 'nMbrwS34wTZo7cBYUYRMqkC5lsgEF04='
    
  • 数据源配置文件(mytsk01.yaml )

# MySQL Configuration.

source-id: "mysql-replica"

# DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是在上游 MySQL 已开启 GTID 模式。
enable-gtid: false

from:
  host: "192.168.10.214"
  user: "syncer"
  password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="
  port: 3308
加载数据源到DM中
tiup dmctl --master-addr=192.168.10.217:8261 operate-source create mytsk01.yaml 
  • operate-source 用法:

    operate-source create/update/stop/show upstream MySQL/MariaDB source

  • Usage:
    dmctl operate-source [config-file ...] [--print-sample-config] [flags]

检查已加载数据源
tiup dmctl --master-addr=192.168.10.217:8261 get-config source mysql-replica
查看数据源和 dm-worker 的对应关系
tiup dmctl --master-addr=192.168.10.217:8261 operate-source show

image-20220218144504541

迁移任务配置
定义数据迁移任务需要的数据源
# 任务规则配置文件: myrule01.yaml
# 任务名称,,需要全局唯一
name: "my2tidb-task01"
# 全量+增量 (all) 迁移模式
task-mode: "all"

## ******** 数据源配置 **********
mysql-instances:
  #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
  #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
  - source-id: "mysql-replica"
定义目标TiDB 集群
# 任务规则配置文件: myrule01.yaml
# 任务名称,,需要全局唯一
name: "my2tidb-task01"
# 全量+增量 (all) 迁移模式
task-mode: "all"

## ******** 目标 TiDB 配置 **********
target-database:       # 目标 TiDB 配置
  host: "192.168.10.215"
  port: 4000
  user: "syncer"
  password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
  
## ******** 数据源配置 **********
mysql-instances:
  #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
  #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
  - source-id: "mysql-replica"
  
配置任务规则文件
  • MySQL 数据库中的 user 库中所有的表同步到 TiDB 数据库的 user_north (vi myrule01.yaml)

    # 任务规则配置文件: myrule01.yaml
    # 任务名称,,需要全局唯一
    name: "my2tidb-task01"
    # 全量+增量 (all) 迁移模式
    task-mode: "all"
    
    ## ******** 目标 TiDB 配置 **********
    target-database:       # 目标 TiDB 配置
      host: "192.168.10.215"
      port: 4000
      user: "syncer"
      password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    
    ## ******** 功能配置集 **********
    routes:                           # 上游和下游表之间的路由 table routing 规则集
      route-rule-user-01:                   # 配置名称
        schema-pattern: "user"
        target-schema: "user_north"
    
    block-allow-list:                    # 定义数据源迁移表的过滤规则
      bw-rule-user-01:                         # 规则名称
        do-dbs: ["user"]     # 迁移哪些库
        ignore-dbs: ["mysql", "mydb", "information_schema", "performance_schema", "sys"] # 忽略哪些库
    
    ## ******** 数据源配置 **********
    # ----------- 实例配置 -----------
    mysql-instances:
      #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      - source-id: "mysql-replica"   
        route-rules: ["route-rule-user-01"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
        block-allow-list: "bw-rule-user-01"  # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    
  • MySQL 数据库实例中的 store 库中的表store_sz同步到 TiDB 数据库中的store 库的store_suzhou表中,其它表原样同步

    # 任务规则配置文件: myrule01.yaml
    # 任务名称,,需要全局唯一
    name: "my2tidb-task01"
    # 全量+增量 (all) 迁移模式
    task-mode: "all"
    
    
    ## ******** 目标 TiDB 配置 **********
    target-database:       # 目标 TiDB 配置
      host: "192.168.10.215"
      port: 4000
      user: "syncer"
      password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    
    ## ******** 功能配置集 **********
    routes:                           # 上游和下游表之间的路由 table routing 规则集
      route-rule-user-01:                   # 配置名称
        schema-pattern: "user"
        target-schema: "user_north"
      route-rule-store-02:
        schema-pattern: "store"
        table-pattern: "store_sz"
        target-schema: "store"
        target-table: "store_suzhou"
    
    block-allow-list:                    # 定义数据源迁移表的过滤规则
      bw-rule-01:                         # 规则名称
        do-dbs: ["user", "store"]     # 迁移哪些库
        ignore-dbs: ["mysql", "mydb", "information_schema", "performance_schema", "sys"] # 忽略哪些库
    
    ## ******** 数据源配置 **********
    # ----------- 实例配置 -----------
    mysql-instances:
      #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      - source-id: "mysql-replica"
        meta:
          binlog-name: blg.000008
          binlog-pos: 154
        route-rules: ["route-rule-user-01", "route-rule-store-02"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
        block-allow-list: "bw-rule-01"  # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
        
        syncer-config-name: "global"            # syncers 配置的名称
        
    syncers:                             # sync 处理单元的运行配置参数
      global:                            # 配置名称
        worker-count: 16                 # 应用已传输到本地的 binlog 的并发线程数量,默认值为 16。调整此参数不会影响上游拉取日志的并发,但会对下游产生显著压力。
        batch: 100                       # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100,建议一般不超过 500。
        enable-ansi-quotes: true         # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
    
        # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。
        safe-mode: false
        # 设置为 true,DM 会在不增加延迟的情况下,尽可能地将上游对同一条数据的多次操作压缩成一次操作。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); UPDATE tb SET b=11 WHERE a=1; 会被压缩成 INSERT INTO tb(a,b) VALUES(1,11); 其中 a 为主键
        # 如 UPDATE tb SET b=1 WHERE a=1; UPDATE tb(a,b) SET b=2 WHERE a=1; 会被压缩成 UPDATE tb(a,b) SET b=2 WHERE a=1; 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; INSERT INTO tb(a,b) VALUES(1,1); 会被压缩成 REPLACE INTO tb(a,b) VALUES(1,1); 其中 a 为主键
        compact: false
        # 设置为 true,DM 会尽可能地将多条同类型的语句合并到一条语句中,生成一条带多行数据的 SQL 语句。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); INSERT INTO tb(a,b) VALUES(2,2); 会变成 INSERT INTO tb(a,b) VALUES(1,1),(2,2);
        # 如 UPDATE tb SET b=11 WHERE a=1; UPDATE tb(a,b) set b=22 WHERE a=2; 会变成 INSERT INTO tb(a,b) VALUES(1,11),(2,22) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b); 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; DELETE FROM tb WHERE a=2 会变成 DELETE FROM tb WHERE (a) IN (1),(2);其中 a 为主键
        multiple-rows: false
    
  • 多个MySQL 数据库实例的 salesdb 库中的表 sales_N(分表),让他们同步到TiDB 中的salesdb 库的 sales 表中。(分表分库规则)

    # 任务规则配置文件: myrule01.yaml
    # 任务名称,,需要全局唯一
    name: "my2tidb-task01"
    # 全量+增量 (all) 迁移模式
    task-mode: "all"
    
    
    ## ******** 目标 TiDB 配置 **********
    target-database:       # 目标 TiDB 配置
      host: "192.168.10.215"
      port: 4000
      user: "syncer"
      password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    
    ## ******** 功能配置集 **********
    routes:                           # 上游和下游表之间的路由 table routing 规则集
      route-rule-user-01:                   # 配置名称
        schema-pattern: "user"
        target-schema: "user_north"
      route-rule-store-02:
        schema-pattern: "store"
        table-pattern: "store_sz"
        target-schema: "store"
        target-table: "store_suzhou"
      route-rule-salesdb-03:
        schema-pattern: "salesdb"
        table-pattern: "sales_*"  # 表名匹配规则,支持通配符 "*" 和 "?"
        target-schema: "salesdb"
        target-table: "sales"     # 目标表名称
        
    
    block-allow-list:                    # 定义数据源迁移表的过滤规则
      bw-rule-01:                         # 规则名称
        do-dbs: ["user", "store", "salesdb"]     # 迁移哪些库
        ignore-dbs: ["mysql", "mydb", "information_schema", "performance_schema", "sys"] # 忽略哪些库
    
    ## ******** 数据源配置 **********
    # ----------- 实例配置 -----------
    mysql-instances:
      #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      - source-id: "mysql-replica"
        meta:
          binlog-name: blg.000008
          binlog-pos: 154
        route-rules: ["route-rule-user-01", "route-rule-store-02", "route-rule-salesdb-03"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
        block-allow-list: "bw-rule-01"  # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
        
        syncer-config-name: "global"            # syncers 配置的名称
        
    syncers:                             # sync 处理单元的运行配置参数
      global:                            # 配置名称
        worker-count: 16                 # 应用已传输到本地的 binlog 的并发线程数量,默认值为 16。调整此参数不会影响上游拉取日志的并发,但会对下游产生显著压力。
        batch: 100                       # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100,建议一般不超过 500。
        enable-ansi-quotes: true         # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
    
        # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。
        safe-mode: false
        # 设置为 true,DM 会在不增加延迟的情况下,尽可能地将上游对同一条数据的多次操作压缩成一次操作。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); UPDATE tb SET b=11 WHERE a=1; 会被压缩成 INSERT INTO tb(a,b) VALUES(1,11); 其中 a 为主键
        # 如 UPDATE tb SET b=1 WHERE a=1; UPDATE tb(a,b) SET b=2 WHERE a=1; 会被压缩成 UPDATE tb(a,b) SET b=2 WHERE a=1; 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; INSERT INTO tb(a,b) VALUES(1,1); 会被压缩成 REPLACE INTO tb(a,b) VALUES(1,1); 其中 a 为主键
        compact: false
        # 设置为 true,DM 会尽可能地将多条同类型的语句合并到一条语句中,生成一条带多行数据的 SQL 语句。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); INSERT INTO tb(a,b) VALUES(2,2); 会变成 INSERT INTO tb(a,b) VALUES(1,1),(2,2);
        # 如 UPDATE tb SET b=11 WHERE a=1; UPDATE tb(a,b) set b=22 WHERE a=2; 会变成 INSERT INTO tb(a,b) VALUES(1,11),(2,22) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b); 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; DELETE FROM tb WHERE a=2 会变成 DELETE FROM tb WHERE (a) IN (1),(2);其中 a 为主键
        multiple-rows: false
    

    image-20220219132723576

  • MySQL 数据库实例中的 user 库不会复制删除操作,user 库中的 trace 表不会复制 truncate ,drop 和 delete 操作,store 库不会复制删除操作,store 库的表不会复制truncate ,drop 和 delete 操作。

    # 任务规则配置文件: myrule04.yaml
    # 任务名称,,需要全局唯一
    name: "my2tidb-task01"
    # 全量+增量 (all) 迁移模式
    task-mode: "all"
    
    
    ## ******** 目标 TiDB 配置 **********
    target-database:       # 目标 TiDB 配置
      host: "192.168.10.215"
      port: 4000
      user: "syncer"
      password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    
    ## ******** 功能配置集 **********
    routes:                           # 上游和下游表之间的路由 table routing 规则集
      route-rule-user-01:                   # 配置名称
        schema-pattern: "user"
        target-schema: "user_north"
      route-rule-store-02:
        schema-pattern: "store"
        table-pattern: "store_sz"
        target-schema: "store"
        target-table: "store_suzhou"
      route-rule-salesdb-03:
        schema-pattern: "salesdb"
        table-pattern: "sales_*"  # 表名匹配规则,支持通配符 "*" 和 "?"
        target-schema: "salesdb"
        target-table: "sales"     # 目标表名称
    
    filters:                                        # 上游数据库实例匹配的表的 binlog event filter 规则集
      filter-rule-01:                                         # 配置名称
        schema-pattern: "user"                                # 库名匹配规则,支持通配符 "*" 和 "?"
        table-pattern: "trace"                                # 表名匹配规则,支持通配符 "*" 和 "?"
        events: ["truncate table", "drop table", "delete"]    # 匹配哪些 event 类型
        action: Ignore                                        # 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
      filter-rule-02:                                      # user 库不会复制删除操作
        schema-pattern: "user"
        events: ["drop database"]    # 匹配哪些 event 类型
        action: Ignore
      filter-rule-03:
        schema-pattern: "store"
        events: ["truncate table", "drop table", "delete", "drop database"]
        action: Ignore
    
    block-allow-list:                    # 定义数据源迁移表的过滤规则
      bw-rule-01:                         # 规则名称
        do-dbs: ["user", "store", "salesdb"]     # 迁移哪些库
        ignore-dbs: ["mysql", "mydb", "information_schema", "performance_schema", "sys"] # 忽略哪些库
    
    ## ******** 数据源配置 **********
    # ----------- 实例配置 -----------
    mysql-instances:
      #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      - source-id: "mysql-replica"
        meta:
          binlog-name: blg.000008
          binlog-pos: 154
        route-rules: ["route-rule-user-01", "route-rule-store-02", "route-rule-salesdb-03"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
        block-allow-list: "bw-rule-01"  # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
        filter-rules: ["filter-rule-01", "filter-rule-02", "filter-rule-03"] # 该上游数据库实例匹配的表的 binlog event filter 规则名称
        
        syncer-config-name: "global"            # syncers 配置的名称
        
    syncers:                             # sync 处理单元的运行配置参数
      global:                            # 配置名称
        worker-count: 16                 # 应用已传输到本地的 binlog 的并发线程数量,默认值为 16。调整此参数不会影响上游拉取日志的并发,但会对下游产生显著压力。
        batch: 100                       # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100,建议一般不超过 500。
        enable-ansi-quotes: true         # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
    
        # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。
        safe-mode: false
        # 设置为 true,DM 会在不增加延迟的情况下,尽可能地将上游对同一条数据的多次操作压缩成一次操作。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); UPDATE tb SET b=11 WHERE a=1; 会被压缩成 INSERT INTO tb(a,b) VALUES(1,11); 其中 a 为主键
        # 如 UPDATE tb SET b=1 WHERE a=1; UPDATE tb(a,b) SET b=2 WHERE a=1; 会被压缩成 UPDATE tb(a,b) SET b=2 WHERE a=1; 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; INSERT INTO tb(a,b) VALUES(1,1); 会被压缩成 REPLACE INTO tb(a,b) VALUES(1,1); 其中 a 为主键
        compact: false
        # 设置为 true,DM 会尽可能地将多条同类型的语句合并到一条语句中,生成一条带多行数据的 SQL 语句。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); INSERT INTO tb(a,b) VALUES(2,2); 会变成 INSERT INTO tb(a,b) VALUES(1,1),(2,2);
        # 如 UPDATE tb SET b=11 WHERE a=1; UPDATE tb(a,b) set b=22 WHERE a=2; 会变成 INSERT INTO tb(a,b) VALUES(1,11),(2,22) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b); 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; DELETE FROM tb WHERE a=2 会变成 DELETE FROM tb WHERE (a) IN (1),(2);其中 a 为主键
        multiple-rows: false
    

    image-20220219134714109

  • MySQL 数据库实例中的 log 库不会参与复制

    # 任务规则配置文件: myrule05.yaml
    # 任务名称,,需要全局唯一
    name: "my2tidb-task01"
    # 全量+增量 (all) 迁移模式
    task-mode: "all"
    
    
    ## ******** 目标 TiDB 配置 **********
    target-database:       # 目标 TiDB 配置
      host: "192.168.10.215"
      port: 4000
      user: "syncer"
      password: "nMbrwS34wTZo7cBYUYRMqkC5lsgEF04="   # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    
    ## ******** 功能配置集 **********
    routes:                           # 上游和下游表之间的路由 table routing 规则集
      route-rule-user-01:                   # 配置名称
        schema-pattern: "user"
        target-schema: "user_north"
      route-rule-store-02:
        schema-pattern: "store"
        table-pattern: "store_sz"
        target-schema: "store"
        target-table: "store_suzhou"
      route-rule-salesdb-03:
        schema-pattern: "salesdb"
        table-pattern: "sales_*"  # 表名匹配规则,支持通配符 "*" 和 "?"
        target-schema: "salesdb"
        target-table: "sales"     # 目标表名称
    
    filters:                                        # 上游数据库实例匹配的表的 binlog event filter 规则集
      filter-rule-01:                                         # 配置名称
        schema-pattern: "user"                                # 库名匹配规则,支持通配符 "*" 和 "?"
        table-pattern: "trace"                                # 表名匹配规则,支持通配符 "*" 和 "?"
        events: ["truncate table", "drop table", "delete"]    # 匹配哪些 event 类型
        action: Ignore                                        # 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
      filter-rule-02:                                      # user 库不会复制删除操作
        schema-pattern: "user"
        events: ["drop database"]    # 匹配哪些 event 类型
        action: Ignore
      filter-rule-03:
        schema-pattern: "store"
        events: ["truncate table", "drop table", "delete", "drop database"]
        action: Ignore
    
    block-allow-list:                    # 定义数据源迁移表的过滤规则
      bw-rule-01:                         # 规则名称
        do-dbs: ["user", "store", "salesdb"]     # 迁移哪些库
        ignore-dbs: ["log", "mysql", "mydb", "information_schema", "performance_schema", "sys"] # 忽略哪些库
    
    mydumpers:                           # dump 处理单元的运行配置参数
      global:                            # 配置名称
        threads: 4                       # dump 处理单元从上游数据库实例导出数据的线程数量,默认值为 4
        chunk-filesize: 64               # dump 处理单元生成的数据文件大小,默认值为 64,单位为 MB
        extra-args: "--consistency none" # dump 处理单元的其他参数,不需要在 extra-args 中配置 table-list,DM 会自动生成
    
    loaders:                             # load 处理单元的运行配置参数
      global:                            # 配置名称
        pool-size: 16                    # load 处理单元并发执行 dump 处理单元的 SQL 文件的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
        dir: "./dumped_data"             # dump 处理单元输出 SQL 文件的目录,同时也是 load 处理单元读取文件的目录。该配置项的默认值为 "./dumped_data"。同实例对应的不同任务必须配置不同的目录
    
    syncers:                             # sync 处理单元的运行配置参数
      global:                            # 配置名称
        worker-count: 16                 # 应用已传输到本地的 binlog 的并发线程数量,默认值为 16。调整此参数不会影响上游拉取日志的并发,但会对下游产生显著压力。
        batch: 100                       # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100,建议一般不超过 500。
        enable-ansi-quotes: true         # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
    
        # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。
        safe-mode: false
        # 设置为 true,DM 会在不增加延迟的情况下,尽可能地将上游对同一条数据的多次操作压缩成一次操作。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); UPDATE tb SET b=11 WHERE a=1; 会被压缩成 INSERT INTO tb(a,b) VALUES(1,11); 其中 a 为主键
        # 如 UPDATE tb SET b=1 WHERE a=1; UPDATE tb(a,b) SET b=2 WHERE a=1; 会被压缩成 UPDATE tb(a,b) SET b=2 WHERE a=1; 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; INSERT INTO tb(a,b) VALUES(1,1); 会被压缩成 REPLACE INTO tb(a,b) VALUES(1,1); 其中 a 为主键
        compact: false
        # 设置为 true,DM 会尽可能地将多条同类型的语句合并到一条语句中,生成一条带多行数据的 SQL 语句。
        # 如 INSERT INTO tb(a,b) VALUES(1,1); INSERT INTO tb(a,b) VALUES(2,2); 会变成 INSERT INTO tb(a,b) VALUES(1,1),(2,2);
        # 如 UPDATE tb SET b=11 WHERE a=1; UPDATE tb(a,b) set b=22 WHERE a=2; 会变成 INSERT INTO tb(a,b) VALUES(1,11),(2,22) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b); 其中 a 为主键
        # 如 DELETE FROM tb WHERE a=1; DELETE FROM tb WHERE a=2 会变成 DELETE FROM tb WHERE (a) IN (1),(2);其中 a 为主键
        multiple-rows: false
    
    
    ## ******** 数据源配置 **********
    # ----------- 实例配置 -----------
    mysql-instances:
      #- source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      #- source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      - source-id: "mysql-replica"
        meta:
          binlog-name: blg.000008
          binlog-pos: 154
        route-rules: ["route-rule-user-01", "route-rule-store-02", "route-rule-salesdb-03"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
        block-allow-list: "bw-rule-01"  # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
        filter-rules: ["filter-rule-01", "filter-rule-02", "filter-rule-03"] # 该上游数据库实例匹配的表的 binlog event filter 规则名称
        
        mydumper-config-name: "global"   
        loader-config-name: "global"
        syncer-config-name: "global"            # syncers 配置的名称
    
检查配置
tiup dmctl --master-addr=192.168.10.217:8261 check-task myrule01.yaml

image-20220218150742854

注意:dm-master 也需要开通连接TiDB数据库权限,否则抛出如下错误信息:

image-20220218150953493

处理:

create user 'syncer'@'192.168.10.217' identified by 'syncer';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX  ON *.* TO 'syncer'@'192.168.10.217';

image-20220218151045767

启动同步作业
tiup dmctl --master-addr=192.168.10.217:8261 start-task myrule01.yaml

image-20220218151419598

查询任务状态,查看是否正常
tiup dmctl --master-addr=192.168.10.217:8261 query-status myrule01.yaml

tiup dmctl --master-addr=192.168.10.217:8261 query-status my2tidb-task01

image-20220218151657402

权限不足,任务Paused了

在MySQL中给用户授权process 全局数据库权限

GRANT process ON *.* TO 'syncer'@'192.168.10.218';
GRANT process ON *.* TO 'syncer'@'192.168.10.219';

重启任务后,发现另一个问题,如下图:

image-20220218152951314

  • 检查上游MySQL数据库配置

    -- 从mysql5.7.6开始information_schema.global_status已经开始被舍弃
    
    show variables like '%show_compatibility_56%'; 
    # 查看show_compatibility_56%的开关
    
    set global show_compatibility_56=on;
    
  • 重启作业任务后,检查状态

    image-20220218153527323

检查目标 TiDB 数据库的数据,查看是否数据同步正确
show databases;
use user_north;
show tables;
select * from information;
select * from trace;

image-20220218153730840

在上游MySQL的user.trace表新增记录,并在目标端TiDB检查确认同步情况
  • MySQL插入数据
insert into trace values(2,'info');
  • 检查目标库同步情况

    select * from trace;
    

    image-20220218161515502

在MySQL端中的sales_01插入记录,验证目标数据
-- mysql
use salesdb;
insert into sales_01 values(3,'shose',120);

-- tidb
select * from salesdb.sales;

image-20220219135721007

暂停任务后在上游MySQL更新数据记录,验证目标端TiDB数据复制情况
tiup dmctl --master-addr=192.168.10.217:8261 pause-task my2tidb-task01
恢复作业任务,验证目标端TiDB数据复制情况
tiup dmctl --master-addr=192.168.10.217:8261 resume-task my2tidb-task01
tiup dmctl --master-addr=192.168.10.217:8261 query-status my2tidb-task01

附录

参考文档

数据迁移任务配置向导

需迁移的表

配置从数据源迁移表的黑白名单,则需要添加两个定义

定义全局的黑白名单规则
block-allow-list:
  bw-rule-1:                           # 规则名称
    do-dbs: ["test.*", "user"]         # 迁移哪些库,支持通配符 "*" 和 "?",do-dbs 和 ignore-dbs 只需要配置一个,如果两者同时配置只有 do-dbs 会生效
    # ignore-dbs: ["mysql", "account"] # 忽略哪些库,支持通配符 "*" 和 "?"
    do-tables:                         # 迁移哪些表,do-tables 和 ignore-tables 只需要配置一个,如果两者同时配置只有 do-tables 会生效
    - db-name: "test.*"
      tbl-name: "t.*"
    - db-name: "user"
      tbl-name: "information"
  bw-rule-2:                          # 规则名称
    ignore-tables:                    # 忽略哪些表
    - db-name: "user"
      tbl-name: "log"
在数据源配置中引用黑白名单规则,过滤该数据源需要迁移的表
mysql-instances:
    - source-id: "mysql-replica-01"  # 从 source-id = mysql-replica-01 的数据源迁移数据
      block-allow-list:  "bw-rule-1" # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    - source-id: "mysql-replica-02"  # 从 source-id = mysql-replica-02 的数据源迁移数据
      block-allow-list:  "bw-rule-2" # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
配置需要过滤的操作

配置过滤特定操作,则需要添加两个定义

定义全局的数据源操作过滤规则
filters:                                        # 定义过滤数据源特定操作的规则,可以定义多个规则
  filter-rule-1:                                # 规则名称
    schema-pattern: "test_*"                    # 匹配数据源的库名,支持通配符 "*" 和 "?"
    table-pattern: "t_*"                        # 匹配数据源的表名,支持通配符 "*" 和 "?"
    events: ["truncate table", "drop table"]    # 匹配上 schema-pattern 和 table-pattern 的库或者表的操作类型
    action: Ignore                              # 迁移(Do)还是忽略(Ignore)
  filter-rule-2:
    schema-pattern: "test"
    events: ["all dml"]
    action: Do
引用数据源操作过滤规则,过滤该数据源的指定库或表的指定操作
mysql-instances:
  - source-id: "mysql-replica-01"    # 从 source-id = mysql-replica-01 的数据源迁移数据
    block-allow-list:  "bw-rule-1"   # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    filter-rules: ["filter-rule-1"]  # 过滤数据源特定操作的规则,可以配置多个过滤规则
  - source-id: "mysql-replica-02"    # 从 source-id = mysql-replica-02 的数据源迁移数据
    block-allow-list:  "bw-rule-2"   # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    filter-rules: ["filter-rule-2"]  # 过滤数据源特定操作的规则,可以配置多个过滤规则
配置需要数据源表到目标 TiDB 表的映射

配置数据源表迁移到目标 TiDB 表的路由规则,则需要添加两个定义

定义全局的路由规则
routes:                           # 定义数据源表迁移到目标 TiDB 表的路由规则,可以定义多个规则
  route-rule-1:                   # 规则名称
    schema-pattern: "test_*"      # 匹配数据源的库名,支持通配符 "*" 和 "?"
    table-pattern: "t_*"          # 匹配数据源的表名,支持通配符 "*" 和 "?"
    target-schema: "test"         # 目标 TiDB 库名
    target-table: "t"             # 目标 TiDB 表名
  route-rule-2:
    schema-pattern: "test_*"
    target-schema: "test"
引用路由规则,过滤该数据源需要迁移的表
mysql-instances:
  - source-id: "mysql-replica-01"                     # 从 source-id = mysql-replica-01 的数据源迁移数据
    block-allow-list:  "bw-rule-1"                    # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    filter-rules: ["filter-rule-1"]                   # 过滤数据源特定操作的规则,可以配置多个过滤规则
    route-rules: ["route-rule-1", "route-rule-2"]     # 数据源表迁移到目标 TiDB 表的路由规则,可以定义多个规则
  - source-id: "mysql-replica-02"                     # 从 source-id = mysql-replica-02 的数据源迁移数据
    block-allow-list:  "bw-rule-2"                    # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    filter-rules: ["filter-rule-2"]                   # 过滤数据源特定操作的规则,可以配置多个过滤规则
配置是否进行分库分表合并

如果是分库分表合并的数据迁移场景,并且需要同步分库分表的 DDL,则必须显式配置 shard-mode,否则不要配置该选项。

## ********* 任务信息配置 *********
name: test                      # 任务名称,需要全局唯一
shard-mode: "pessimistic"       # 默认值为 "" 即无需协调。如果为分库分表合并任务,请设置为悲观协调模式 "pessimistic"。在深入了解乐观协调模式的原理和使用限制后,也可以设置为乐观协调模式 "optimistic"
完整作业任务配置文件示例
# ----------- 全局配置 -----------
## ********* 基本信息配置 *********
name: test                      # 任务名称,需要全局唯一
task-mode: all                  # 任务模式,可设为 "full" - "只进行全量数据迁移"、"incremental" - "Binlog 实时同步"、"all" - "全量 + Binlog 实时同步"
is-sharding: true               # 该配置项从 DM v2.0.0 起弃用,其功能被 `shard-mode` 取代,建议使用 `shard-mode` 代替 `is-sharding`
shard-mode: "pessimistic"       # 任务协调模式,可选的模式有 ""、"pessimistic、"optimistic"。默认值为 "" 即无需协调。如果是分库分表合并任务,请设置为悲观协调模式 "pessimistic"。
                                # 在 v2.0.6 版本后乐观模式逐渐成熟,深入了解乐观协调模式的原理和使用限制后,也可以设置为乐观协调模式 "optimistic"
meta-schema: "dm_meta"          # 下游储存 `meta` 信息的数据库
# timezone: "Asia/Shanghai"     # 指定数据迁移任务时 SQL Session 使用的时区。DM 默认使用目标库的全局时区配置进行数据迁移,并且自动确保同步数据的正确性。使用自定义时区依然可以确保整个流程的正确性,但一般不需要手动指定。

case-sensitive: false           # schema/table 是否大小写敏感
online-ddl: true                # 支持上游 "gh-ost" 、"pt" 的自动处理
online-ddl-scheme: "gh-ost"     # `online-ddl-scheme` 在未来将会被弃用,建议使用 `online-ddl` 代替 `online-ddl-scheme`
clean-dump-file: true           # 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件
collation_compatible: "loose"   # 同步 CREATE 语句中缺省 Collation 的方式,可选 "loose" 和 "strict",默认为 "loose"。"loose" 模式不会显式补充上游缺省的 Collation,"strict" 会显式补充上游缺省的 Collation。当使用 "strict" 模式,但下游不支持上游缺省的 Collation 时,下游可能会报错。 

target-database:                # 下游数据库实例配置
  host: "192.168.0.1"
  port: 4000
  user: "root"
  password: "/Q7B9DizNLLTTfiZHv9WoEAKamfpIUs="  # 推荐使用经 `dmctl encrypt` 加密后的密码
  max-allowed-packet: 67108864                  # 设置 DM 内部连接 TiDB 服务器时,TiDB 客户端的 "max_allowed_packet" 限制(即接受的最大数据包限制),单位为字节,默认 67108864 (64 MB)
                                                # 该配置项从 DM v2.0.0 起弃用,DM 会自动获取连接 TiDB 的 "max_allowed_packet"
  session:                                      # 设置 TiDB 的 session 变量,在 v1.0.6 版本引入。更多变量及解释参见 `https://docs.pingcap.com/zh/tidb/stable/system-variables`
    sql_mode: "ANSI_QUOTES,NO_ZERO_IN_DATE,NO_ZERO_DATE" # 从 DM v2.0.0 起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "sql_mode" 的值。手动配置该项具有更高优先级
    tidb_skip_utf8_check: 1                              # 从 DM v2.0.0 起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "tidb_skip_utf8_check" 的值。手动配置该项具有更高优先级
    tidb_constraint_check_in_place: 0
  security:                       # 下游 TiDB TLS 相关配置
    ssl-ca: "/path/to/ca.pem"
    ssl-cert: "/path/to/cert.pem"
    ssl-key: "/path/to/key.pem"

## ******** 功能配置集 **********

routes:                           # 上游和下游表之间的路由 table routing 规则集
  route-rule-1:                   # 配置名称
    schema-pattern: "test_*"      # 库名匹配规则,支持通配符 "*" 和 "?"
    table-pattern: "t_*"          # 表名匹配规则,支持通配符 "*" 和 "?"
    target-schema: "test"         # 目标库名称
    target-table: "t"             # 目标表名称
  route-rule-2:
    schema-pattern: "test_*"
    target-schema: "test"

filters:                                        # 上游数据库实例匹配的表的 binlog event filter 规则集
  filter-rule-1:                                # 配置名称
    schema-pattern: "test_*"                    # 库名匹配规则,支持通配符 "*" 和 "?"
    table-pattern: "t_*"                        # 表名匹配规则,支持通配符 "*" 和 "?"
    events: ["truncate table", "drop table"]    # 匹配哪些 event 类型
    action: Ignore                              # 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
  filter-rule-2:
    schema-pattern: "test_*"
    events: ["all dml"]
    action: Do

expression-filter:                   # 定义数据源迁移行变更的过滤规则,可以定义多个规则
  # 过滤 `expr_filter`.`tbl` 的 c 为偶数的插入
  even_c:                            # 规则名称
    schema: "expr_filter"            # 要匹配的上游数据库库名,不支持通配符匹配或正则匹配
    table: "tbl"                     # 要匹配的上游表名,不支持通配符匹配或正则匹配
    insert-value-expr: "c % 2 = 0"

block-allow-list:                    # 定义数据源迁移表的过滤规则,可以定义多个规则。如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
  bw-rule-1:                         # 规则名称
    do-dbs: ["~^test.*", "user"]     # 迁移哪些库
    ignore-dbs: ["mysql", "account"] # 忽略哪些库
    do-tables:                       # 迁移哪些表
    - db-name: "~^test.*"
      tbl-name: "~^t.*"
    - db-name: "user"
      tbl-name: "information"
  bw-rule-2:                         # 规则名称
    ignore-tables:                   # 忽略哪些表
    - db-name: "user"
      tbl-name: "log"

mydumpers:                           # dump 处理单元的运行配置参数
  global:                            # 配置名称
    threads: 4                       # dump 处理单元从上游数据库实例导出数据的线程数量,默认值为 4
    chunk-filesize: 64               # dump 处理单元生成的数据文件大小,默认值为 64,单位为 MB
    extra-args: "--consistency none" # dump 处理单元的其他参数,不需要在 extra-args 中配置 table-list,DM 会自动生成

loaders:                             # load 处理单元的运行配置参数
  global:                            # 配置名称
    pool-size: 16                    # load 处理单元并发执行 dump 处理单元的 SQL 文件的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
    dir: "./dumped_data"             # dump 处理单元输出 SQL 文件的目录,同时也是 load 处理单元读取文件的目录。该配置项的默认值为 "./dumped_data"。同实例对应的不同任务必须配置不同的目录


syncers:                             # sync 处理单元的运行配置参数
  global:                            # 配置名称
    worker-count: 16                 # 应用已传输到本地的 binlog 的并发线程数量,默认值为 16。调整此参数不会影响上游拉取日志的并发,但会对下游产生显著压力。
    batch: 100                       # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100,建议一般不超过 500。
    enable-ansi-quotes: true         # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项

    # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。
    safe-mode: false
    # 设置为 true,DM 会在不增加延迟的情况下,尽可能地将上游对同一条数据的多次操作压缩成一次操作。
    # 如 INSERT INTO tb(a,b) VALUES(1,1); UPDATE tb SET b=11 WHERE a=1; 会被压缩成 INSERT INTO tb(a,b) VALUES(1,11); 其中 a 为主键
    # 如 UPDATE tb SET b=1 WHERE a=1; UPDATE tb(a,b) SET b=2 WHERE a=1; 会被压缩成 UPDATE tb(a,b) SET b=2 WHERE a=1; 其中 a 为主键
    # 如 DELETE FROM tb WHERE a=1; INSERT INTO tb(a,b) VALUES(1,1); 会被压缩成 REPLACE INTO tb(a,b) VALUES(1,1); 其中 a 为主键
    compact: false
    # 设置为 true,DM 会尽可能地将多条同类型的语句合并到一条语句中,生成一条带多行数据的 SQL 语句。
    # 如 INSERT INTO tb(a,b) VALUES(1,1); INSERT INTO tb(a,b) VALUES(2,2); 会变成 INSERT INTO tb(a,b) VALUES(1,1),(2,2);
    # 如 UPDATE tb SET b=11 WHERE a=1; UPDATE tb(a,b) set b=22 WHERE a=2; 会变成 INSERT INTO tb(a,b) VALUES(1,11),(2,22) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b); 其中 a 为主键
    # 如 DELETE FROM tb WHERE a=1; DELETE FROM tb WHERE a=2 会变成 DELETE FROM tb WHERE (a) IN (1),(2);其中 a 为主键
    multiple-rows: false

# ----------- 实例配置 -----------
mysql-instances:
  -
    source-id: "mysql-replica-01"           # 对应 source.toml 中的 `source-id`
    meta:                                   # `task-mode` 为 `incremental` 且下游数据库的 `checkpoint` 不存在时 binlog 迁移开始的位置; 如果 checkpoint 存在,则以 `checkpoint` 为准
      binlog-name: binlog.000001
      binlog-pos: 4
      binlog-gtid: "03fc0263-28c7-11e7-a653-6c0b84d59f30:1-7041423,05474d3c-28c7-11e7-8352-203db246dd3d:1-170"  # 对于 source 中指定了 `enable-gtid: true` 的增量任务,需要指定该值

    route-rules: ["route-rule-1", "route-rule-2"]    # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
    filter-rules: ["filter-rule-1", "filter-rule-2"] # 该上游数据库实例匹配的表的 binlog event filter 规则名称
    block-allow-list:  "bw-rule-1"                   # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    expression-filters: ["even_c"]                   # 使用名为 even_c 的表达式过滤规则

    mydumper-config-name: "global"          # mydumpers 配置的名称
    loader-config-name: "global"            # loaders 配置的名称
    syncer-config-name: "global"            # syncers 配置的名称

  -
    source-id: "mysql-replica-02"  # 对应 source.toml 中的 `source-id`
    mydumper-thread: 4             # dump 处理单元用于导出数据的线程数量,等同于 mydumpers 配置中的 `threads`,当同时指定它们时 `mydumper-thread` 优先级更高
    loader-thread: 16              # load 处理单元用于导入数据的线程数量,等同于 loaders 配置中的 `pool-size`,当同时指定它们时 `loader-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
    syncer-thread: 16              # sync 处理单元用于复制增量数据的线程数量,等同于 syncers 配置中的 `worker-count`,当同时指定它们时 `syncer-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值

遇见问题

上游MySQL数据库清理binlog

现象

image-20220219105859768

原因

在全量迁移过程中,上游数据源清理了binlog日志,从而触发dm中的dump组件无法获取已记录元数据metadata中的binlog位置,最终导致作业任务失败。

处理方案

只能清空下游数据库已同步数据,并在停止任务后加上 --remove-meta 参数重建任务

tiup dmctl --master-addr=192.168.10.217:8261 stop-task myrule02.yaml
tiup dmctl --master-addr=192.168.10.217:8261 check-task myrule02.yaml
tiup dmctl --master-addr=192.168.10.217:8261 start-task --remove-meta myrule02.yaml
posted @ 2022-02-19 14:06  KuBee  阅读(365)  评论(0编辑  收藏  举报