直接 apt install mysql-server 会安装陈旧版本(如 ubuntu 20.04 默认为 8.0.28),且缺乏安全更新;必须替换为官方 apt 源(下载 mysql-apt-config_0.8.26-1_all.deb 并配置),否则无法获取 mysql 8.4.x lts 版本及及时补丁。

更新软件源前先确认系统状态
直接 apt install mysql-server 能装,但可能拉到陈旧版本(比如 Ubuntu 20.04 默认源里是 8.0.28,而当前最新稳定版已是 8.4.x),且缺少官方维护的更新通道。更关键的是:若系统曾装过 MariaDB 或旧版 MySQL,残留配置会干扰新服务启动,systemctl start mysql 可能卡在 activating (start) 状态。
执行前务必检查:
-
systemctl is-active mysql—— 若返回active或failed,先停服:sudo systemctl stop mysql -
dpkg -l | grep -i "mysql\|mariadb"—— 若有结果,用sudo apt remove --purge mysql-* mariadb-*彻底清理 -
ls /etc/mysql/—— 若目录非空,说明配置残留,后续安装可能跳过密码设置环节
用官方 APT 源替代默认源(不是可选,是必须)
Ubuntu 自带源只保证“能用”,不保证“安全更新及时”。MySQL 官方 APT 仓库提供完整版本矩阵(包括 LTS 和 GA 版本)、定期安全补丁推送、以及 mysql-client mysql-router 等配套工具。跳过这步,apt upgrade mysql-server 很可能什么也不做。
操作顺序不能错:
- 下载配置包:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb(截至 2026 年 4 月最新版) - 安装并交互选择:
sudo dpkg -i mysql-apt-config_0.8.26-1_all.deb→ Tab 切换、空格选中MySQL Server→ OK - 强制刷新索引:
sudo apt update(这步漏掉,apt install仍走旧源)
验证是否生效:apt policy mysql-server 输出中应含 https://repo.mysql.com/apt 字样,且候选版本为 8.4.0-1ubuntu22.04 类似格式。
安装时没弹出密码设置框?这是正常现象
MySQL 8.4+ 默认启用 auth_socket 插件认证,root 用户通过系统用户权限本地免密登录,所以 apt install 过程不会问密码。这不是失败,而是设计如此 —— 但意味着你必须立刻运行 mysql_secure_installation,否则 root 实际处于“无密码可远程登录”风险状态(尤其当你改过 bind-address)。
执行加固脚本时注意:
- 密码强度等级选
2(强),避免被爆破;若已有应用依赖简单密码,可在脚本结束后手动降级:SET GLOBAL validate_password.policy = LOW; - “禁止 root 远程登录”选
y,生产环境别心软;如真需远程管理,后面单独建用户,别动 root - 若提示
Failed to connect to database,说明 mysqld 没起来,先查日志:sudo journalctl -u mysql -n 50 --no-pager,常见原因是/var/lib/mysql权限残留
加固后验证连接与权限是否真正生效
很多人以为跑完 mysql_secure_installation 就结束了,其实关键验证点就三个:
- 本地登录:
mysql -u root -p输入刚设的密码,成功进入即认证生效 - 检查匿名用户是否清空:
sudo mysql -e "SELECT User,Host FROM mysql.user;" | grep '^$',无输出才安全 - 确认 root 只能本地连:
sudo mysql -e "SELECT Host FROM mysql.user WHERE User='root';"应只返回localhost
如果 SELECT 返回 127.0.0.1 或 %,说明脚本中途被跳过或执行失败,得手动执行:DELETE FROM mysql.user WHERE User=''; UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
最易被忽略的是:脚本不修改 bind-address,它默认仍是 127.0.0.1,但如果你之前手动改过配置文件,加固脚本不会帮你还原 —— 这个细节决定你的 MySQL 是暴露在公网还是锁在本地。











