DM同步数据报错Error 1366 Incorrect datetime value

【TiDB 版本】

 tidb  v4.0.11

【DM 版本】

 dm v2.0.1

【问题描述】

DM同步报错: Error 1366: Incorrect datetime value: ‘0000-00-00 00:00:00’ for column xxxxx,将tidb的sql_mode去掉: NO_ZERO_DATENO_ZERO_IN_DATE,重启dm同步还是报错。

【原因】

DM 会识别同步上游的 sql_mode, 设置为同步链路 session 级别的sql_mode,如果上游的sql_mode设置的是:NO_ZERO_DATENO_ZERO_IN_DATE,那DM也会设置为:NO_ZERO_DATENO_ZERO_IN_DATE,理论上,上游如果设置成这种sql_mode,上游数据库里面不会有'0000-00-00 00:00:00'这样的datetime数据,但是可能会存在上游的数据库客户端在连接数据库过后,针对当前的session修改sql_mode,然后写入'0000-00-00 00:00:00'这样的数据。这样DM就会同步'0000-00-00 00:00:00'这样的数据,而DM的sql_mode又是取的上游的NO_ZERO_DATENO_ZERO_IN_DATE`,因此同步就会报错。即使tidb的sql_mode是允许写入’0000-00-00 00:00:00’这样的数据也不行,DM直接就报错了。

【解决办法】

DM 会识别上游sql_mode,也会识别DM配置文件里的sql_mode,并且配置里面有更高的优先级,因此只需要在配置文件里面进行配置,然后重启就可以解决了。

3 个赞

多谢分享,感觉也可以放到 FAQ 版块里。