必须先停服务、删包、清数据、去残留,四步缺一不可;否则重装后仍会沿用旧配置或旧密码,甚至启动失败。需依次停止mysqld/mariadb服务并kill残留进程,用rpm全量卸载mysql/maria相关包,删除/var/lib/mysql、/etc/my.cnf等配置与数据目录,清除mysql用户组及隐藏配置文件,最后验证无任何mysql残留。

必须先停服务、删包、清数据、去残留,四步缺一不可;否则重装后仍会沿用旧配置或旧密码,甚至启动失败。
停止服务并确认运行状态
不关服务就卸载,mysqld 进程可能还在写数据,导致后续删文件失败或数据损坏。先查是否在跑:
systemctl status mysqld(MySQL 官方包)systemctl status mariadb(CentOS 自带分支,常被忽略)
两个都得停:
systemctl stop mysqld 2>/dev/nullsystemctl stop mariadb 2>/dev/null
再用 ps aux | grep -E 'mysqld|mariadb' 确认无残留进程 —— 如果还有,kill -9 掉对应 PID。
彻底卸载所有 RPM 包
仅靠 yum remove mysql 往往漏掉 mariadb-libs 或 mysql-community-* 系列包,造成新版本安装时依赖冲突。
正确做法是全量匹配并强制清除:
rpm -qa | grep -E 'mysql|maria' | xargs yum -y remove- 补一刀:
yum remove -y mysql57-community-release mysql80-community-release(这些是源仓库包,不删会影响后续安装源优先级)
执行完再跑一遍 rpm -qa | grep -E 'mysql|maria',输出应为空。
删除数据、配置与用户残留
这是重装失败最常见的原因:旧 /var/lib/mysql 没清,初始化时会跳过密码生成;旧 /etc/my.cnf 或 /etc/my.cnf.d/ 下的文件没删,新服务会加载错误配置。
务必执行:
-
rm -rf /var/lib/mysql(核心数据目录,不删则重装=覆盖启动,不是全新初始化) rm -f /etc/my.cnf /etc/my.cnf.d/*-
rm -f /root/.mysql_secret /root/.my.cnf(临时密码和客户端配置) -
userdel -r mysql 2>/dev/null && groupdel mysql 2>/dev/null(避免新安装时因用户已存在报错)
特别注意:whereis mysql 和 find / -name mysql 2>/dev/null 查出的二进制路径(如 /usr/bin/mysql)通常随 RPM 卸载自动消失;但若手动编译安装过,需额外 rm -rf /usr/local/mysql。
安装 MySQL 8.0 并验证初始化
推荐用官方 YUM 源安装,省去依赖手工处理。以 MySQL 8.0 为例:
- 下载源:
wget https://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm - 安装源:
rpm -ivh mysql80-community-release-el7-10.noarch.rpm - 启用 8.0 仓库(禁用 5.7):
yum-config-manager --disable mysql57-community && yum-config-manager --enable mysql80-community - 安装:
yum install -y mysql-community-server
启动前检查:mysqld --validate-config(可提前发现 my.cnf 语法错误)
启动并获取初始密码:
systemctl start mysqld-
grep "temporary password" /var/log/mysqld.log(MySQL 8.0+ 默认生成,不是空密码)
登录后第一件事是改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPass123!'; —— 不执行这步,后续任何操作都会报 You must SET PASSWORD before executing this statement。
最容易被跳过的点:卸载时没清 /var/lib/mysql,或装完没跑 mysqld --validate-config 就直接启动;这两个动作一旦遗漏,问题往往表现为服务反复启动失败、日志里只报 Can't start server: Bind on TCP/IP port 却找不到端口被占的证据 —— 实际是配置加载了旧的 socket 路径或 datadir,而目录已不存在。


















