mysql重装失败主因是残留文件未清,包括旧进程、socket、pid、日志及配置;需停服务、卸包、清空/var/lib/mysql、/etc/my.cnf*、/run/mysqld等目录,并检查端口与依赖冲突。

直接卸载旧 MySQL 后不清理残留,新装的 mysqld 会启动失败,日志里反复报 Can't start server: Bind on TCP/IP port. Got error: 98: Address already in use 或直接卡在 Starting MySQL... FAILED!——这不是安装问题,是旧进程、旧 socket、旧 PID、旧日志没清干净。
先停服务再查包,别跳步
MySQL 5.7 在 CentOS 7 上常与系统自带的 mariadb-libs 冲突,且可能有多个残留进程。必须按顺序执行:
-
systemctl stop mysqld(如果存在) -
systemctl stop mariadb(CentOS 7 默认带,不关它,mysql-community-server安装时会报依赖冲突) -
rpm -qa | grep -i 'mysql\|mariadb'查出所有相关包,包括mysql57-community-release和mariadb-libs - 逐个
rpm -e --nodeps 包名卸载,尤其不能漏掉mariadb-libs,否则yum install mysql-community-server会因依赖报错中断
删文件比卸包更关键
卸包只是移除 RPM 数据库记录,真正导致启动失败的是磁盘上残留的运行态文件。以下路径必须手动清空:
-
/var/lib/mysql:数据目录,不清会导致初始化失败或权限错误 -
/var/log/mysqld.log:旧日志若存在,新实例会尝试复用它,但权限/内容不匹配,mysqld --initialize无法生成新密码 -
/etc/my.cnf和/etc/my.cnf.d/下所有文件:配置残留可能启用skip-grant-tables或错误端口,让服务监听失败 -
/run/mysqld/和/var/run/mysqld/:socket 文件和 PID 文件所在目录,残留mysqld.pid会让 systemd 认为服务“已运行”而拒绝启动
执行完后跑一遍 find / -name "*mysql*" -prune -o -name "*mariadb*" -prune 2>/dev/null | grep -E '/(var|etc|run)',确认无有效残留。
安装时绕过 GPG 和源冲突
官方 YUM 源在国内常因证书或网络超时失败。推荐组合操作:
- 下载对应版本的 repo 包(如
mysql57-community-release-el7-11.noarch.rpm),用wget或本地上传 - 安装前导入密钥:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022(注意不是旧的 2018 密钥) - 安装 repo:
rpm -ivh mysql57-community-release-el7-11.noarch.rpm - 禁用 MySQL 8.0 源(默认开启):
yum-config-manager --disable mysql80-community,再启用 5.7:yum-config-manager --enable mysql57-community - 安装服务:
yum install -y mysql-community-server --nogpgcheck(仅首次安装临时跳过校验,避免GPG key retrieval failed)
初始化后别急着登录
启动 mysqld 后,/var/log/mysqld.log 里只有一行含 temporary password 的日志才是有效初始密码。常见坑:
- 日志里出现多条
password,只取mysqld --initialize成功后最后一条(不是A temporary password is generated for root@localhost上面那条) - 用该密码登录后,MySQL 5.7 默认强制修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';,密码必须含大小写字母+数字+特殊字符,否则报ERROR 1819 (HY000): Your password does not satisfy the current policy requirements - 若想跳过复杂度检查,先执行:
set global validate_password_policy=LOW;,再设密码长度:set global validate_password_length=6;,但仅限测试环境
真正容易被忽略的是:改完密码后必须立刻执行 flush privileges;,否则远程授权、字符集修改等后续操作会因权限缓存失效而静默失败。











