用DM从mysql同步到tidb时syncer阶段报错:item is not in enum

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】

【概述】 场景 + 问题概述
用DM从mysql同步到tidb时syncer阶段报错:item is not in enum, 哪位大佬遇到过这个问题?求助
报错信息如下:


【备份和数据迁移策略逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】
tidb版本5.3v
【附件】

  • 相关日志、配置文件、Grafana 监控(https://metricstool.pingcap.com/)
  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview 监控
  • 对应模块的 Grafana 监控(如有 BR、TiDB-binlog、TiCDC 等)
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

2 个赞

Hi,可以用mysqlbinlog看看这个位置附近的原始binlog是什么吗

以及您的tidb版本是多少

2 个赞

问题:
可以发下表结构看看,那个enum类型的字段有个’’(空字符串)的元素存储在这个enum类型的字段里面,可以解析下对应的binlog 确认下。
解决:
1)上游mysql 需要规范数据存储;
2)启用safe-mode,带来的影响 可能会影响同步性能。

2 个赞

感谢您的回复,已经解决了!

1 个赞

谢谢,已经解决!

1 个赞

可以分享一下原因吗,我们这边还在排查 bug :joy:

1 个赞

就是启用了safe-mode,然后重新同步任务就行!

1 个赞

原因就是有空值写入了那个enum类型的字段

1 个赞

是上下游表结构不一致吗,如果上游是 ENUM 的话不能写入空值吧

1 个赞

结构是一致的,上游这个enum字段存在空字符串,我们这个字段默认为空

1 个赞

实际上,mysql是可以insert或者说产生一些非枚举列表中的值。
参考这里:
https://asktug.com/t/topic/362785

3 个赞

请问safe-mode是在dm里面设置的吗?我使用的是5.3,没有找到在哪里配置

task.yaml 里可以加上 safe-mode: true 的配置项

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。