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。