TIDB-dm-数据同步不同场景处理

一、简介

之前的文章已经讲了dm同步的初步搭建:https://blog.csdn.net/line_on_database/article/details/115078212

保证dm可以正常同步,本章记录一些不同的配置及一些异常的处理方式

二、不同情况下的同步配置

1.同步一张库的不同表(简单示例)

block-allow-list:                     # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
  global:
    do-dbs: ["dm_test1"]
    do-tables:                        # 需要迁移的上游表的白名单。
    - db-name: "dm_test1"              # 需要迁移的表的库名。
      tbl-name: "dm_test1"          # 需要迁移的表的名称。
    - db-name: "dm_test1"
      tbl-name: "dm_test2"

2.非分库情况下的多种情况配置

2.1 规则配置如下

# 跳过自增主键的检查,相同主键后者内容会覆盖前者
ignore-checking-items: ["auto_increment_ID"]
# 当前数据迁移任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID,参考 `inventory.ini` 的 `source_id` 或者 `dm-master.toml` 的 `source-id 配置`。
  source-id: "mysql-replica-01"
  # 需要迁移的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `block-allow-list` 的配置。
  block-allow-list: "global"          # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
  route-rules: ["instance-1-dm-role","instance-2-dm-role","instance-1-dm-same-role","instance-2-dm-same-role"]
  filter-rules: ["log-filter-rule", "same-filter-rule"]
  # dump 处理单元的配置项名称,用于引用全局的 dump 处理单元配置。
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"

#-
#  source-id: "mysql-replica-02"
#  block-allow-list: "global"          # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
#  mydumper-config-name: "global"

# 黑白名单全局配置,各实例通过配置项名引用。
block-allow-list:                     # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
  global:
    do-dbs: ["dm_1","dm_2","dm_3","dm_same_4","dm_same_5"]


routes:
  # dm_1库同步到dm_get_1库,dm_2库同步到dm_get_2库
  instance-1-dm-role:
    schema-pattern: "dm_1"
    target-schema: "dm_get_1"
  instance-2-dm-role:
    schema-pattern: "dm_2"
    target-schema: "dm_get_2"
  # 同一库的不同表到下游不同库的不同表
  instance-1-dm-same-role:
    schema-pattern: "dm_same_4"
    table-pattern: "new_name"
    target-schema: "dm_same_4"
    target-table: "new_name_cp"
  # 上游同一库的不同表同步到下游同一库的同一表
  instance-2-dm-same-role:
    schema-pattern: "dm_same_5"
    table-pattern: "test_*"
    target-schema: "dm_same_5"
    target-table: "test"


filters:
  # 任何情况下不删除dm_3的log表
  log-filter-rule:
    schema-pattern: "dm_3"
    table-pattern: "dm_3"
    events: ["truncate table","drop table","delete"]
    action: Ignore
  # 任何情况下不删除dm_same为前缀的库的数据
  same-filter-rule:
    schema-pattern: "dm_same_*"
    events: ["drop database","truncate table","drop table","delete"]
    action: Ignore


mydumpers:
  global:
    threads: 4
    chunk-filesize: 64
    skip-tz-utc: true

loaders:
  global:
    pool-size: 16
    dir: "./dumped_data"

syncers:
  global:
    worker-count: 16
    batch: 100
    max-retry: 100

2.2 验证过程

show databases; # 查看上下游库名进行对比,初步验证符合

# instance-1-dm-role 验证
# 上游执行
use dm_1;
create table test(id int(10) not null primary key,name varchar(20));
# 可以看到下游的dm_get_1库创建了一张test表,所以成立


# log-filter-rule
# 验证环境准备
use dm_3;
create table dm_3(id int(10) not null primary key,name varchar(20));
insert into dm_3 values(1,"a");

# 开始验证
delete from dm_3;
delete from dm_3;
# 发现下游依然有改表,且该表依然有数据,所以成立


# instance-1-dm-same-role
# 验证环境准备
use dm_same_4;
create table new_name(id int(10) not null primary key,name varchar(20));
create table abc(id int(10) not null primary key,name varchar(20));
# 可以看到下游生成了一张new_name_cp表和一张abc表,所以成立


# same-filter-rule
# 验证环境准备
use dm_same_4;
drop table abc;
# 可以看到下游依然有abc表,所以成立


# instance-2-dm-same-role
# 验证环境准备
create table test_1(id int(10) not null auto_increment primary key,name varchar(20));
create table test_2(id int(10) not null auto_increment primary key,name varchar(20));
create table test_3(id int(10) not null auto_increment primary key,name varchar(20));
insert into test_1(name) values('a');
insert into test_2(name) values('b');
insert into test_2(name) values('3');
# 可以看到下游仅有test表生成,且相同主键后者能够覆盖前者,所以成立

 

 

三、遇到的问题

1.表没有主键或者唯一键,启动报错

1.1 问题描述

1.2 解决办法

将原表添加唯一键或者主键

2.task-mode all模式并没有将全量同步,只是后续的增量有同步

1.1 问题描述

因为我的-B 参数第一次配置错误了,写成了别的库,库名没有同步,再次停止任务,修改库名之后,发现还是没有同步

1.2 解决办法

我们需要停止任务,然后将dm_,meta库的对应表删除

use dm_meta;
drop table `*syncer*`; # 删除对应任务的syncer表,再次启动任务就可以了

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值