必须先停止并禁用mysql服务,再执行sudo apt purge命令清理所有相关包(含mysql-client、mysql-common等),随后手动删除/etc/mysql、/var/lib/mysql等残留目录及AppArmor配置,最后清除dpkg“rc”状态和mysql用户组,确保which mysqld等命令均返回command not found。

先停服务再 purge,否则 apt 会拒绝清理
直接 apt purge MySQL 包但服务还在跑,命令会卡住或失败——因为 apt 检测到 mysqld 进程正在使用配置和数据目录。必须先停服务并禁用自启:
sudo systemctl stop mysqlsudo systemctl disable mysql- 再确认没残留进程:
ps aux | grep mysqld,应无输出
Ubuntu 20.04+ 默认用 mysql 服务名;若装过 MariaDB 或改名服务,得先查真实服务名:systemctl list-units | grep -i sql
purge 命令要覆盖所有相关包,不能只删 mysql-server
apt remove 只删二进制,apt purge 才清配置文件。但光 sudo apt purge mysql-server 不够,常见漏掉的包有:
-
mysql-client和mysql-common(关键!不删它,/etc/mysql/ 目录可能留着) -
mysql-server-core-*和mysql-client-core-*(版本号通配更安全,如mysql-server-core-8.*) -
libmysqlclient*(尤其重装不同大版本时,旧客户端库会干扰)
推荐一次性执行:sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* libmysqlclient*
执行后系统会自动标记这些包为 “rc” 状态(removed config),但还没真删文件。
rm -rf 的目标目录不止 /etc/mysql 和 /var/lib/mysql
删完包只是第一步,真正容易残留的是这些路径:
-
/etc/mysql/(主配置目录,purge 后常残留) -
/var/lib/mysql/(数据目录,删前务必确认已备份) -
/var/log/mysql*(日志,包括/var/log/mysql.err、/var/log/mysql.log) -
/usr/lib/mysql-plugins/(插件目录,尤其装过认证插件时) -
/etc/apparmor.d/usr.sbin.mysqld(AppArmor 配置,不删会导致重装后启动失败)
执行前建议先检查是否存在:ls -d /etc/mysql /var/lib/mysql /var/log/mysql* 2>/dev/null,只删真实存在的路径,避免误报错。
最后必须清理 dpkg “rc” 状态和用户组
purge 后运行 dpkg -l | grep ^rc | grep mysql,如果还有输出,说明配置文件没被物理删除。这时要强制清除:
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P- 检查 mysql 用户是否残留:
id mysql,若存在且无其他服务依赖,执行sudo userdel mysql - 删 mysql 组:
sudo groupdel mysql - 验证是否真干净:
which mysqld、mysqld --version、mysql --version全部应返回 command not found
最容易被跳过的其实是 apparmor.d 文件和 userdel 步骤——它们不会影响“卸载完成”的提示,但会在你下次装 MySQL 或 MariaDB 时导致服务起不来、权限拒绝、socket 连接失败等静默问题。


















