MySQL8.0启动报系统表损坏 mysql_upgrade废弃如何修复
故障场景说明
- 运行环境:Ubuntu 20.04,部署MySQL Server版本为8.0.29-0ubuntu0.20.04.3
- 触发原因:设备强制关机后MySQL服务无法正常启动,启动日志出现系统表损坏报错
- 核心报错日志:
2022-07-01T12:13:08.666633Z 0 [Warning] [MY-013139] [Server] Cannot load from mysql.proxies_priv. The table is probably corrupted! 2022-07-01T12:13:08.666748Z 0 [ERROR] [MY-010316] [Server] Fatal error: Could not read the column 'authentication_string' from table 'mysql.user'. Please perform the MySQL upgrade procedure. 2022-07-01T12:13:08.666825Z 0 [ERROR] [MY-010952] [Server] The privilege system failed to initialize correctly. For complete instructions on how to upgrade MySQL to a new version please see the 'Upgrading MySQL' section from the MySQL manual. 2022-07-01T12:13:08.667187Z 0 [ERROR] [MY-010119] [Server] Aborting
- 额外限制:原用于修复表结构的
mysql_upgrade客户端在该版本已被废弃,相关逻辑已整合至MySQL服务端,直接执行该工具会收到废弃提示,无法完成修复。
修复操作步骤
操作前建议先对默认数据目录/var/lib/mysql做全量拷贝备份,避免操作异常导致数据丢失
清理残留进程
先停止系统中可能残留的MySQL服务及进程,避免文件锁占用:systemctl stop mysql ps aux | grep mysqld如果第二条命令输出中存在仍在运行的
mysqld进程,执行kill -9 对应进程PID清理即可。强制触发服务端内置修复流程
MySQL 8.0.16之后的版本已经把原mysql_upgrade的系统表检查、修复、升级逻辑整合到了服务端启动流程中,执行以下命令用强制升级模式启动MySQL,服务端会自动扫描并修复损坏的系统表:mysqld --upgrade=FORCE --user=mysql &等待1-2分钟后观察日志输出,当看到服务端启动完成、没有报错信息后,执行本地登录验证:
mysql -u root -p能正常登录、执行
show databases;等基础命令无报错的,说明修复完成。执行以下命令优雅关闭手动启动的mysqld进程:mysqladmin -u root -p shutdown之后用系统服务管理器正常启动MySQL即可:
systemctl start mysql systemctl enable mysql强制升级模式启动失败的手动修复方案
如果--upgrade=FORCE模式下仍启动失败,就用最小升级模式启动服务,跳过自动升级流程,进入实例后手动修复损坏的系统表:mysqld --upgrade=MINIMAL --user=mysql &登录MySQL实例后依次执行以下修复命令:
REPAIR TABLE mysql.proxies_priv; REPAIR TABLE mysql.user; FLUSH PRIVILEGES;执行完成后同样优雅关闭手动启动的mysqld进程,再通过systemd正常启动服务即可。
修复完成后可执行
systemctl status mysql检查服务运行状态,确认服务为active(running)状态、无异常报错输出即为修复成功。
内容的提问来源于stack exchange,提问作者user2194805
相关产品推荐
相关产品推荐

