一、背景
前几天有朋友问我:CentOS 7 服务器怎么安装 MySQL?
一开始我觉得这事应该不复杂,现在有 AI、有搜索引擎,随便一问,安装命令和教程一大堆,照着敲不就完事了?
结果我自己拉了一台云服务器,重装成 CentOS 7,按着教程一步一步操作下来,才发现:
安装 MySQL 这件事本身不难,难的是出错之后怎么排查。
如果只是"照着命令敲",一旦遇到 repo 冲突、GPG 校验失败、旧数据目录残留、服务启动失败这些问题,还是会折腾很久。这里把这次安装和排障过程整理一下,做个记录,避免后面继续踩坑,哈哈。
二、环境
本次实验环境如下:
- 系统:CentOS 7.6
- MySQL:MySQL Community Server 8.4
说明一下:我实际排障时遇到过 mysqld 8.0.46 相关日志,那是此前折腾时遗留的旧环境信息;本文最终安装流程以 MySQL 8.4> 社区版 为准。
三、安装前置检查
对于全新系统可以简化检查步骤,但在生产环境或未知环境中,建议还是做前置检查,至少要确认以下几点:
- 之前有没有装过 MySQL / MariaDB
- 数据库服务是否还在运行
- 3306 端口是否被占用
- 数据目录、配置文件、日志文件是否有残留
- 是否存在历史 MySQL repo
这一部分做得细一点,后面会省很多时间。
# 检查是否已安装数据库包
rpm -aq | grep -Ei 'mysql|mariadb'
# 检查数据库服务
systemctl list-unit-files | grep -Ei 'mysql|mariadb'
# 检查数据库服务进程
ps -ef | grep -Ei 'mysql|mariadb'
# 检查3306端口占用
netstat -ntlp | grep 3306
# 检查是否数据目录
ls /var/lib/mysql
# 检查日志目录
ls /var/log/mysqld.log
# 检查配置文件
ls /etc/my.cnf
ls /etc/my.cnf.d/
# 检查依赖关系
rpm -q --whatrequires mariadb-libs
四、关于CentOS 7自带的MariaDB
CentOS 7 默认并不会直接提供 Oracle 官方的 MySQL,而是偏向使用 MariaDB 相关组件。比较常见的是系统里会带一个依赖库:

这个包本身不代表完整安装了 MariaDB 服务,但在安装 MySQL 时,确实可能带来依赖或兼容性冲突,所以安装前建议确认并处理干净。
顺便说一下,MariaDB 不是简单"改了个名字的 MySQL"。
它是 MySQL 的一个分支项目,由 MySQL 原作者团队维护,SQL 语法层面大体兼容,但在存储引擎、版本演进和部分特性实现上已经逐渐出现差异,实际运维中不能完全等同看待。
如果只是想确认系统里有没有装过 MariaDB,可以执行:
systemctl status mariadb
rpm -qa | grep -i mariadb
systemctl list-unit-files | grep mariadb
mysql --version
如果你要安装的是 MariaDB,对应命令一般是:
yum install -y mariadb-server
systemctl start mariadb.service
mysql_secure_installation
mysql -u root -p
不过本文的目标是安装 Oracle 官方 MySQL,所以这里只是顺带说明一下。
五、安装前清理
如果服务器上之前部署过 MySQL / MariaDB,建议先做好备份,再进行清理。
尤其是数据目录、配置文件、历史日志、历史 repo,如果不清干净,后面很容易出各种奇怪问题。
注意:以下操作会删除原有数据库数据,仅适用于确认无需保留旧数据的场景。生产环境请务必先备份。
# 停服务
systemctl stop mysqld 2>/dev/null
systemctl stop mariadb 2>/dev/null
# 卸载数据库相关包
yum remove -y mysql* mariadb*
# 卸载历史Mysql repo包
rpm -qa | grep -Ei 'mysql.*community.*release' | xargs -r rpm -e
# 删除数据目录
rm -rf /var/lib/mysql
# 删除配置
rm -f /etc/my.cnf
# 删除日志
rm -f /var/log/mysqld.log
六、安装Mysql
1)为什么不能直接 yum install mysql-server
最开始我以为直接执行:yum install mysql-server就可以安装了,但 CentOS 7 默认并不是这么玩的。

