CentOS 7.4下MySQL 8.0启动失败:无法从5.7以下版本升级
解决CentOS 7.4上MySQL 8.0启动失败的问题
从你贴出的错误日志来看,核心问题非常明确:
[ERROR] [MY-013168] [InnoDB] Cannot upgrade server earlier than 5.7 to 8.0
MySQL 8.0对数据字典(DD)做了彻底的重构,官方明确要求:不能直接从低于5.7的版本升级到8.0,必须先升级到5.7版本完成数据兼容,才能再升级到8.0。下面分两种场景给你具体的解决步骤:
场景1:不需要保留旧数据,全新初始化MySQL 8.0
如果这是新安装,或者旧数据可以舍弃,直接清理旧数据重新初始化即可:
- 先停止故障的MySQL服务:
systemctl stop mysqld - 备份旧数据目录(以防万一,后续可按需删除):
mv /var/lib/mysql /var/lib/mysql_old - 初始化MySQL 8.0:
mysqld --initialize --user=mysql - 查看自动生成的临时root密码:
cat /var/log/mysqld.log | grep 'temporary password' - 启动MySQL服务:
systemctl start mysqld - 登录并修改root密码(替换成你自己的强密码):
登录后执行SQL命令修改密码:mysql -uroot -pALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
场景2:需要保留旧数据,先升级到5.7再过渡到8.0
如果必须保留原有数据,就得按官方要求的分步升级流程来:
第一步:卸载当前的MySQL 8.0
- 停止服务:
systemctl stop mysqld - 卸载MySQL 8.0相关包(注意不要删除数据目录
/var/lib/mysql):yum remove mysql-community-server mysql-community-client mysql-community-common mysql-community-libs
第二步:安装并升级到MySQL 5.7
- 配置MySQL 5.7的YUM源:创建
/etc/yum.repos.d/mysql-community.repo文件,写入以下内容:[mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql - 安装MySQL 5.7:
yum install mysql-community-server - 启动5.7服务:
systemctl start mysqld - 完成数据升级检查(初始密码同样在
/var/log/mysqld.log里查找):
确保这个命令执行无报错,说明旧数据已成功适配5.7版本。mysql_upgrade -uroot -p
第三步:升级到MySQL 8.0
- 修改YUM源,切换到8.0仓库:编辑
/etc/yum.repos.d/mysql-community.repo,把mysql57-community的enabled改为0,mysql80-community的enabled改为1(如果没有这个小节,可手动添加):[mysql80-community] name=MySQL 8.0 Community Server baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql - 升级安装MySQL 8.0:
yum update mysql-community-server - 启动8.0服务:
systemctl start mysqld - 再次执行升级检查,确保数据适配8.0:
mysql_upgrade -uroot -p
注意事项
- 备份优先:不管哪种场景,操作前一定要备份好
/var/lib/mysql目录和相关配置文件,避免数据丢失。 - YUM源验证:执行安装/升级前,可用
yum repolist enabled | grep mysql命令确认当前启用的是目标版本的仓库。 - 权限排查:如果启动后仍有问题,可以暂时关闭SELinux(
setenforce 0)和防火墙(systemctl stop firewalld)排查是否是权限或端口限制导致的问题。
内容的提问来源于stack exchange,提问作者vens




