MySql的時區(serverTimezone)引起的血案

前言

mysql8.x的jdbc升級了,增長了時區(serverTimezone)屬性,而且不容許爲空。mysql

血案現場

配置jdbc的URL:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true

應用運行一段時間後,發現數據庫中登記的時間和正常的時間不一致。linux

查詢表字段值:sql

 

 而如今電腦的時間是:數據庫

 

 問題排查

一、服務器時間不一樣步服務器

使用命令:date,查看linux服務器時間spa

[root@abc ~]# date
Sat Mar  7 18:43:30 CST 2020

服務器的機器時間沒有問題code

二、程序問題cdn

uLog.setLogTime(new Date());

程序是使用的機器時間,不會有問題server

三、數據庫時間blog

查看數據庫時間:select sysdate()

mysql> select sysdate();
+---------------------+
| sysdate()           |
+---------------------+
| 2020-03-07 18:48:01 |
+---------------------+
1 row in set

時間也是沒有問題,最後考慮到jdbc增長了時區屬性

問題根源

UTC是什麼時區

不屬於任意時區  。協調世界時,又稱世界統一時間,世界標準時間,國際協調時間,簡稱UTC。

時區(Time Zone)是地球上的區域使用同一個時間定義。1884年在華盛頓召開國際經度會議時,爲了克服時間上的混亂,規定將全球劃分爲24個時區。在中國採用首都北京所在地東八區的時間爲全國統一使用時間。

例:已知東京(東九區)時間爲5月1日12:00,求北京(東八區)的區時?北京時間=12:00-(9-8)=11:00(即北京時間爲5月1日11:00)。

 

問題找到了,就是時區字段的問題

解決方法

修改jdbc時區,改爲服務器所在地的真實時區

修改前:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
修改後:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

重啓應用,發現時間是正確的

+---------------------+
| log_time            |
+---------------------+
| 2020-03-07 19:04:06 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:02 |
| 2020-03-07 19:04:02 |
| 2020-03-07 19:03:51 |
| 2020-03-07 10:40:35 |
| 2020-03-07 10:40:35 |
| 2020-03-07 10:40:35 |
相關文章
相關標籤/搜索