Linux卸载MySQL必须分三步:先停服务并清残留进程,再用apt purge或yum remove --allmatches彻底清理包,最后手动删除/var/lib/mysql、/etc/mysql、/var/log/mysql及socket/pid文件,并验证服务状态、路径存在性、二进制、用户组及全局残留。

不能只靠 apt remove 或 yum remove 就算卸载干净——这些命令默认保留配置、数据、日志和用户,重装时大概率报 “file exists”、“port already in use” 或启动失败。
先停服务再删文件,否则 /var/lib/mysql 删不掉还可能卡死
MySQL 进程没真正退出时,/var/lib/mysql 会被内核锁住,rm -rf 会卡住或报错 “device or resource busy”。必须分三步确认:
- 查服务名:
systemctl list-unit-files | grep -i mysql(常见为mysqld或mysql) - 停服务并禁用自启:
sudo systemctl stop mysqld && sudo systemctl disable mysqld - 清残留进程:
ps aux | grep -E "(mysqld|mysqladmin)" | grep -v grep,看到 PID 就sudo kill -9 PID
特别注意:有些定时任务或监控脚本会拉起 mysql 客户端连本地 socket,它们不属 systemd 管理,但会锁住 /tmp/mysql.sock 或 /var/run/mysqld/mysqld.sock,导致后续删除失败。
apt purge 和 yum remove --allmatches 才是包清理起点
只用 apt remove 或 yum remove 会留下 mysql-common、libmysqlclient 等基础包,它们常被其他软件(如 postfix、dovecot)依赖,但又和新版 MySQL 冲突。必须用“彻底清除”模式:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- Debian/Ubuntu:
sudo apt purge mysql-server mysql-client mysql-common,再补一句sudo dpkg -l | grep "^rc" | awk '{print $2}' | xargs -r sudo dpkg --purge(清理已删但配置残留的包) - RHEL/CentOS:
sudo yum remove mysql\* mariadb\*,然后rpm -qa | grep -i "mysql\|mariadb"挨个sudo rpm -e --nodeps 包名;若报%preun scriptlet failed,改用--noscripts - 务必检查 MariaDB 是否混装:
rpm -qa | grep -i maria或dpkg -l | grep maria,有就一并卸载,否则其libmysqlclient.so会覆盖新版链接
四类关键路径必须手动删,漏一个都可能让新实例启动失败
包管理器不管这些目录,但它们直接影响重装行为。删之前先确认路径是否被自定义过:
- 查真实
datadir:sudo grep -r "datadir" /etc/mysql/ 2>/dev/null || echo "/var/lib/mysql (default)" - 查 socket 和 pid 路径:
sudo grep -E "(socket|pid-file)" /etc/mysql/*.cnf 2>/dev/null - 重点删这四个位置(按顺序执行,别跳):
sudo rm -rf /var/lib/mysql(主数据目录)sudo rm -rf /etc/mysql(所有配置,包括conf.d/下的碎片)sudo rm -rf /var/log/mysql(错误日志、慢日志,不删会导致新实例权限拒绝写入)sudo rm -f /run/mysqld/mysqld.sock /tmp/mysql.sock /var/run/mysqld/mysqld.pid(运行时文件) - 额外检查点:
sudo find /usr -name "*mysql*" -type d 2>/dev/null,若发现/usr/lib64/mysql或/usr/share/mysql,也一并rm -rf
注意 SELinux/AppArmor:如果系统启用了安全模块,删完后重装仍启动失败,大概率是策略缓存未刷新。Ubuntu 上跑 sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld;CentOS 上检查 sestatus,必要时临时设为 permissive 模式验证。
验证是否真干净,别信“没输出就是干净”
很多用户删完就重装,结果还是报错。真正干净的标准是:
- 服务状态:
systemctl is-active mysqld返回unknown或空,不是inactive - 关键路径不存在:
ls /var/lib/mysql /etc/mysql /var/log/mysql全报 “No such file or directory” - 二进制找不到:
which mysql mysqld无输出;sudo find /usr -name mysqld 2>/dev/null为空 - 用户与组已删:
getent passwd mysql和getent group mysql都无返回(若存在,用sudo userdel -r mysql) - 最后补一刀:
sudo find / -name "*mysql*" -type f -o -type d 2>/dev/null | grep -E "(bin|lib|share|log|data)",人工扫一眼有没有漏网之鱼
最易被忽略的是 /root/.my.cnf 和 /home/*/.mysql_history:它们不会影响安装,但会干扰后续 mysql 命令的默认行为,尤其是自动登录凭据泄露风险。顺手 rm -f /root/.my.cnf /home/*/.mysql_history 更稳妥。

















