在云服务器上部署 MySQL,版本兼容性确实是个容易踩坑的点。很多新手或者甚至有一定经验的运维,往往直接 yum install mysql-server 或者 apt-get install mysql,结果装出来的可能是 MariaDB,或者是极其老旧的 MySQL 5.1/5.5,导致后续应用报错、性能瓶颈,甚至安全漏洞。
核心原则就一条:操作系统内核和包管理器的稳定性,优先于你对“最新特性”的追求。 除非你有明确的业务需求(如特定语法支持、新版优化器特性),否则“官方长期支持版(LTS)+ OS 默认稳定版”是最稳妥的组合。
下面分 CentOS 和 Ubuntu 两种主流场景,结合国内云厂商(阿里云、腾讯云等)的实际环境,给出具体的选型建议和实操避坑指南。
一、 CentOS 系列:RPM 生态的陷阱与解法
CentOS 7 是过去几年的主力,现在逐渐向 CentOS Stream 8/9 或 AlmaLinux/Rocky Linux 迁移。但无论哪个版本,逻辑类似。
1. 为什么不能直接用 yum install mysql?
在 CentOS 7 及更早版本中,默认的 MySQL 仓库指向的是 MariaDB(MySQL 被 Oracle 收购后,原创始人创建的分支)。如果你不指定源,你装的就是 MariaDB。虽然兼容性好,但如果你需要 Oracle MySQL 的原生功能(如某些特定的存储引擎、备份工具 Percona XtraBackup 的兼容性等),这就麻烦了。
2. 推荐组合
| 操作系统版本 | 推荐 MySQL 版本 | 理由 |
|---|---|---|
| CentOS 7 | MySQL 5.7 或 8.0 | CentOS 7 已停止维护,建议只装 5.7(最稳)或 8.0(需手动配置较多)。严禁使用 5.6。 |
| CentOS 8 / Stream 8 | MySQL 8.0 | EL8 平台对 systemd 和依赖库支持更好,8.0 是主流。 |
| Rocky/AlmaLinux 8/9 | MySQL 8.0 | 这些是 CentOS 的继任者,行为一致,推荐 8.0。 |
3. 安装方式(关键!)
❌ 错误做法:
yum install mysql-server
# 这通常装的是 MariaDB
✅ 正确做法:使用 Oracle 官方 YUM 仓库
以 CentOS 7 安装 MySQL 8.0 为例:
- 下载 RPM 包:去 MySQL APT/YUM Repository 找到对应的
.rpm文件(注意区分 glibc 版本,一般选mysql80-community-release-el7-*.noarch.rpm)。 - 安装仓库源:
sudo rpm -ivh mysql80-community-release-el7-*.noarch.rpm - 禁用默认模块(重要):
CentOS 7 默认启用了module流,可能导致冲突。编辑/etc/yum.repos.d/mysql-community.repo,确保[mysql80-community]下的enabled=1,其他社区版本设为0。 - 安装:
sudo yum install mysql-community-server - 启动并获取临时密码:
sudo systemctl start mysqld grep 'temporary password' /var/log/mysqld.log
注意:MySQL 8.0 默认密码策略非常严格(
validate_password插件开启),初始密码必须包含大小写、数字、特殊字符。如果嫌麻烦,可以在安装前修改配置文件/etc/my.cnf添加validate-password=OFF(不推荐生产环境这样做,但测试机可以)。
二、 Ubuntu 系列:Debian 系的优雅与风险
Ubuntu 的版本命名规则(20.04, 22.04, 24.04)比 CentOS 清晰得多。Ubuntu 的软件包管理器 apt 对 MySQL 的支持比较友好,但同样存在“默认非 Oracle MySQL”的问题。
1. 推荐组合
| 操作系统版本 | 推荐 MySQL 版本 | 理由 |
|---|---|---|
| Ubuntu 18.04 (Bionic) | MySQL 5.7 | 18.04 已 EOL,仅建议遗留系统使用 5.7。 |
| Ubuntu 20.04 (Focal) | MySQL 8.0 | 官方仓库默认提供 8.0,稳定性好,生态成熟。 |
| Ubuntu 22.04 (Jammy) | MySQL 8.0 | 当前主流 LTS,8.0 是绝对主力。 |
| Ubuntu 24.04 (Noble) | MySQL 8.0 | 较新系统,仍基于 8.0,未来可能过渡到 8.4+,但目前 8.0 最稳。 |
2. 安装方式
Ubuntu 可以直接通过 apt 安装 Oracle MySQL,无需像 CentOS 那样手动添加复杂仓库,但需要导入 GPG 密钥。
步骤:
- 添加官方仓库:
sudo apt update sudo apt install software-properties-common sudo add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ jammy mysql-8.0' # 注意:jammy 对应 22.04,如果是 20.04 则用 focal - 更新索引并安装:
sudo apt update sudo apt install mysql-server - 安全初始化:
sudo mysql_secure_installation这一步会引导你设置 root 密码、移除匿名用户、禁止远程 root 登录等。务必执行!
替代方案:使用 Snap 安装
Ubuntu 用户有时会看到sudo snap install mysql。虽然方便,但 不推荐用于生产环境。Snap 的沙箱机制可能导致权限问题、路径混乱,且难以自定义my.cnf的高级参数。对于云服务器,apt原生包更可控。
三、 版本选择的核心考量因素
在选择具体大版本(5.7 vs 8.0)时,不要只看“新旧”,要看以下三点:
1. 应用框架兼容性
- Java (Spring Boot): 5.7 和 8.0 都支持良好。但注意,Hibernate/JPA 在 8.0 下可能需要调整方言配置。
- PHP (Laravel/WordPress): 8.0 的 JSON 函数、窗口函数是亮点,但旧版 PDO 驱动可能需要升级。
- .NET: Connector/NET 8.0 支持 MySQL 8.0,但需注意身份验证插件变化(见下文)。
2. 身份验证插件的变化(最大坑点)
- MySQL 5.7: 使用
mysql_native_password。绝大多数客户端驱动都能无缝连接。 - MySQL 8.0: 默认使用
caching_sha2_password。- 影响:一些老旧的 JDBC 驱动、Python MySQLdb、Ruby 驱动可能无法连接。
- 解决:
- 升级所有客户端驱动到最新版本。
- 或者,在 MySQL 中创建用户时指定认证方式:
CREATE USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; - 全局修改默认认证插件(不推荐,牺牲安全性):
# my.cnf [mysqld] default_authentication_plugin=mysql_native_password
3. 性能与资源占用
- MySQL 8.0: 引入 InnoDB 缓存索引页、更好的多线程复制、JSON 原生支持。在高并发、复杂查询场景下表现更好。但 CPU 和内存开销略高于 5.7。
- MySQL 5.7: 轻量、稳定、可预测。如果你的服务器配置较低(如 2C4G),且业务逻辑简单,5.7 可能更省心。
四、 国内云厂商的特殊注意事项
在使用阿里云 ECS、腾讯云 CVM 时,有几个额外要点:
-
镜像选择:
- 如果购买的是“自定义镜像”或“公共镜像”,请确认基础系统是纯净的 CentOS/Ubuntu,而非预装了数据库的“一键安装包”镜像。后者往往配置不规范,难以维护。
- 推荐使用 云市场 中的“MySQL 高可用”镜像,它们通常已经配置了主从同步、监控XX,适合快速上手。
-
防火墙与安全组:
- 云服务器默认关闭 3306 端口。安装完 MySQL 后,必须在云控制台的安全组中放行 TCP 3306 端口,并限制来源 IP(仅限你的应用服务器 IP)。
-
数据盘挂载:
- 强烈建议将 MySQL 的数据目录(
datadir)放在独立的数据盘上,而不是系统盘。 - 修改
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf中的datadir路径,指向数据盘挂载点(如/data/mysql)。 - 原因:系统盘 IOPS 有限,且系统盘损坏会导致数据丢失。数据盘通常有更好的 I/O 性能和快照备份策略。
- 强烈建议将 MySQL 的数据目录(
-
SELinux/AppArmor:
- CentOS 默认开启 SELinux,Ubuntu 默认开启 AppArmor。
- 如果你更改了默认数据目录或端口,必须配置相应的策略,否则 MySQL 无法启动。
- 新手建议:先保持默认路径,熟悉后再调整。如需调整,可使用
semanage fcontext(CentOS) 或aa-complain(Ubuntu) 进行调试。
五、 总结与建议
| 场景 | 推荐 OS + MySQL 组合 | 备注 |
|---|---|---|
| 新项目,追求稳定 | Ubuntu 22.04 + MySQL 8.0 | 文档丰富,社区活跃,驱动支持好 |
| 老项目迁移,求稳 | CentOS 7 + MySQL 5.7 | 避免新特性带来的兼容性问题 |
| 高性能要求,预算充足 | Rocky Linux 9 + MySQL 8.0 | 利用新版优化器和硬件提速 |
| 开发测试环境 | Ubuntu 20.04 + MySQL 8.0 | 快速搭建,易于清理 |
最后提醒:
- 永远不要在生产环境使用
root账号直接连接应用。创建一个专用的业务账号,赋予最小权限。 - 定期备份:利用云厂商的自动快照功能,每天凌晨全量快照,每小时增量日志备份。
- 监控:启用云监控,关注 QPS、TPS、慢查询、连接数。MySQL 的性能问题,80% 源于慢 SQL 和配置不当,而非版本本身。
希望这份指南能帮你避开版本兼容性的坑。如果有具体的报错信息,欢迎贴出来进一步分析。
云技术博客