前一陣子有一台服務器,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
后來再啟動服務一看,終於好了。可以睡覺了,畢竟頭發不多了。
