【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_DATE
和 NO_ZERO_IN_DATE
,重启dm同步还是报错。
【原因】
DM 会识别同步上游的 sql_mode, 设置为同步链路 session 级别的sql_mode,如果上游的sql_mode设置的是:NO_ZERO_DATE
和 NO_ZERO_IN_DATE,那DM也会设置为:
NO_ZERO_DATE和
NO_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_DATE和
NO_ZERO_IN_DATE`,因此同步就会报错。即使tidb的sql_mode是允许写入’0000-00-00 00:00:00’这样的数据也不行,DM直接就报错了。
【解决办法】
DM 会识别上游sql_mode,也会识别DM配置文件里的sql_mode,并且配置里面有更高的优先级,因此只需要在配置文件里面进行配置,然后重启就可以解决了。