tidb 4.0.8 dm nightly

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:tidb 4.0.8 dm nightly
  • 【问题描述】:mysql 表中缺少update_time, 和create_time字段,先在mysql中添加这连个字段:
    alter table t1 add column create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’;,alter table t1 add column update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’
    查看数据内容发现:tidb、mysql中create_time字段值不同:
    mysql:create_time: 2020-12-18 17:14:40
    tidb:create_time: 2020-12-18 17:14:41
    整个表得create_time得值,tidb和mysql中是不同得

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

可以确认下 mysql 的版本。
mysql 在时间精度表现上会有四舍五入的进位
如下
https://www.jianshu.com/p/ea869123e0e0

如想要确认问题,建议通过 mysqlbinlog 确认记录的 binlog 内容 ,分别在 同版本 mysql 与 TIDB 进行 插入测试。
也可通过调整 mysql datetime 精度,缓解此类问题

mysql 是5.7.27 ,您说的这个时间精度问题,我在mysql上设置时间字段类型的属性为 column create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’;,alter table t1 add column update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,在mysql上设置时间字段类型不能设置:alter table test1220 modify column update_time datetime(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’;
ERROR 1067 (42000): Invalid default value for ‘update_time’

如是 timestamp 类型的 字段,请解析出 对应 binlog 的完整内容,再一并分析下。

不是timestamp 类型,是datetime类型,只是默认值是:default current_timestamp

相关mysqlbinlog解析如下:

at 197748848

#201222 9:23:10 server id 70 end_log_pos 197749106 CRC32 0x2f48667f Query thread_id=62142478 exec_time=1 error_code=0
SET TIMESTAMP=1608600190/!/;
ALTER TABLE db_user.role ADD COLUMN create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘å<88><9b>建æ<97>¶é<97>´’
/!/;
mysql中得数据是:| 2020-12-22 09:23:32 |
tidb中得数据是:2020-12-22 09:23:47
这个怎么解决呢

这是一个 DDL 语句。找到有问题的 DML 语句做下测试

主要是ddl 语句有问题,添加字段两边得值不一样

ok 我大概已经理解你的意思了
这里应该是 TiDB 的一个预期内的情况。
流程梳理下
T1: Mysql ADD Column
T2: DM 收到 DDL Event 在 TiDB 执行 对应 DDL 操作
T3: TiDB 完成 ADD Column 动作
所以 MySQL 的 update_time 的默认时间是 T1
TiDB 的 Update_time 是 T3

这里也可以类比下使用 PT-OSC 工具进行 此 ADD Column 的操作,结果应是 历史上的 各各batch 行的 update_time 各不相同。

有什么解决办法吗

原因上面已经分析了,所以主要引起问题的是 default 值引起的问题,可以的话吧 default 设置成一个初始化的常量就可以了。

目前就是这样解决得,谢谢

:+1::+1::+1: