MySQL升级失败无法启动:删除mysql.user表空间SDI报错求助
MySQL升级失败无法启动的修复与回滚方案
从日志信息来看,升级至MySQL 8.0.35时,执行ALTER TABLE user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL;语句失败,错误码3664,核心原因是无法删除mysql表空间中mysql.user的SDI(序列化字典信息),导致升级中断,服务器启动失败。以下是具体修复与回滚方案:
修复方案
方法1:跳过升级检查启动,手动修正表结构
- 停止当前MySQL进程:
sudo systemctl stop mysql - 编辑MySQL配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf),添加以下参数:skip-grant-tables skip-innodb-read-only-compressed - 启动MySQL服务:
sudo systemctl start mysql - 登录MySQL,手动执行表结构修改:
若仍报错,先清理SDI相关统计信息(操作前建议备份数据):ALTER TABLE mysql.user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL;
再重新执行上述ALTER语句DELETE FROM mysql.innodb_table_stats WHERE table_name='user'; DELETE FROM mysql.innodb_index_stats WHERE table_name='user'; - 完成表结构修正后,执行升级收尾:
mysql_upgrade -u root -p - 移除配置文件中添加的
skip-grant-tables和skip-innodb-read-only-compressed参数,重启MySQL服务:sudo systemctl restart mysql
方法2:修复mysql表空间权限或损坏
- 检查mysql.user表空间文件权限,确保归属mysql用户组:
chown mysql:mysql /var/lib/mysql/mysql/user.ibd - 使用
innochecksum检查表空间完整性:
若检测到损坏,从备份恢复该表空间文件后,重新启动升级流程。innochecksum /var/lib/mysql/mysql/user.ibd
回滚方案
若修复难度较大,可回滚至升级前版本:
- 停止当前MySQL进程:
sudo systemctl stop mysql - 备份当前数据目录到安全位置:
cp -r /var/lib/mysql /var/lib/mysql_backup_8035 - 卸载当前8.0.35版本,安装升级前的MySQL版本
- 将备份的旧版本数据目录替换回
/var/lib/mysql,调整权限:chown -R mysql:mysql /var/lib/mysql - 启动旧版本MySQL,验证数据完整性
内容的提问来源于stack exchange,提问作者Durgesh
相关产品推荐
相关产品推荐

