从MySQL 8.0.12原地升级至8.0.32时遇数据字典datetime错误求助
MySQL 8.0.12升级到8.0.32时数据字典零日期错误的解决方法
问题分析
从MySQL 8.0.12原地升级到8.0.32时,数据字典升级失败,核心原因是mysql.st_spatial_reference_systems表的last_altered列存在0000-00-00 00:00:00值,而8.0.32默认SQL模式包含NO_ZERO_DATE,禁止这类无效日期,导致系统表插入操作失败。由于这是MySQL系统数据字典表,默认无法直接修改,需要通过临时调整配置或回退版本处理。
解决方案
方案一:临时调整SQL模式完成升级
- 停止无法启动的8.0.32 MySQL服务。
- 打开MySQL配置文件(Windows为
my.ini,Linux为my.cnf),在[mysqld]段落添加以下配置:
该配置会临时关闭零日期校验,允许系统完成数据字典升级。sql_mode=ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTION - 重新启动8.0.32服务,此时数据字典升级将正常执行。
- 升级完成后,使用root账号登录MySQL,修正零日期数据:
UPDATE mysql.st_spatial_reference_systems SET last_altered = '1970-01-01 00:00:01' WHERE last_altered = '0000-00-00 00:00:00'; - 恢复默认的严格SQL模式(示例为MySQL 8.0默认模式),修改配置文件中的
sql_mode为:sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION - 重启MySQL服务,完成最终配置。
方案二:回退到8.0.12修改数据后再升级
- 停止8.0.32服务,恢复原8.0.12的二进制执行文件。
- 启动8.0.12服务,使用root账号登录,执行SQL修正零日期:
若提示权限不足,确认使用的是拥有最高权限的root账号,或临时调整UPDATE mysql.st_spatial_reference_systems SET last_altered = '1970-01-01 00:00:01' WHERE last_altered = '0000-00-00 00:00:00';innodb_force_recovery参数(仅必要时使用)。 - 停止8.0.12服务,重新替换为8.0.32二进制文件,正常启动服务完成升级。
注意事项
- 务必先备份数据:修改系统表或升级前,全量备份数据库避免数据丢失。
- 升级完成后必须恢复严格SQL模式,防止后续出现无效日期数据问题。
- 若找不到配置文件,可通过命令行临时启动服务:
# Windows示例 mysqld --sql-mode="ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTION" # Linux示例 mysqld_safe --sql-mode="ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTION" &
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

