解决mysql数据库时间时区问题的四种方法:
一、连接时加上时区设置参数(但是我在测试时删除和增加这个设置没影响,但是还是习惯性加上,猜想可能是高版本mysql已经没有这个问题,我是用的mysql 8.0.18):
&serverTimezone=GMT%2B8
二、设置Linux时区,如果mysql是直接安装在Linux服务器上,查看一下Linux时间,如果不对会有影响:
命令:
查看时间及时区:date -R
修改时区为东八区:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
三、设置docker时区,如果mysql是启动的docker里面的镜像,需要查看docker的时区是否正确,如果不对就需要修改:
命令:
查看docker中正在运行的镜像:docker ps
进入mysql进行:docker exec -it xxx bash(xxx:镜像id)
查看时间及时区:date -R
修改docker容器时区为东八区:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime(我这边已经改过了所以看不出来效果)
四、修改mysqld.cnf文件(如果mysql装在linux该文件路径为:/etc/mysql/mysql.conf.d/mysqld.cnf,如果是在docker运行的镜像一般都有挂载的外部文件,我们是用到了docer compose,直接去对应的yaml文件就可以找文件路径):
yaml文件内容(冒号前面的是挂载的linux,后面的是docker容器中对应的路径):
修改mysqld.cnf文件,修改linux目录里面的就行,增加 default-time_zone = '+8:00' ,然后重启。
一般来说就可以了, 如果还是不行就进入docker里面的mysql设置一下时区就可以了,这个不知道是什么原因,因为设置的应该是当前会话的时区,不是全局的,但是不知道为什么,设置完后远程连接也ok了,总之我是这样解决的。
进入docker容器中的mysql镜像:docker exec -it 72dfc10fbd89 bash
进入mysql:mysql -uroot -p
查看当前时区:show variables like "%time_zone"; (我这边已经改过,已经是显示的正确时区)
设置时区:set time_zone = '+8:00';
注意:
如果linux上退出mysql再登录查看时区还是对的,但是navicat不行,需要把navicat关掉重启一下,可能是第一次连接的时候就已经记录了时区。
补充命令:
查看docker compose正在运行的服务:docker-compose ps(如果有多个docker-compose.yaml文件,需要进入对应的目录)
停止docker compose中正在运行的服务:docker-compose stop xxx (xxx:服务名,可在docker-compose.yaml文件中查看)
启动docker compose中正在运行的服务:docker-compose start xxx (xxx:服务名)
登录mysql后查看当前时间:SELECT CURTIME();
2019-12-9 更新:今天服务器断电重启后又出现时区问题了,怎么设置都不生效,最后设置为 default-time_zone = 'HongKong' 后重启mysql服务解决问题,然后再改成 default-time_zone = '+8:00' 后重启mysql服务,发现还是正常的,不知道什么原因怀疑是mysql 8的bug?有知道的小伙伴欢迎探讨。