Ubuntu 20.04通过Apt安装MySQL 5.7的方法与注意事项

周末不加班
周末不加班
发布时间:2026-09-18 | 3人浏览过
原创

Ubuntu 20.04 LTS(Focal Fossa)的官方基础软件源默认将 MySQL 的主流版本推进到了 8.0,不再直接提供 MySQL 5.7 的安装包。为了在不破坏系统包依赖的前提下完成 5.7 版本的部署,规范的解决路径是引入 MySQL 官方的 APT 仓库配置文件,显式将目标发行版本锚定为支持 5.7 的 bionic(Ubuntu 18.04)仓库通道,并通过 APT 锁定软件版本以阻断意外升级。

版本冲突背景与仓库降级机制

如果你直接在刚装好的 Ubuntu 20.04 上执行 apt install mysql-server,系统会直接下载并部署 MySQL 8.0。对于依赖老版本 SQL 方言、特定字符集行为或遗留应用架构的系统来说,8.0 默认启用的 caching_sha2_password 认证机制和严格的 SQL Mode 往往会导致旧项目直接瘫痪。

由于 MySQL 官方针对 Ubuntu 20.04 的 APT 索引中压根就没有打包 5.7 的二进制二进制组件,我们必须让 APT 包管理器“跨版本”识别上游源。这个方案的核心在于:让 Ubuntu 20.04 运行环境读取适配 bionic 发行版的官方源元数据,从而拉取经过官方编译的 5.7 软件包。

APT软件源解析与版本选择示意图
图 1:通过将官方 APT 配置指向 Bionic 发行版以引入 MySQL 5.7 索引的机制

准备工作:处理 GPG 密钥与基础环境

在安装之前,必须确保系统具备基础的网络下载与证书校验工具。同时,由于 MySQL 官方历史仓库的 GPG 签名密钥发生过轮换,直接添加仓库可能遭遇 NO_PUBKEY 校验错误。

首先更新本地软件包索引并安装必要组件:

sudo apt update
sudo apt install -y wget lsb-release gnupg curl

如果在后续更新软件源时遇到 NO_PUBKEY 467B942D3A79BD29 类似的公钥缺失报错,需要手动将 MySQL 最新的 APT GPG 密钥导入系统的受信任密钥环中:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

导入密钥后,系统在拉取并校验 Release 签名时便不会再报出不可信源的中断警告。

完整安装操作流程

安装主要分为四个连续步骤:获取配置包、配置目标仓库版本、更新索引以及锁定安装。

MySQL 5.7 安装步骤流程图
图 2:Ubuntu 20.04 安装 MySQL 5.7 的标准时序步骤

步骤一:下载官方仓库配置工具

从 MySQL 官方归档节点下载版本配置 deb 包:

wget https://repo.mysql.com/mysql-apt-config_0.8.12-1_all.deb

注:不要选用过新的配置工具(如 0.8.24 以上版本),较新版本内部剔除了 Ubuntu 18.04(bionic)与 MySQL 5.7 组合的交互菜单选项。

步骤二:解构并配置软件源参数

使用 dpkg 安装下载好的配置包。这一步会弹出一个基于终端的 ncurses 蓝色交互界面:

sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

在弹出的交互配置菜单中,操作细节至关重要:

  1. 如果当前环境被自动识别为 ubuntu focal,需要在第一屏选择系统版本切换,将其指定为 ubuntu bionic。
  2. 进入主菜单后,光标停留在第一项 Server & Cluster 并按回车。
  3. 在版本列表页中,选择 mysql-5.7。
  4. 返回主菜单后,光标下移至最后一项 Ok 并回车确认退出。

完成此配置后,配置包会自动在 /etc/apt/sources.list.d/mysql.list 生成针对 bionic 的仓库地址。如果不希望使用交互式界面,也可以直接向该文件写入标准定义:

### 示例配置:/etc/apt/sources.list.d/mysql.list
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-apt-config
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-5.7
deb-src http://repo.mysql.com/apt/ubuntu/ bionic mysql-5.7

步骤三:更新缓存并检查候选版本

重新读取所有源索引,使刚写入的配置生效:

sudo apt update

安装前,使用 apt-cache policy 命令排查当前系统检索到的 mysql-server 候选情况,确认 5.7 已经在列表中可用:

apt-cache policy mysql-server

预期输出示例:

mysql-server:
  Installed: (none)
  Candidate: 8.0.36-0ubuntu0.20.04.1
  Version table:
     8.0.36-0ubuntu0.20.04.1 500
        500 http://mirrors.ubuntu.com/ubuntu focal-updates/main amd64 Packages
     5.7.42-1ubuntu18.04 500
        500 http://repo.mysql.com/apt/ubuntu bionic/mysql-5.7 amd64 Packages

观察上述输出可以看到,由于 Ubuntu 20.04 自带的 8.0 版本号更高,默认的 Candidate 依然是 8.0。这意味着直接执行常规安装依然会装上 8.0,因此必须在安装命令中严格锁定版本号。

步骤四:精确指定版本安装

必须同时显式指定 mysql-server、mysql-client 以及 mysql-community-server 等核心组件的具体版本后缀(例如 5.7.42-1ubuntu18.04),以防 APT 自动解析高版本依赖导致冲突:

