卸载不干净会导致重装失败,必须分四步清理:停服务(sudo systemctl stop mysql)、卸软件包(sudo apt purge mysql-server mysql-client mysql-common mysql-server-8.0)、删数据与配置(sudo rm -rf /var/lib/mysql /etc/mysql /var/log/mysql)、清系统用户(sudo userdel -r mysql),最后验证id mysql和ls /var/lib/mysql均无输出。

卸载不干净会导致重装失败
直接 apt remove mysql-server 只删二进制和配置文件,但 /var/lib/mysql 数据目录、/etc/mysql 配置残留、systemd 单元残留、甚至 mysql 系统用户都还在。下次 apt install mysql-server 会复用旧数据目录,可能因权限错乱或版本不兼容直接启动失败。
必须分四步清理:
- 停服务:
sudo systemctl stop mysql - 卸软件包:
sudo apt purge mysql-server mysql-client mysql-common mysql-server-8.0(注意加mysql-server-8.0,否则 Ubuntu 源里拆包的组件可能漏掉) - 删数据与配置:
sudo rm -rf /var/lib/mysql /etc/mysql /var/log/mysql - 清系统用户:
sudo userdel -r mysql(-r确保同时删家目录和 mail spool)
执行完后运行 id mysql 应报 “no such user”,ls /var/lib/mysql 应报 “No such file or directory”。
重装时选对源才能装上真正新版
Ubuntu 官方源里的 mysql-server 包由 Canonical 维护,当前(2026年9月)实际提供的是 8.0.33 或 8.0.37,不是 Oracle 官方最新稳定版(如 8.0.45)。如果你需要修复 CVE 或启用新特性(比如 mysqldump --set-gtid-purged=OFF 在 8.0.37+ 才稳定),必须换官方 APT 仓库。
操作顺序不能错:
- 先装依赖:
sudo apt install curl gnupg - 下载并安装仓库配置包(以最新
mysql-apt-config_0.8.29-1_all.deb为例):wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb - 安装时按 Tab 切到 OK 前,务必在 MySQL Server & Cluster 行按空格选中,并在子菜单中确认
mysql-8.0已高亮;若要锁死小版本(如只装8.0.45),选 Yes 进入版本锁定 - 更新索引:
sudo apt update,然后验证:apt list -a mysql-server应看到带8.0.45的条目
别用 sudo apt install mysql-server —— 它会装仓库里“最高可用”版,未必是你想要的。要精准安装,用:sudo apt install mysql-server=8.0.45-1ubuntu22.04(包名后缀需和 apt list 输出一致)。
root 登录失败?不是密码错了,是认证插件没切
重装后首次 mysql -u root -p 报错 Access denied for user 'root'@'localhost',大概率不是密码问题,而是 Ubuntu 22.04 默认给 root@localhost 分配了 auth_socket 插件——它只认系统用户身份,不走密码校验。
解决方式只有一种安全路径:
- 用
sudo mysql直接进(无需密码) - 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; - 再执行:
FLUSH PRIVILEGES;
千万别手动 UPDATE mysql.user 表的 plugin 字段,也别删 auth_socket 行——这会让 sudo mysql 失效且无法回退。如果后续要用 Navicat/IDEA 连,mysql_native_password 是唯一兼容选项;生产环境建议立刻新建普通用户授权,而不是长期依赖 root 密码登录。
远程连不上?三个环节缺一不可
改了 bind-address = 0.0.0.0 就以为能远程?远远不够。MySQL 远程访问是三层过滤:
- MySQL 层:用户必须显式授权,例如
CREATE USER 'dev'@'%' IDENTIFIED BY 'pwd'; GRANT SELECT,INSERT ON mydb.* TO 'dev'@'%'; FLUSH PRIVILEGES;(别用root@'%') - 系统防火墙层:Ubuntu 默认开 ufw,必须
sudo ufw allow 3306 - 云平台层:阿里云/腾讯云的安全组规则必须单独放行 TCP 3306,且源 IP 不能写成
0.0.0.0/0除非你真想全网可连
检查顺序也重要:先确认本地 mysql -h 127.0.0.1 -u dev -p 能连,再从另一台机器 telnet your-server-ip 3306 测端口通不通,最后才查 MySQL 用户权限。很多人卡在第二步,却反复改 SQL 权限,白费时间。











