检查时区
mysql> show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+
设置时区
直接安装mysql下,默认取系统时区基本不需要配置,除非要指定其他时区
1、命令行
设置MySQL时间为北京时间
mysql> set global time_zone = '+8:00'; Query OK, 0 rows affected mysql> set time_zone = '+8:00'; Query OK, 0 rows affected mysql> flush privileges; Query OK, 0 rows affected
mysql> show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | +08:00 | +------------------+--------+ mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2022-07-19 18:57:35 | +---------------------+ 1 row in set
2、配置文件
MySQL的配置文件:my.cnf(Linux)或 my.ini(Windows)。 打开配置文件,在 [mysqld] 部分添加以下行:
[mysqld] default-time-zone='Asia/Shanghai'
3、docker模式
查看 Mysql 时区配置属性。
show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ 查看 Docker 容器系统所处时区。
date -R # Result: Mon, 15 May 2023 15:50:42 +0000创建 Mysql 容器时忘记选择时区,这时 Docker 会默认给选择 UTC 时区。 Docker 容器所在的系统的默认时区为 +0000。 Mysql 配置文件添加 default-time_zone=‘+8:00’ 后,重启 Mysql 容器时区设置无效,分析 Mysql 服务强制使用其所在容器系统的时区。
解决方案
第一种方法:
通过修改 Mysql 的 Variables 属性,临时修改,重启后无效。
# 进入容器 docker exec -it mysql1 /bin/bash # 连接 mysql 服务 mysql -uroot -p # 设置全局会话时区 set global time_zone = '+08:00'; # 设置当前会话时区 set session time_zone = '+08:00'; # 设置后查看 Mysql 时区配置属性。 show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | +08:00 | +------------------+--------+
第二种方式:
通过修改 Docker 容器所使用的时区,永久修改。
# 进入容器 docker exec -it mysql1 /bin/bash # 下列方法 1~3 中任选其一即可: # 1.强制生成 Asia/Shanghai 时区文件软链接 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 2.Asia/Shanghai 软链接实际指向 PRC 文件,将其复制为 localtime 时区文件 cp /usr/share/zoneinfo/PRC /etc/localtime # 3.通过 tzselect 命令,可选择 Beijing、HongKong 城市时区 tzselect # 修改后查看当前容器时区 date -R Mon, 15 May 2023 23:05:49 +0800 # 连接 mysql 服务 mysql -uroot -p # 设置后查看 Mysql 时区配置属性。 show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +------------------+--------+
第三种方式:
dockerr命令或docer-compse 命令重新生成,指定时区
#群晖 docker compose version: '3.7' services: app: image: mysql:latest container_name: chris_mysql restart: always network_mode: bridge ports: - 3306:3306 # - 33060:33060 environment: - MYSQL_ROOT_PASSWORD=xxxxX #重要,指定时区,否则mysql强制按docker时区,改my.cnf也没有用 - TZ=Asia/Shanghai volumes: - "/volume1/docker/mysql/conf:/etc/mysql/conf.d" - "/volume1/docker/mysql/log:/var/log/mysql" - "/volume1/docker/mysql/mysql-files:/var/lib/mysql-files" - "/volume1/docker/mysql/data:/var/lib/mysql"