DM增量同步异常 --上游mysql binlog 无关表触发

Bug 反馈
做了一个DM 同步,将上游mysql中的 pt1 库 4个表同步到tidb中,增量同步 。将binlong的文件与位置都设置为mysql中最新的日志文件与起始点 。开始同步后出现错误,错误信息是 检查到 peixun 库中一张表 hp_user_1 有建表语法错误 。但是我的同步任务与 peixun库无关,只是这两个库在同一个binglog中。没有办法,就在配置文件中使用 fitler 过滤下,结果问题依旧。

【 TiDB 版本】 7.5.1
【 Bug 的影响】 无法增量同步数据

【可能的问题复现步骤】

【看到的非预期行为】
解析binglog时检查了无关表
【期望看到的行为】

【相关组件及具体版本】

【其他背景信息或者截图】
demo.yaml (926 字节)
查询任务错误信息.txt (4.5 KB)

可以稳定复现吗?

应该是因为解析 ddl 过不了,要先解析再过滤 :thinking:https://docs.pingcap.com/zh/tidb/stable/handle-failed-ddl-statements 手动 skip 下。

稳定复现

看上面老师的方式处理~

tiup dmctl --master-addr 192.168.165.25:8261 binlog skip ycspt
tiup dmctl --master-addr 192.168.165.25:8261 resume-task ycspt
tiup dmctl --master-addr 192.168.165.25:8261 query-status ycspt
使用上面命令的确可以调过刚才那个表,但是类似的表有 3个 ,多次执行上面 的命令 ,发现错误在这几个表中循环,多次循环 。现在 是 A 表 错误,然后执行上面一组命令 ,发现变为了A2 ,再次执行 又变为了 A3表错误,再次执行变为了A2错误,再次执行又变为A1错误了。往返如此。

这几个表是什么库下面的?

filters:
filter-rule-1:
schema-pattern: “peixun”
table-pattern: “hp_user_1”
events: [“create table”]
action: Ignore

我是不是可以理解这个其实可以不用配置。看你配置了 do-tables :face_with_peeking_eye:

对 ,这个并没有作用,我先配置了do-tables 信息 。后来报错,才加的filter ,发现加了也不起作用 ,是在解析binlog时,直接就发生错误了 。尝试跳过 ,发现循环出现错误。

啥库下的啊。

就是同一个实例中的,不需要同步的库 schema-pattern: “peixun” 这个 是库名

上游mysql 版本发一下

5.7.25

经过测试 第一条 是 tidb解析后生成的,不能在tidb中执行 。
CREATE TABLE IF NOT EXISTS hp_user_7 ( id varchar(50) NOT NULL, phone varchar(50) DEFAULT NULL COMMENT ‘用户手机号’, app_code varchar(50) DEFAULT NULL COMMENT ‘功能编码’, app_type varchar(50) DEFAULT NULL COMMENT ‘图标类型:1大图标,0小图标,2 中图标,3 快捷区’, page varchar(8) DEFAULT NULL COMMENT ‘位置信息:页’, row varchar(8) DEFAULT NULL COMMENT ‘位置信息:行’, col varchar(8) DEFAULT NULL COMMENT ‘位置信息:列’, sort int(10) DEFAULT NULL COMMENT ‘排序’, create_time datetime DEFAULT NULL COMMENT ‘创建时间’, update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’, PRIMARY KEY ( id ), UNIQUE KEY IDX_APPCODE ( phone, app_code )) ENGINE=InnoDB DEFAULT CHARSET=utf8]: parse DDL: CREATE TABLE IF NOT EXISTS enuo365_hp_user_7 ( id varchar(50) NOT NULL, phone varchar(50) DEFAULT NULL COMMENT ‘用户手机号’, app_code varchar(50) DEFAULT NULL COMMENT ‘功能编码’, app_type varchar(50) DEFAULT NULL COMMENT ‘图标类型:1大图标,0小图标,2 中图标,3 快捷区’, page varchar(8) DEFAULT NULL COMMENT ‘位置信息:页’, row varchar(8) DEFAULT NULL COMMENT ‘位置信息:行’, col varchar(8) DEFAULT NULL COMMENT ‘位置信息:列’, sort int(10) DEFAULT NULL COMMENT ‘排序’, create_time datetime DEFAULT NULL COMMENT ‘创建时间’, update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’, PRIMARY KEY ( id ), UNIQUE KEY IDX_APPCODE ( phone, app_code )) ENGINE=InnoDB DEFAULT CHARSET=utf8"

这个以下是mysql 5.7.25 生成的,可以在 tidb中执行 。建议是否可以在解析binlog时也加上
CREATE TABLE hp_user_7 (
id varchar(50) NOT NULL,
phone varchar(50) DEFAULT NULL COMMENT ‘用户手机号’,
app_code varchar(50) DEFAULT NULL COMMENT ‘功能编码’,
app_type varchar(50) DEFAULT NULL COMMENT ‘图标类型:1大图标,0小图标,2 中图标,3 快捷区’,
page varchar(8) DEFAULT NULL COMMENT ‘位置信息:页’,
row varchar(8) DEFAULT NULL COMMENT ‘位置信息:行’,
col varchar(8) DEFAULT NULL COMMENT ‘位置信息:列’,
sort int(10) DEFAULT NULL COMMENT ‘排序’,
create_time datetime DEFAULT NULL COMMENT ‘创建时间’,
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id),
UNIQUE KEY IDX_APPCODE (phone,app_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该表创建后binlog解析还是错误 。

如果能执行。。。可能是 dm 里面 parser 版本低了,你 DM 什么版本的?

语句报错原因是字段 row 关键字问题,这边测试mysql 5.7.28 解析创建表语句执行正常,binlog解析结果


这里的的语句row没有加转义字符,导致dm解析的时候,不符合tidb的语法导致报错。
测试mysql创建表时row字段添加转义,binlog里面也包含转义,通过dm解析能通过,在下游tidb也执行正常,

所以这个不是产品bug,还是mysql 和tidb部分语法不兼容的问题。
1、在mysql 5.7.28中 :字段名row 或者row 是等价的都能执行成功;
2、tidbit中:字段名row是关键字执行不成功,添加转义row可以执行成功。

1 个赞

现实问题是 ,需要向TIDB中迁移的数据都是生产的数据,也就意味着无法调整mysql数据库的建表语法问题

当前建议处理方案:
1、一劳永逸方案:排查语法兼容性问题,源端mysql语句做规范,使用mysql和tidb都兼容的语句;
2、临时处理方案:发现不兼容问题进行特殊处理,参照楼上跳过的方案《 使用 TiDB Data Migration 处理出错的 DDL 语句》;

跳不过去 ,一直重复出现

tiup dmctl --master-addr 192.168.165.25:8261 binlog skip ycspt
tiup dmctl --master-addr 192.168.165.25:8261 resume-task ycspt
tiup dmctl --master-addr 192.168.165.25:8261 query-status ycspt
使用上面命令的确可以调过刚才那个表,但是类似的表有 3个 ,多次执行上面 的命令 ,发现错误在这几个表中循环,多次循环 。现在 是 A 表 错误,然后执行上面一组命令 ,发现变为了A2 ,再次执行 又变为了 A3表错误,再次执行变为了A2错误,再次执行又变为A1错误了。往返如此。

我这么执行有问题吗 ?

看下binlog位点推进了没有,如果推进了那说明跳过了。如果位点也是循环的那说明还有点问题。