【环保】CentOS 7 安装 MySQL 8 实战记录:从安装到排障一次讲清

一、背景

前几天有朋友问我: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,真正让我印象深刻的不是安装命令本身,而是几个典型问题:

  1. 历史数据目录未清理,导致 MySQL 启动失败
  2. 旧版 repo 未处理干净,导致安装源冲突
  3. GPG 公钥不匹配,导致包安装失败
  4. MySQL 8 临时密码机制,导致登录后必须先改密码

回头看,其实 MySQL 安装流程本身不复杂,难的是:

是否能快速判断问题出在包、源、权限、数据目录还是安全策略。

所以这件事给我的最大感受是:

安装教程可以靠搜,命令可以靠抄,但排障能力还是得靠自己一点点积累。

总而言之,加油吧!少年 !ha h~

相关推荐
qiuyunoqy2 小时前
MySQL - 2
数据库·mysql
y = xⁿ2 小时前
MySQL学习笔记:乐观锁VS悲观锁/八股总结
笔记·学习·mysql
怀旧,2 小时前
【Linux系统编程】18. Linux进程信号(上)
linux·运维·服务器
minji...2 小时前
Linux 线程同步与互斥(五) 日志,线程池
linux·运维·服务器·开发语言·c++·算法
华清远见IT开放实验室2 小时前
嵌入式系统化课程 学习内容与服务说明
linux·stm32·学习·嵌入式·全栈·虚拟仿真·测评中心
圆山猫2 小时前
[Linux] Ubuntu 26.04 换阿里云镜像源(最新方法)
linux·ubuntu·阿里云
网络小白不怕黑3 小时前
1.2 VMware部署Rocky Linux 9 (MBR分区表,图形化安装)
linux·运维·服务器
贾斯汀玛尔斯3 小时前
每天学一个算法--Aho–Corasick 自动机
java·linux·算法
xlq223223 小时前
46.线程池
linux·开发语言