版本:canal.deployer-1.1.3 mysql5.7.2 timestamp类型的字段,通过column.getValue()时,取出时间有误。相差12小时。
字段定义: event_time timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4),
insert into tm(event_time,start_date) VALUES('2019-06-15 11:27:01.905','2019-06-15 11:27:01') 读取到的数据: ventType : INSERT id : 15 update=true event_time : 2019-06-14 23:27:01.905 update=true start_date : 2019-06-15 11:27:01 update=true
原提问者GitHub用户barlowzj
估计是数据库的时区问题,可以查询物理的binlog文件,通过mysqlbinlog解析看看
原回答者GitHub用户agapple
timestamp 类型的字段在 Canal 中默认会被解析为时间戳类型,因此在通过 column.getValue() 方法读取时,可能会发生时区转换的问题,导致读取到的时间有误。为了解决这个问题,可以尝试以下方法:
修改数据类型:将 timestamp 类型的字段改为 datetime 类型的字段,这样可以避免时区转换的问题,并保证读取到的时间是正确的。可以使用 SQL 语句修改数据表的结构,例如: ALTER TABLE table_name MODIFY event_time datetime(3) DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4);
修改 Canal 配置:可以通过修改 Canal 的配置文件 canal.properties,将解析 timestamp 类型的字段的转换规则修改为 DATETIME。具体来说,可以在配置文件中添加以下配置: canal.instance.filter.regex=.* canal.instance.filter.black.regex=mysql.binlog..* canal.instance.filter.druid=false canal.instance.filter.field=list canal.instance.filter.query.dcl=false canal.instance.filter.query.dml=false canal.instance.filter.table.error=false canal.instance.filter.table.regex=.* canal.instance.filter.transaction=true canal.instance.filter.ddl=false canal.instance.filter.skip.dml=false canal.instance.filter.skip.ddl=false canal.instance.filter.skip.query.dcl=false canal.instance.filter.skip.query.dml=false canal.instance.filter.skip.query.ddl=false canal.instance.parser.mode=mysql canal.instance.mysql.slaveId=1234 canal.instance.enable.table.meta.manager=false canal.instance.binlog.mode=ROW canal.instance.binlog.position.reset=true canal.instance.gtidon=false canal.instance.tsdb.enable=false canal.instance.tsdb.url=jdbc:mysql://ip:3306/canal_tsdb canal.instance.tsdb.dbUsername=canal canal.instance.tsdb.dbPassword=canal canal.instance.tsdb.batchGetSize=1000 canal.instance.channel.memoryBatchSize=25 canal.instance.channel.memoryTransactionBatchSize=1000 canal.instance.channel.fileBackupDir=/data/canal/canal/canal_log canal.instance.channel.checkValid=false canal.instance.channel.recoverMode=crash canal.instance.memoryTable=false canal.instance.network.receiveBufferSize=65535 canal.instance.network.sendBufferSize=131072 canal.instance.network.soTimeout=30s canal.instance.network.readTimeout=30s canal.instance.network.idleTimeout=5m canal.instance.network.bindIp= canal.instance.network.zookeeper.address= canal.instance.network.zookeeper.sessionTimeout=5000 canal.instance.network.zookeeper.retryTimes=3 canal.instance.network.zookeeper.retryInterval=1000 canal.instance.network.zookeeper.heartbeat.enable=true canal.instance.network.zookeeper.heartbeat.topic= canal.instance.network.zookeeper.heartbeat.interval=5000 canal.instance.network.zookeeper.heartbeat.ttl=15000 canal.instance.network.zookeeper.group= canal.instance.network.zookeeper.rootNode= canal.instance.network.zookeeper.authEnable=false canal.instance.network.zookeeper.authUsername= canal.instance.network.zookeeper.authPassword=
需要注意的是,在修改 Canal 的配置时,也需要保证时间是正确的。可以通过修改服务器的时区设置,或者在 Canal 的参数中设置时间偏移量等方式来解决时间问题。同时,在修改数据类型时,也需要注意数据的兼容性和正确性,以避免出现数据不一致或查询错误的问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。