只执行yum remove mysql*或rpm -e不足以彻底卸载,必须停止服务、批量卸载所有mysql/mariadb相关包、手动删除/var/lib/mysql、/etc/my.cnf及SELinux模块、清理Docker卷、用户组和临时文件,并验证进程、端口、句柄无残留后方可重装。

直接说结论:只执行 yum remove mysql* 或 rpm -e 不足以彻底卸载,残留的 /var/lib/mysql、/etc/my.cnf、SELinux 模块、Docker 卷挂载点,甚至 MariaDB 冲突组件,都会导致重装时服务启动失败、初始化卡住、密码无法获取或端口被占——这些才是报错的真正源头。
先停服务再查包,别跳过 mariadb
CentOS 7 默认预装 mariadb,它和 MySQL 共用 3306 端口、/var/lib/mysql 目录、/etc/my.cnf 配置路径。不一并处理,新 MySQL 启动必然失败。
- 一次性停掉所有可能冲突的服务:
systemctl stop mysqld mariadb - 确认无残留进程:
ps aux | grep -E "(mysqld|mariadb)",输出为空才算干净 - 查全所有相关包(大小写都要覆盖):
rpm -qa | grep -E "mysql|mariadb",常见有mysql-community-server、mariadb-libs、mysql57-community-release等 - 强制批量卸载:
rpm -qa | grep -E "mysql|mariadb" | xargs yum remove -y,避免漏包
删配置和数据目录,/var/lib/mysql 是关键
绝大多数重装报错(如 mysqld: Can't read dir of '/etc/my.cnf.d' (Errcode: 2) 或初始化后 root 密码仍是旧的)都源于没清掉这个目录。它不随 yum remove 自动删除,且会干扰新实例的数据初始化流程。
- 必须手动清除:
rm -rf /var/lib/mysql /etc/my.cnf /etc/my.cnf.d /var/log/mysqld.log - 别忽略 SELinux 残留模块:
rm -rf /etc/selinux/targeted/active/modules/100/mysql,否则新服务可能因策略拒绝启动 - 检查 Docker 是否挂载过 MySQL 数据卷:
docker volume ls | grep mysql,若有则docker volume rm <name>,否则宿主机/var/lib/mysql可能被容器独占
清理用户、组和临时文件,防止权限冲突
MySQL 安装时会尝试创建 mysql 用户和组。如果旧用户仍存在但 UID/GID 已被其他服务占用,新安装可能因权限错误静默失败。
- 检查是否存在:
getent passwd mysql和getent group mysql - 若返回结果,执行:
userdel -r mysql && groupdel mysql(-r确保同时删家目录) - 清空临时残留:
rm -rf /tmp/mysql* /var/log/mysql /usr/share/mysql - 特别注意:
whereis mysql输出的路径(如/usr/lib64/mysql)也要rm -rf,否则某些客户端库仍可能被加载
验证是否真干净,别信“没输出就是成功”
验证不是只跑一遍 rpm -qa | grep mysql 就完事。很多报错来自隐藏路径或未释放的内核资源。
- 查进程:
lsof -i :3306,确保无任何监听进程 - 查文件句柄:
lsof +D /var/lib/mysql 2>/dev/null,输出为空才说明没进程在用该目录 - 查配置残留:
find /etc -name "*mysql*" 2>/dev/null,重点看/etc/logrotate.d/mysql这类易漏项 - 最后一步重装前,执行:
systemctl daemon-reload && systemctl reset-failed,清空 systemd 的失败状态缓存
最常被跳过的其实是 /var/lib/mysql 目录和 SELinux 模块——这两处不手动删,90% 的“重装报错”都会复现。别依赖卸载命令的“自动清理”,CentOS 上没有这种好事。


















