Ubuntu 20.04 默认不提供 MySQL 5.7,必须通过官方 APT 仓库手动指定安装;卸载不干净是重装失败主因,尤其 /var/lib/mysql 和 mysql-common 残留会导致启动报错或服务 failed。

直接结论:Ubuntu 20.04 默认不提供 MySQL 5.7,必须用官方 APT 仓库手动指定安装;卸载不干净是重装失败的最常见原因,尤其 /var/lib/mysql 和 mysql-common 残留会导致启动报 Can't find file: './mysql/plugin.frm' 或服务反复 failed。
确认残留:先看 dpkg -l | grep mysql 和 systemctl status mysql
别跳这步。如果 systemctl status mysql 显示 failed 但 /var/lib/mysql 目录还存在,基本就是“卸载半截”——apt remove 没清配置,purge 漏了关键包,数据目录更没人动。运行:
-
dpkg -l | grep mysql—— 看是否混装mysql-server-8.0和mysql-server-5.7,或残留rc状态(表示配置文件还在) -
ls -d /etc/mysql /var/lib/mysql /var/log/mysql 2>/dev/null—— 实际检查这些路径是否存在,别只信 dpkg 输出 -
ps aux | grep mysqld—— 确保没进程在跑,否则 purge 会卡住或失败
彻底清除:purge + rm -rf + dpkg -P 三连
顺序不能错,漏一步就可能重装后无法启动:
- 先停服务:
sudo systemctl stop mysql,再禁用:sudo systemctl disable mysql - 一次性 purge 所有相关包:
sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* libmysqlclient*(mysql-common是关键,不删它/etc/mysql必残留) - 手动删目录:
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql /usr/lib/mysql-plugins /etc/apparmor.d/usr.sbin.mysqld(AppArmor 配置不删,重装后 service start 会静默失败) - 清理 dpkg “rc” 状态:
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P,否则which mysqld还可能返回旧路径
装 MySQL 5.7:必须用官方仓库,禁用 8.0,显式指定包名
Ubuntu 20.04 的 apt install mysql-server 默认装 8.0,不是 5.7。正确流程是:
- 加官方源:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb && sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb,安装时用方向键选中mysql-5.7,取消勾选mysql-8.0,按 OK - 更新并验证源:
sudo apt update,然后apt list mysql-server*应看到mysql-server-5.7/focal,now,没 8.0 才算对 - 显式安装:
sudo apt install mysql-server-5.7(别写mysql-server,否则 apt 可能自动选 8.0) - 首次登录用
sudo mysql -u root(因默认认证插件是auth_socket),再执行sudo mysql_secure_installation设密码和加固
重装后仍连不上?重点查 bind-address 和 sql_mode
MySQL 5.7 启动成功不等于能用。两个高频坑:
-
bind-address默认是127.0.0.1,远程连不上就改/etc/mysql/mysql.conf.d/mysqld.cnf里的这一行,改成0.0.0.0或具体 IP,改完sudo systemctl restart mysql -
sql_mode在 5.7 中默认含STRICT_TRANS_TABLES,老程序 INSERT 缺字段会直接报错;如需兼容,编辑同上配置文件,在[mysqld]下加一行:sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" - 别忽略
sudo journalctl -u mysql -n 50 --no-pager,错误日志里常有真实线索,比如插件加载失败、目录权限不对、AppArmor 拒绝访问等
真正麻烦的从来不是“怎么装”,而是“以为卸干净了”——/var/lib/mysql 多一个隐藏文件、mysql-common 少 purge 一次、AppArmor 配置多留一行,都足以让重装后的服务卡在 activating 状态。动手前先 ls -la /var/lib/mysql 看一眼,比重试三遍更省时间。


