sudo apt install -f \
  mysql-client=5.7.42-1ubuntu18.04 \
  mysql-community-client=5.7.42-1ubuntu18.04 \
  mysql-community-server=5.7.42-1ubuntu18.04 \
  mysql-server=5.7.42-1ubuntu18.04

安装过程中,终端会弹出密码设置对话框,要求输入 MySQL root 管理员用户的初始密码。输入并确认后,系统将自动解压、部署系统文件并注册 systemd 服务。

运行状态检查与安全基线加固

安装完成后,首先检查守护进程的存活状态以及运行的版本号。

sudo systemctl status mysql

终端应显示 active (running)。接着进入命令行客户端直接验证数据库版本:

mysql -u root -p -e "SELECT VERSION();"

运行结果示例:

+--------------------+
| VERSION()          |
+--------------------+
| 5.7.42-1ubuntu18.04|
+--------------------+

刚装好的数据库包含一些不安全的默认设置,例如测试数据库以及匿名访问策略。务必运行官方安全配置脚本完成加固:

sudo mysql_secure_installation

在提示过程中,建议做出以下选择:

  • VALIDATE PASSWORD PLUGIN:根据自身环境决定是否启用强密码策略组件(开发测试机若需要简短密码可选择 No,生产环境务必输入 Yes 并设为 Medium 或 Strong)。
  • Change the password for root ?:若安装过程中已设置好预期密码,按 n 跳过;若需要重设,输入 y 并录入新密码。
  • Remove anonymous users?:选择 y,移除匿名用户以收敛攻击面。
  • Disallow root login remotely?:选择 y,禁止 root 用户从外部 IP 远程登录,仅允许本地套接字或回环地址连接。
  • Remove test database and access to it?:选择 y,清理系统自带的 test 测试库。
  • Reload privilege tables now?:选择 y,使上述权限调整立即生效。
服务架构与生产安全配置验证
图 3:MySQL 5.7 在 Ubuntu 20.04 运行时的架构组件与隔离边界

核心注意事项与生产避坑指南

跨发行版通道安装旧版本数据库虽然可行,但在后续维护与运维中存在若干隐蔽陷阱,必须逐一核查。

重点防范:APT 自动静默升级覆盖

当日常执行 apt upgrade 或系统触发无人值守更新时,APT 会发现基础源里的 mysql-server-8.0 比当前安装的 5.7.* 版本数值更高。若不加以干预,系统会自动拉取 8.0 并直接在原数据目录上执行升级安装,导致数据字典破坏或业务直接中断。

解决这个问题的标准方法是使用 apt-mark hold 将 MySQL 相关包全部钉死(Pinning),锁定当前已安装版本:

sudo apt-mark hold mysql-server mysql-client mysql-community-server mysql-community-client

执行后,系统会明确反馈:

mysql-server set on hold.
mysql-client set on hold.
mysql-community-server set on hold.
mysql-community-client set on hold.

只要这些包处于 hold 状态,即使后续执行 apt update && apt upgrade,APT 也会主动跳过 MySQL 的升级更新,从根源上阻断误升风险。

依赖缺失:libssl1.1 与 libaio1 兼容问题

虽然 Ubuntu 20.04 的默认基础运行库带有 libssl1.1 和 libaio1,但部分极简容器镜像或裁剪版系统可能未默认附带。MySQL 5.7 深度依赖 OpenSSL 1.1 分支,如果直接启动失败,请检查动态链接库是否存在:

sudo apt install -y libaio1 libtinfo5 libmecab2

注意,绝不要尝试在 Ubuntu 20.04 上强行安装来自更高版本(如 Ubuntu 22.04 的 libssl3)去替换系统的 SSL 基础库,否则会直接导致整个系统的 APT 与 OpenSSH 服务异常。

字符集与 SQL Mode 行为调整

MySQL 5.7 的默认字符集是 latin1,而不是 8.0 默认的 utf8mb4。在创建数据库前,建议直接在全局配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf 中将字符集与排序规则固定为全功能 Unicode,以避免后续写入表情包或特殊中文字符时报错乱码:

[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_unicode_ci

# 依应用兼容性调整 SQL Mode(若旧项目包含非法零日期或聚合字段分组)
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

配置完成后,重启数据库守护进程生效:

sudo systemctl restart mysql
MySQL 5.7 与 8.0 在 Ubuntu 20.04 维度的决策与技术对比
图 4:MySQL 5.7 与 8.0 在维护成本及业务兼容性维度的综合对照

总结与长效维护建议

通过配置工具挂载 bionic 仓库,是在 Ubuntu 20.04 下通过 APT 包管理栈安装 MySQL 5.7 最稳定、最贴合原生环境的方案。

但从长远维护的角度看,MySQL 5.7 官方生命周期已正式进入归档(EOL)阶段,上游不再提供常规安全补丁更新。如果业务确实因为驱动或框架限制无法重构,务必严格遵守以下两条底线原则:

  • 严禁将该 5.7 实例直接暴露在公网端口(默认 3306),必须将其绑定在 127.0.0.1 或纯私网 VPC 子网内。
  • 始终保持 apt-mark hold 锁定状态,避免系统管理员在执行批量运维任务时触发意外跨大版本升级。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表