它更多是偏向 MariaDB 生态,所以如果你想安装 Oracle 官方 MySQL,一般需要先配置官方 YUM 源。
最靠谱的方式还是看官网文档。
官方安装说明可以参考:
MySQL Installation on Linux Using the MySQL Yum Repository
安装时,建议以官网当前提供的 repo 包为准。

这里说一下yum install mysql/mysql-server的区别,mysql指安装客户端工具,只能用来连接数据库,而mysql-server指安装服务端核心包,会生成mysql.service单元,才能用来启动数据库服务,安装mysql-server会连带安装客户端工具的依赖包,就不需要再次安装客户端工具了
2)下载安装官方 repo
我这里直接使用 wget 下载到服务器:
wget https://dev.mysql.com/get/mysql84-community-release-el7-2.noarch.rpm
安装 repo:
rpm -Uvh mysql84-community-release-el7-2.noarch.rpm
这里建议使用 -Uvh,表示升级安装。
如果系统里已经存在旧版本 MySQL repo,优先用升级安装或者先卸载旧源,不建议直接无脑 --force 强制覆盖。
如果报类似错误:
mysql80-community-release 被 mysql84-community-release-el7-2.noarch 取代
说明系统里已有旧版本 repo,这时有两种处理思路:
-
升级安装
rpm -Uvh mysql84-community-release-el7-2.noarch.rpm
-
先卸载旧源,再安装新源
先查已有 repo 包:
rpm -qa | grep -Ei 'mysql.*community.*release'
再卸载旧源,例如:
rpm -e mysql80-community-release-el7-3.noarch
然后重新安装:
rpm -ivh mysql84-community-release-el7-2.noarch.rpm
3)导入 GPG 公钥
安装官方源后,还需要导入 GPG 公钥,否则 yum 在安装 MySQL 包时可能会因为校验失败而拒绝安装。
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
4)安装 MySQL Server
yum install -y mysql-community-server
如果遇到 GPG 密钥不匹配问题,优先重新导入官方最新公钥,而不是直接关闭校验。
只是测试环境临时验证的话,也可以这样跳过:
yum install -y mysql-community-server --nogpgcheck
不过这只是兜底方案,不建议作为常规做法。
七、初始化与启动
1)启动服务并设置开机自启
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
2)获取初始密码
这点和 MariaDB 不一样,MySQL 8 默认会生成一个临时 root 密码,写入日志文件中:
grep 'temporary password' /var/log/mysqld.log
3)登录 MySQL
mysql -uroot -p
输入刚刚查到的临时密码即可登录。
4)初始化不需要手动执行
很多教程喜欢把这一步写成固定流程:
mysqld --initialize --user=mysql
但实际上,MySQL 8 在正常安装后通常会自动完成初始化。
也就是说,绝大多数情况下,你安装完直接启动服务就行,不需要手动执行 mysqld --initialize。
只有以下场景,才需要手动初始化:
- /var/lib/mysql被删除了
- 数据目录损坏
- 服务启动失败,需要重建数据目录
- 想完全重新初始化实例
所以 mysqld --initialize 更适合作为排障修复手段,而不是每次安装都必须执行的标准步骤。
八、安全配置
1)SELinux 处理
MySQL 在某些场景下启动失败,可能并不是权限本身有问题,而是 SELinux 策略拦截。
需要说明一下,SELinux 不是 Windows 的"安全模式",而是 Linux 的一种强制访问控制机制(MAC)。
它会限制进程访问特定文件、目录、端口等资源。
如果只是测试环境或者为了快速部署,很多人会直接关闭 SELinux:
setenforce 0
但更规范的做法是针对 MySQL 配置相应策略,而不是一刀切关闭。
例如:
# 查看 SELinux 状态
getenforce
# 允许 MySQL 网络访问
setsebool -P mysql_connect_any 1
# 如果使用自定义数据目录
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
# 如果使用自定义端口
semanage port -a -t mysqld_port_t -p tcp 3307
如果是生产环境,建议优先保留 SELinux,通过策略放行解决问题。
2)开放防火墙端口
如果需要远程连接 MySQL,还要放通 3306 端口:
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
3)执行安全初始化
mysql_secure_installation
这个命令很实用,会引导我们完成一些基本安全设置,例如:
- 修改 root 密码
- 删除匿名用户
- 禁止 root 远程登录
- 删除 test 测试库

