文档首页/ 数据湖探索 DLI/ 常见问题/ Flink作业类/ Flink SQL作业类/ Flink Opensource SQL从RDS数据库读取的时间和RDS数据库存储的时间为什么会不一致?
更新时间:2024-11-08 GMT+08:00

Flink Opensource SQL从RDS数据库读取的时间和RDS数据库存储的时间为什么会不一致?

问题描述

Flink Opensource SQL从RDS数据库读取的时间和RDS数据库存储的时间为不一致

根因分析

该问题的根因是数据库设置的时区不合理,通常该问题出现时Flink读取的时间和RDS数据库的时间会相差13小时。

请在RDS数据库内执行如下语句

show variables like '%time_zone%'
执行结果如下:
图1 执行结果
表1 参数说明

参数

说明

system_time_zone

数据库时区。

这里它指向 'SYSTEM',也就是数据库服务器的系统时间('system_time_zone')。而这个系统时间在这里指向 CST,所以,最终数据库时区才是 CST。

time_zone

数据库所在服务器的时区,服务器是台主机

如本地数据库所在计算机的默认时区是中国标准时间,则查出来 'system_time_zone' 是 CST。

问题根因:在Mysql的time_zone是SYSTEM,system_time_zone是CST的情况下会造成bug。

CST在mysql里被理解为China Standard Time(UTC+8),但在 Java 里被理解为Central Standard Time (USA)(UTC-5)。

Flink taskmanager本质是一个 java 进程,在Mysql 的jdbc驱动的代码里会设置时区,这个时区是通过TimeZone.getTimeZone(canonicalTimezone) 读取的。也就是说,读取的是CST(UTC+8),但真正设置的时区却是CST(UTC-5)。

解决方案

  1. 数据库设置 time_zone 的值为非 SYSTEM,比如 +08:00。
  2. 设置jdbcUrl时带上时区。

    例如‘jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai’。