一、简介
之前的文章已经讲了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表,再次启动任务就可以了