问题现象
用户通过MySQL JDBC客户端连接DRDS实例执行SELECT查询,发现表中字段类型为timestamp的字段返回的时间与北京时间相差几个小时,比较常见的包括8小时、13小时、14小时等(1-24小时都可能)。
排查方法
- 查看DRDS的MySQL实例的时区配置,比如show global variables like '%time_zone%',确认MySQL当前的时区配置。
- 查看当前JDBC客户端的连接参数,是否设置severTimezone参数。
- 对比MySQL和JDBC客户端的时区配置是否合理。
原因分析
- 本质原因是:MySQL实例的时区和JDBC客户端的时区设置的不一样,导致出现误差。
- 如数据库时间与北京时间相差8小时,可能是MySQL的system_time_zone参数为UTC,time_zone为SYSTEM,而北京时间为UTC+8:00,比UTC快8小时,因此可能看到差8个小时。此时,可以修改MySQL实例的time_zone参数为Asia/Shanghai,或者在JDBC驱动中设置severTimezone参数为Asia/Shanghai。
- 如数据库时间与北京时间相差13或14小时,可能是MySQL的system_time_zone参数为CST,time_zone为SYSTEM,JDBC 连接到 MySQL 把 CST 时区识别成了美国中部标准时间(UTC-6:00,即比UTC慢8小时,夏令时为UTC-5:00),而北京时间比UTC快8小时,因此可能看到差14个小时(夏令时为13小时)。
- 同理,发现时差为其他情况的(1-24小时皆有可能),本质也是时区设置问题。
解决方法
修改MySQL实例的时区配置,或者在MySQL JDBC驱动连接参数中主动配置severTimezone参数,确保客户端和MySQL实例时区一致。