困擾的問題終於解決了-docker時區不正確的問題修改記


 前一陣子有一台服務器,mysql的時間比北京時間晚了8個小時。我知道是時區的問題,但是不知道為什么弄成這樣,宿主機沒有問題,后來一看mysql的docker,時區是錯的。

mybatis-plus打印的sql腳本中,包含時間參數的,都被強制減掉了8個小時,我一開始還以為是java方面的問題,原來是docker時區沒有設置正確。mybytis-plus也是等數據庫執行了才把SQL語句打印出來的,問題根源在數據庫的微服務中!

 

看了docker用了什么版本 cat /etc/issue,原來用的是debian 9,不熟悉,加上docker各種命令不安裝,非常難弄。

查看時區 date -R,果然不是北京時間。

千辛萬苦安裝了ntpdate,卻提示 Can't adjust the time of day: Operation not permitted,修改時間也沒有權限。因為docker也算是虛擬機吧,不能修改。

最后發現用宿主機的時間配置文件復制到容器就好了,真是笨,摸索了一兩個小時。。。

docker cp /usr/share/zoneinfo/Asia/Shanghai mysql:/etc/local   

mysql時間正確了,但是查詢的時候時間還是少了8個小時,這時候我才想到,另外一個微服務的容器里面的時區會不會也是錯的?

2019-08-19 00:37:30

熬到半夜了,也不顧頭發快掉光了,繼續研究,打開神器 wireshark 然后輸入tcp.port==3306進行過濾,請求就出來了。尷尬的是我抓包看到的SQL語句就是減少了8個小時的。我好納悶,連別的mysql服務器沒有問題啊,怎么連這個mysql服務器就有問題了呢?雖然我知道就是這台mysql服務器的問題,但我還不明確具體問題出在哪。后來看到wireshark捕獲到的一堆請求,我才想到,在我的 Java 服務啟動時,spring boot 會去和mysql數據庫建立聯系,這時候就會獲取mysql的時區,所以最根本的問題就是mysql的時區設置了!

雖然mysql容器里面的操作系統時區改了,但是我忘記了修改mysql的時區,所以show variables like '%time_zone%'查詢出來是這樣的:

Variable_name        Value
system_time_zone    CST
time_zone               SYSTEM

想想自己真是蠢貨啊。容器里面改不了,只好在宿主機改了,再復制進去。

[root@localhost ~]# docker cp mysql:/etc/mysql/my.cnf ./my.cnf
[root@localhost ~]# vim my.cnf
[root@localhost ~]# docker cp my.cnf mysql:/etc/mysql/my.cnf
[root@localhost ~]# docker restart mysql
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

default-time-zone = '+8:00'

設置后,重啟mysql容器,docker restart mysql,然后查詢變量,show variables like '%time_zone%'查詢出來是這樣的:

Variable_name        Value
system_time_zone    CST
time_zone               +08:00

后來再啟動服務一看,終於好了。可以睡覺了,畢竟頭發不多了。


免責聲明!

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



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