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


前言

mysql8.x的jdbc升級了,增加了時區(serverTimezone)屬性,並且不允許為空。

血案現場

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

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

查詢表字段值:

 

 而現在電腦的時間是:

 

 問題排查

1、服務器時間不同步

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

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

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

2、程序問題

uLog.setLogTime(new Date());

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

3、數據庫時間

查看數據庫時間: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 |


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM