在 CentOS 和 Ubuntu 上安装 MySQL,虽然核心逻辑都是“下载包 -> 解压/配置 -> 启动服务”,但在具体操作层面,两者的差异主要体现在包管理器的使用习惯、配置文件的位置与格式、以及初始化策略的演变上。
作为经常在这两个系统间切换的运维或开发者,我直接切入重点,把最关键的几个区别给你理清楚。
1. 包管理器与软件源:yum/dnf vs apt
这是最直观的区别。
-
CentOS (7/8/Stream):
- 主要使用
yum(CentOS 7) 或dnf(CentOS 8+ / Stream)。 - 关键点:CentOS 官方源里的 MySQL 版本通常较旧(比如 CentOS 7 默认可能是 5.7 甚至更早)。如果你要装新版(如 8.0+),必须去 MySQL 官网添加 YUM Repository。
- 命令示例:
# 添加 repo sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm # 安装 sudo yum install mysql-community-server
- 主要使用
-
Ubuntu (18.04/20.04/22.04):
- 主要使用
apt或apt-get。 - 关键点:Ubuntu 官方源更新较快,但有时为了稳定性,版本可能滞后于 MySQL 最新 GA 版。同样,推荐通过 APT 仓库安装以获取自动更新和安全补丁。
- 命令示例:
# 添加 repo (需先安装 gnupg, curl 等依赖) sudo apt install mysql-server
- 主要使用
注意:无论哪个系统,强烈建议不要直接用系统自带的老旧版本,务必使用官方提供的社区版仓库。
2. 初始化流程:从 mysqld --initialize 到 mysql_secure_installation
这是最容易踩坑的地方。MySQL 5.7 之前和之后,初始化方式发生了巨大变化。
MySQL 5.7 及以前(包括部分 CentOS 7 默认环境)
- 首次启动即初始化:当你第一次执行
systemctl start mysqld(CentOS) 或service mysql start(Ubuntu) 时,如果数据目录为空,MySQL 会自动触发初始化。 - 临时密码:初始化过程中,MySQL 会生成一个临时的 root 密码,并打印到日志文件中。
- CentOS:
/var/log/mysqld.log - Ubuntu:
/var/log/mysql/error.log - 查找命令:
grep 'temporary password' /var/log/mysqld.log
- CentOS:
- 后续步骤:拿到临时密码后,必须立即运行
mysql_secure_installation来设置新密码、移除匿名用户等。
MySQL 8.0+(当前主流)
- 自动初始化更彻底:安装完成后,首次启动服务时,数据库会自动初始化数据目录,并生成随机 root 密码。
- 认证插件变化:MySQL 8.0 默认使用
caching_sha2_password认证插件。这意味着老版本的客户端驱动(如某些旧版 JDBC、Navicat 早期版本)可能无法连接,除非你手动将 root 用户改为mysql_native_password。 - 初始化脚本位置:
- CentOS: 初始化日志仍在
/var/log/mysqld.log。 - Ubuntu: 日志可能在
/var/log/mysql/error.log或通过 systemd journal 查看 (journalctl -u mysql)。
- CentOS: 初始化日志仍在
重要提示:在生产环境中,不要依赖自动生成的临时密码。建议在安装前就规划好 root 密码,或者在初始化后立即修改。
3. 配置文件位置与语法
-
CentOS:
- 主配置文件:
/etc/my.cnf - 附加配置:
/etc/my.cnf.d/目录下的文件(如mysql-server.cnf)。 - 特点:结构相对简单,遵循传统 Linux 风格。
- 主配置文件:
-
Ubuntu:
- 主配置文件:
/etc/mysql/mysql.conf.d/mysqld.cnf - 全局配置:
/etc/mysql/conf.d/和/etc/mysql/mysql.conf.d/ - 特点:Ubuntu 的 Debian 系包管理倾向于将配置拆分成多个小文件,便于模块化管理。有时你会看到
/etc/mysql/debian.cnf,这是用于系统维护账号的配置,一般不需要动。
- 主配置文件:
调试技巧:当 MySQL 启动失败时,第一件事就是检查对应系统的日志文件,而不是盲目改配置。
4. 服务管理与开机自启
-
CentOS:
- 服务名:
mysqld - 命令:
systemctl start mysqld,systemctl enable mysqld - 状态检查:
systemctl status mysqld
- 服务名:
-
Ubuntu:
- 服务名:
mysql - 命令:
systemctl start mysql,systemctl enable mysql - 状态检查:
systemctl status mysql
- 服务名:
常见错误:在 Ubuntu 上尝试用
systemctl start mysqld会报错,因为服务名是mysql而非mysqld。反之亦然。
5. 权限与安全模型差异
-
SELinux (CentOS 特有):
- CentOS 默认启用 SELinux。如果 MySQL 的数据目录或端口被 SELinux 阻止,会导致启动失败或连接被拒。
- 解决方案:要么正确设置 SELinux 上下文(
semanage fcontext),要么临时设为 permissive 模式测试(setenforce 0),生产环境建议正确配置上下文。 - Ubuntu 没有 SELinux(默认使用 AppArmor),但 AppArmor 也可能限制 MySQL 访问特定路径,不过概率远低于 SELinux。
-
防火墙:
- CentOS: 使用
firewalld。开放端口命令:firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload - Ubuntu: 使用
ufw。开放端口命令:ufw allow 3306/tcp
- CentOS: 使用
总结对比表
| 特性 | CentOS (7/8+) | Ubuntu (18.04+) |
|---|---|---|
| 包管理器 | yum / dnf | apt / apt-get |
| 服务名称 | mysqld | mysql |
| 主配置文件 | /etc/my.cnf | /etc/mysql/mysql.conf.d/mysqld.cnf |
| 错误日志 | /var/log/mysqld.log | /var/log/mysql/error.log |
| 安全模块 | SELinux (需特别注意) | AppArmor (较少干扰) |
| 防火墙工具 | firewalld | ufw |
| 初始化密码存储 | mysqld.log | error.log 或 journalctl |
最佳实践建议
- 统一使用官方仓库:无论是 CentOS 还是 Ubuntu,都通过官方提供的 YUM/APT 仓库安装,确保获得最新的补丁和安全更新。
- 首次登录后立即修改密码:利用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword';替换掉临时密码。 - 考虑认证插件兼容性:如果使用 MySQL 8.0,且客户端连接有问题,考虑创建新用户并使用
mysql_native_password插件,或升级客户端驱动。 - 备份配置文件:在安装和修改任何配置前,先备份
/etc/my.cnf或/etc/mysql/下的文件。 - 自动化部署:对于大规模部署,建议使用 Ansible、Puppet 或 Terraform 等工具进行标准化安装,避免手动操作的差异。
希望这些细节能帮你避开那些看似相同实则不同的坑。
云技术博客