DM同步上下游字段类型不一致时,DM任务不报错,但数据存在异常

【 TiDB 使用环境】测试
【 TiDB 版本】 8.1.0
【复现路径】
– 初始化结构mysql/tidb:
CREATE TABLE t2 (
id int(11) NOT NULL,
dt datetime DEFAULT NULL,
c1 int(11) DEFAULT NULL,
PRIMARY KEY (id)
);
– a. 正常int类型在mysql或者tidb测试插入字符则会报下述异常:
– mysql: Incorrect integer value: ‘b’ for column ‘c1’ at row 1
– tidb: Truncated incorrect DOUBLE value: ‘b’

– b. 错误将下游的c1改为varchar,此时dm任务不报错,由于存在兼容数据展示未错乱
–tidb: alter table t2 modify c1 varchar(20) DEFAULT NULL;
insert into t2 select 1,now(),1;
select * from t2;

– c. 错误将上游的c1改为varchar,而下游的c1依旧是int时,此时dm任务不报错,字符串的数据在下游存在错乱
– mysql:alter table t2 modify c1 varchar(20) DEFAULT NULL;
– tidb: alter table t2 modify c1 int(11) DEFAULT NULL;
insert into t2 select 3,now(),‘123’;
insert into t2 select 2,now(),‘b’;
select * from t2;

问题:
遇到字段类型不一致情况,dm并未报错,这个问题请问有人遇到过么,比如是否有什么地方可以设置为严格模式呢,谢谢

需要设置 dm 任务的 sql_mode,关键是加上 STRICT_TRANS_TABLES 这个,推荐与上游一致吧,参考:
https://docs.pingcap.com/zh/tidb/stable/task-configuration-file-full#完整配置文件示例

用 DM 同步时,不建议在下游还有写入操作!!!

1 个赞

下游给dm单独配置一个用户,其他人不要给ddl权限。能select就行了。

两边sql_mode是一致的
下游限制权限是可以做到结构不变更
但是想的是dm本身是否应该会在某一层进行目的或源端的结构校验呢

dm 是逻辑同步,支持上下游不一致的情况(下游多列),所以不会检验表结构的,建议自己用 sync_diff 做表结构检验

做迁移时,表结构得一样。最好提前做下表结构比对

那这样的话,可以加强管理层面,保证上下游结构一致