这是官方推荐的初始化方式,建议安装完成后执行一次。
九、账号管理
安装完成后,一般不会直接让业务系统使用 root 账号,而是单独创建业务账号并赋权。
权限管理建议遵循最小权限原则,不要一上来就 GRANT ALL PRIVILEGES ON .。
1)创建账号
CREATE USER 'dev_team'@'113.120.%.%' IDENTIFIED BY 'Dev@#$123@Test';
2)赋权
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX
ON *.* TO 'dev_team'@'113.120.%.%';
3)查看用户
SELECT user, host FROM mysql.user;
4)刷新权限
FLUSH PRIVILEGES;
5)修改密码
ALTER USER 'dev_team'@'113.120.%.%' IDENTIFIED BY 'Dev@#$123@Test';
6)删除用户
DROP USER 'dev'@'14.155.%.%';
值得注意的是:FLUSH PRIVILEGES 在 CREATE USER、GRANT、ALTER USER、DROP USER 这类 DCL 语句之后通常不是必须的,因为这些语句本身就会生效。
不过出于习惯保留也没什么问题,只是没必要每一步都写。
十、常见问题排查
问题 1:MySQL 启动失败
执行:
systemctl start mysqld
报错:
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
这时候第一反应不是重装,而是先看状态和日志:
systemctl status mysqld.service
cat /var/log/mysqld.log
我当时在日志里看到的核心报错是:
Unsupported redo log format (v0). The redo log was created before MySQL 5.7.9
原因分析
这个问题的本质是:
新版本 MySQL 启动时,读取到了旧版本 InnoDB redo log,而旧日志格式太老,不兼容当前版本,导致启动失败。
换句话说,就是:
- 之前机器上部署过旧版本 MySQL
- /var/lib/mysql 下残留了旧数据文件
- 新版本 mysqld 试图"接管"这份旧数据目录
- 最终因为 redo log 格式不兼容而报错
解决办法
如果确认旧数据不需要保留,可以直接清理旧数据目录并重新初始化:
systemctl stop mysqld
rm -rf /var/lib/mysql/*
mysqld --initialize --user=mysql
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
如果旧数据需要保留,那就不能这么粗暴清理,而应该先恢复原版本环境,再评估升级路径。
问题 2:登录后提示必须先修改密码
有时初始化后登录 MySQL,会遇到报错:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
这表示当前使用的是临时密码,MySQL 要求你先修改 root 密码后,才能执行其他操作。
解决方法:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword@2026';
修改完成后再继续其他 SQL 操作即可。
如果你执行过 mysql_secure_installation,那在引导过程中一般就会完成密码修改。
问题 3:GPG 公钥不匹配
如果 yum install 时提示签名校验失败,通常是因为:
- 系统里导入的是旧版 MySQL GPG 密钥
- 当前 repo 对应包使用了新的签名密钥

解决方法一般是重新导入官方最新密钥:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
然后重新安装:
yum install -y mysql-community-server
极端情况下,如果只是测试环境,可以临时跳过:
yum install -y mysql-community-server --nogpgcheck
但生产环境不建议这样做。
十一、总结
这次在 CentOS 7 上安装 MySQL,真正让我印象深刻的不是安装命令本身,而是几个典型问题:
- 历史数据目录未清理,导致 MySQL 启动失败
- 旧版 repo 未处理干净,导致安装源冲突
- GPG 公钥不匹配,导致包安装失败
- MySQL 8 临时密码机制,导致登录后必须先改密码
回头看,其实 MySQL 安装流程本身不复杂,难的是:
是否能快速判断问题出在包、源、权限、数据目录还是安全策略。
所以这件事给我的最大感受是:
安装教程可以靠搜,命令可以靠抄,但排障能力还是得靠自己一点点积累。
总而言之,加油吧!少年 !ha h~