暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL Error 1298 错误 Unknown or incorrect time zone: 'Asia/Shanghai' 的修复

原创 Rock Yan 云和恩墨 2023-10-18
1739

问题概述

  阿里云本RDS在本地的从库,主从复制过程中报错:Last_Errno 1298; Last_Error: "Unknown or incorrect time zone: “Asia/Shanghai”’ on query. Default database: "XXX’. Query: “BEGIN”
截图如下:
image.png

查询本地从库信息:

root@localhost:(none) 10:32:40 >show global variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | +08:00 |
+------------------+--------+
## 说明:本地从库时区为东八区 +08:00 

复制

  本地从库时区就是东八区,与错误提示中Asia/Shanghai是同一个时区,但是错误提示中看出,MySQL数据库无法识别Asia/Shanghai,推测MySQL系统内部无法进行Asia/Shanghai到 +08:00 的转换 导致出现错误,通过设置来做验证:

root@localhost:(none) 10:19:49 >set globaltime_zone='Asia/Shanghai';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Shanghai'
## 果然,MySQL内部无法进行时区的转换,也无法设置文字时区。
复制

问题原因

  MySQL默认不支持’Asia/Shanghai’这种时区格式,故在SQL执行中如果有SQL或者存储过程进行对时区的设置,涉及到文字时区转换时,就会报错。

解决方案

访问官方地址:
https://dev.mysql.com/downloads/timezones.html
下载时区文件
image.png

  下载后解压执行timezone_posix.sql 即可:

mysql -u root -ppassword
use mysql;
source /full/path_to_sqlfile/timezone_posix.sql
复制

  由于我们本地从库为5.6版本,目前官方地址并没有给出5.6版本的相关脚本路径,只有5.7以上版本的,故担心版本问题没有执行,从而选择另外一种方式进行尝试:

参考命令:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot mysql -p

实际命令:
/data/mysql/mysql8034/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /data/mysql/mysql8034/bin/mysql -uroot -pmysql mysql --socket=/data/mysql/8034/run/mysql.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.

命令说明:
mysql_tzinfo_to_sql是MySQL自带的命令程序,在MySQL软件的bin目录中可以查到,该命令的作用就是来填充MySQL 时区表(一次加载操作系统支持的所有时区),mysql_tzinfo_to_sql命令会读取您系统的时区文件并生成SQL语句来插入到MySQL的时区表中。注意:这种方式不会导入跳秒信息到time_zone_leap_second表中,需要单独操作。

## 说明:命令执行完毕后,发现 MySQL库下面的对应表都有数据了,执行执行是没有数据的:
root@localhost:mysql 11:03:13 >select count(*) from time_zone;
+----------+
| count(*) |
+----------+
|     1783 |
+----------+
1 row in set (0.00 sec)

root@localhost:mysql 11:03:21 >select count(*) from time_zone_name;
+----------+
| count(*) |
+----------+
|     1783 |
+----------+
1 row in set (0.00 sec)

root@localhost:mysql 11:03:26 >select count(*) from time_zone_transition;
+----------+
| count(*) |
+----------+
|   118825 |
+----------+
1 row in set (0.00 sec)

root@localhost:mysql 11:03:35 >select count(*) from time_zone_transition_type;
+----------+
| count(*) |
+----------+
|     8728 |
+----------+
1 row in set (0.00 sec)


## 最后通过设置时区,也不再报错,
root@localhost:mysql 11:03:49 >set global time_zone='Asia/Shanghai';
Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql 11:08:37 >show variables like '%time_zone%';
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| system_time_zone | CST           |
| time_zone        | Asia/Shanghai |
+------------------+---------------+
2 rows in set (0.00 sec)

root@localhost:mysql 11:08:39 >set time_zone='+08:00';
Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql 11:09:07 >show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)


复制

  至此问题解决,重新启动从库复制进程,同步正常:

mysql> stop slave;
mysql> start slave;
mysql> show slave status\G


     Slave_IO Running:Yes
    Slave_SQL_Running:Yes
           Last_Error:
Seconds Behind Master:0
   Retrieved_Gtid_Set:05ec2ca4-67d1-1lee-a27e-506b4b2f585c:13566-14338
    Executed_Gtid_Set:05ec2ca4-67d1-1lee-a27e-506b4b2f585c:1-14338

## 从库同步状态正常,双YES,无报错,无延迟
复制

参考文档

https://dev.mysql.com/downloads/timezones.html
https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html

最后修改时间:2023-10-19 10:33:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

目录
  • 问题概述
  • 问题原因
  • 解决方案
  • 参考文档