Flink CDC MySQL 时区相差 8 小时问题优雅解决方式
Flink CDC MySQL 时区相差 8 小时问题解析
代码运行环境
Flink 1.15 + FlinkCDC 2.4.0 + jdk1.8 +springboot 2.3
1、原因分析
Flink CDC 底层使用 Debezium 连接器来捕获 MySQL 的数据变更,而 Debezium 在解析 MySQL 的 binlog 日志时,默认使用 UTC 时区来处理时间字段。若 MySQL 服务器的时区设置为 UTC+8,而 Debezium 未进行相应的时区配置,就会导致时间数据相差 8 个小时。此外,MySQL 本身也有时区设置,其默认使用 UTC 时间戳来存储时间数据,在查询时可能会根据服务器的时区设置进行转换。如果 Flink 读取数据时没有正确处理时区,就会导致时间的展示与数据库中的实际时间存在 8 小时的差距。
2、解决方案
- 自定义时间转换类 :通过实现 Debezium 的序列化接口,自定义时间转换逻辑,在解析 timestamp 字段时,将其从 UTC 转换为所需的时区,如 Asia/Shanghai。