MySQL datetime 类型,cdc拿到的binlog是 long类型,晚了8小时,如何解决?配置了.serverTimeZone("Asia/Shanghai"),不管用
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
问题背景: 您在使用MySQL CDC过程中发现,datetime
类型的数据通过Binlog传输后,在Flink中被解析为long
类型,并且时间显示晚了8小时。尽管您已经尝试配置了.serverTimeZone("Asia/Shanghai")
,但问题依旧存在。
解决方案:
检查自定义序列化器: 首先确认您的Flink作业是否使用了自定义的序列化器来处理Binlog数据。如果使用了类似于MyDeserializer implements DebeziumDeserializationSchema
的自定义序列化逻辑,请确保在解析timestamp
或datetime
字段时正确设置了服务器时区。参考提供的代码示例,确保在转换timestamp
类型时考虑到了正确的时区设置,如TemporalConversions.toLocalDateTime(dbzObj, serverTimeZone)
中的serverTimeZone
应与MySQL服务器时区一致。
Debezium配置验证: 确保Debezium连接器配置中server-time-zone
参数正确无误地设置为了Asia/Shanghai
。此配置是关键,用于告知Debezium如何将MySQL的时间戳转换为UTC时间进行存储和传输,然后在消费端再根据此时区信息转换回本地时间。请检查配置文件或代码中此参数是否生效且无误。
检查Flink作业环境时区: 虽然直接在Flink作业中配置了时区,但请确认Flink运行的JVM以及宿主机环境的默认时区是否可能影响到程序的行为。理想情况下,即使不显式设置.serverTimeZone
,Flink也应该能够基于其运行环境正确处理时间,除非有其他地方覆盖了这个设置。
示例代码调整:
// 在自定义反序列化器中确保时区正确应用
private TimestampData convertToTimestamp(Object dbzObj, Schema schema) {
LocalDateTime localDateTime = TemporalConversions.toLocalDateTime(dbzObj, "Asia/Shanghai"); // 明确指定时区
return TimestampData.fromLocalDateTime(localDateTime);
}
注意事项:
通过上述步骤,您可以定位并解决因时区设置不当导致的时间偏移问题。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。