前言 :本文记录在 CentOS 7 / RHEL 7 上,通过官网 RPM Bundle tar 包 手动安装 MySQL 8.4.9(LTS) 的完整可复现流程。适合需要在老版本 CentOS 上部署 MySQL、为 Python/AI 后端或 Java 项目准备数据库环境的读者。读完可按步骤完成安装、改密、远程访问配置,并快速定位 6 类常见安装故障。
⚡ 快速参考
- 适用场景 :CentOS 7 无法直接用 yum 装到目标版本;需要指定 MySQL 8.4.x LTS;生产/测试机离线或半离线部署
- 核心结论 :先卸 MariaDB → 按固定顺序装 6 个核心 RPM →
mysqld --initialize拿临时密码 → chown mysql →systemctl启服 →ALTER USER改密 - 最简步骤 :下载 mysql安装包 → 解压 → 卸 mariadb-libs → 装依赖 → 顺序 rpm -ivh → 初始化 → 改权限 → 启动 → 改 root 密码
- 必备命令 :
mysqld --initialize --console、chown -R mysql:mysql /var/lib/mysql/、systemctl start mysqld - 高危避坑 :RPM 安装顺序不能乱;初始化后数据目录所有者必须是 mysql ;远程访问需同时处理 用户授权 + 防火墙 + bind-address
📚 学习目标
- 理解 MySQL 8.4 RPM Bundle 各包职责及与系统 MariaDB 的冲突关系
- 能独立完成 CentOS 7 上 MySQL 8.4.9 的安装、初始化、改密与远程访问配置
- 掌握初始化、权限、防火墙、SELinux 等典型故障的定位与修复方法
一、环境
1.1 环境与版本
| 项目 | 说明 |
|---|---|
| 操作系统 | CentOS 7 / RHEL 7 |
| MySQL 版本 | 8.4.9 (8.4 系列 LTS,长期支持) |
| 安装包 | mysql-8.4.9-1.el7.x86_64.rpm-bundle.tar |
| 安装方式 | 从 tar 解压后 手动 rpm -ivh(非 yum 源一键装) |
1.2 为什么要先卸载 MariaDB
CentOS 7 默认自带 MariaDB 客户端库(如 mariadb-libs),与 MySQL 官方 RPM 中的 mysql-community-libs 会冲突(同名能力、不同实现)。不卸载会导致 MySQL RPM 安装失败或运行时链接错误。
1.3 RPM Bundle 核心包职责(必装 6 个)
| 包名 | 作用 |
|---|---|
mysql-community-common |
公共文件(错误信息、字符集等) |
mysql-community-client-plugins |
客户端认证插件 |
mysql-community-libs |
共享库(客户端与服务端共用) |
mysql-community-client |
命令行工具(mysql、mysqldump 等) |
mysql-community-icu-data-files |
国际化数据(MySQL 8 必需) |
mysql-community-server |
数据库服务 mysqld |
可选包(devel、test、debuginfo 等)一般无需安装。
1.4 与 yum 在线安装对比
| 方式 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| RPM Bundle 手动装 | 版本精确、可离线、与官网一致 | 步骤多、依赖需自己处理 | 指定 8.4.9、内网、老系统 |
| MySQL Yum 仓库 | 省事、易升级 | 需配 repo、网络 | 能访问官方源的环境 |
二、安装解释
2.1 安装顺序为什么固定
RPM 之间存在 依赖关系 :server 依赖 libs、client、icu-data-files 等;libs 又依赖 common。逆序安装会报依赖不满足。因此必须按:common → client-plugins → libs → client → icu-data-files → server。
2.2 mysqld --initialize 做了什么
- 在数据目录(默认
/var/lib/mysql/)创建系统库、权限表等文件结构 - 为
root@localhost生成 随机临时密码 (控制台或/var/log/mysqld.log中可见) - 首次启动前必须完成;若目录非空会报 data directory has files in it
2.3 为什么必须 chown mysql:mysql
mysqld 服务进程以 mysql 系统用户 运行,不能读写 root 拥有的数据文件。若 --initialize 后以 root 执行过操作,易出现 Error: 13(权限不够) ,服务 failed。
2.4 远程连接的三道关
text
客户端 --TCP 3306--> 防火墙 --允许--> mysqld 监听地址(bind-address)
|
用户 host(如 root@'%')
仅改 bind-address 不够;还需 MySQL 用户授权 与 firewalld/iptables (及可能的 SELinux)。
三、完整过程
3.1 环境准备
- 操作系统:CentOS 7 / RHEL 7
- MySQL 版本:8.4.9(LTS)
- 安装方式:RPM 包手动安装(从 tar 包解压)
3.2 Step 1:下载 MySQL 安装包
从 MySQL 官网 下载:
mysql-8.4.9-1.el7.x86_64.rpm-bundle.tar
上传到服务器(如 /opt 或 /root)。

3.3 Step 2:解压 tar 包
bash
tar -xvf mysql-8.4.9-1.el7.x86_64.rpm-bundle.tar
解压后得到多个 .rpm 文件,进入该目录进行后续安装。
验证 :ls *.rpm 应能看到 common、libs、server 等包。
3.4 Step 3:卸载系统自带的 MariaDB 库(避免冲突)
bash
# 查看是否已安装
rpm -qa | grep mariadb
# 强制卸载(忽略依赖)------包名以实际查询结果为准
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
注意 :包名可能略有不同,务必以
rpm -qa | grep mariadb输出为准。
3.5 Step 4:安装依赖工具
MySQL 服务启动需要 net-tools 和 perl:
bash
yum install -y net-tools perl
若安装 RPM 时提示 libnuma.so.1 缺失,额外执行:
bash
yum install -y numactl
3.6 Step 5:按顺序安装 MySQL RPM 包(顺序非常重要)
进入解压后的目录,依次执行:
bash
rpm -ivh mysql-community-common-8.4.9-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.4.9-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.4.9-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.4.9-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.4.9-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.4.9-1.el7.x86_64.rpm
可选包(devel、test、debuginfo 等)无需安装。
3.7 Step 6:初始化数据库
bash
mysqld --initialize --console
执行后会生成临时 root 密码,务必复制保存。示例输出:
text
[Note] A temporary password is generated for root@localhost: aS!F_LC>24NJ
若控制台无输出,请查看 /var/log/mysqld.log:
bash
grep 'temporary password' /var/log/mysqld.log
若报错 data directory has files in it ,说明 /var/lib/mysql/ 非空,见 五、避坑总结 问题 3。
3.8 Step 7:修正数据目录权限
初始化后,数据目录 /var/lib/mysql/ 下文件所有者可能为 root ,需改为 mysql 用户:
bash
chown -R mysql:mysql /var/lib/mysql/
3.9 Step 8:启动 MySQL 服务并设置开机自启
bash
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld # 确认状态为 active (running)
3.10 Step 9:登录并修改 root 密码
使用临时密码登录:
bash
mysql -uroot -p
# 输入临时密码(如 aS!F_LC>24NJ)
进入 MySQL 命令行后执行:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新强密码';
FLUSH PRIVILEGES;
EXIT;
MySQL 8 默认启用密码策略,新密码需足够复杂(大小写、数字、特殊字符等),否则
ALTER USER可能失败。
3.11 Step 10:配置远程访问(可选)
10.1 授权 root 用户允许任意 IP 连接
sql
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
生产建议 :不要长期使用
root@'%',应创建业务专用账号并最小权限授权。
10.2 开放防火墙 3306 端口
bash
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
10.3 检查 bind-address
查看 /etc/my.cnf 中是否有 bind-address=127.0.0.1:
- 若有:注释掉或改为
bind-address=0.0.0.0 - 若无:默认通常已监听所需接口(以实际
my.cnf与ss -lntp | grep 3306为准)
10.4 重启 MySQL 使配置生效
bash
systemctl restart mysqld
10.5 测试远程连接
在其他机器上用客户端(DataGrip、Navicat)或命令行:
bash
mysql -h 服务器IP -u root -p
3.12 最终验证
| 检查项 | 命令 |
|---|---|
| 本地登录 | mysql -uroot -p |
| 远程登录 | mysql -h 服务器IP -uroot -p |
| 服务状态 | systemctl status mysqld |
| 查看版本 | mysql --version |
四、场景应用
场景 1: 后端本地联调库
- 需求:在 CentOS 7 测试机上为 FastAPI、Django、LangChain 等应用提供持久化存储
- 方案:按本文安装 MySQL 8.4.9,创建业务库与用户,应用连接串指向内网 IP:3306
- 收益:版本与生产一致,避免「开发用 SQLite、上线用 MySQL」的语法差异
场景 2:内网离线或弱网服务器
- 需求 :服务器无法访问外网 yum 源,但必须固定 8.4.9 版本
- 方案 :在有网机器下载
rpm-bundle.tar拷贝到目标机,走 RPM 手动安装全流程 - 收益:安装包可审计、可归档,满足合规与版本锁定
场景 3:从 MariaDB 迁移到 MySQL 8.4
- 需求:原系统依赖 CentOS 自带 MariaDB,现需 MySQL 8.4 特性(如窗口函数、JSON、认证插件)
- 方案 :先
--nodeps卸载mariadb-libs,再装 MySQL Bundle;数据迁移用mysqldump或逻辑复制(迁移前务必备份) - 收益:统一技术栈,便于与云 RDS MySQL 8.4 对齐
五、开发避坑总结(高频错误)
5.1 常见问题及解决方案(保留原笔记全部案例)
问题 1:rpm -e mariadb-libs 提示依赖错误
- 现象:无法卸载,提示被其他包依赖
- 原因 :其他 RPM 声明依赖
mariadb-libs - 解决 :使用
--nodeps强制卸载
bash
rpm -e --nodeps mariadb-libs
(包名以 rpm -qa | grep mariadb 为准。)
问题 2:安装 RPM 包时提示 libnuma.so.1 缺失
- 原因:未安装 NUMA 相关库
- 解决:
bash
yum install -y numactl
问题 3:mysqld --initialize --console 没有输出(或报错 data directory has files in it)
- 原因 :数据目录
/var/lib/mysql/非空,可能之前已初始化过 - 解决 :
- 优先查看日志获取已有临时密码:
grep 'temporary password' /var/log/mysqld.log - 若确需重新初始化(会清空数据):
- 优先查看日志获取已有临时密码:
bash
rm -rf /var/lib/mysql/*
mysqld --initialize --console
chown -R mysql:mysql /var/lib/mysql/
问题 4:启动失败,systemctl status mysqld 显示 Error: 13(权限不够)
- 现象 :
Active: failed,日志提示权限问题 - 原因 :
/var/lib/mysql/或其中文件所有者为 root ,而mysqld以 mysql 用户运行 - 解决:
bash
chown -R mysql:mysql /var/lib/mysql/
systemctl start mysqld
问题 5:远程连接报 Host 'xxx' is not allowed to connect
- 原因 :
root仅允许localhost,未授权远程 host - 解决 :按上文 10.1 创建
root@'%'或单独业务用户;或修改现有用户的host字段
问题 6:远程连接超时或拒绝连接
- 可能原因 :
- 防火墙未开放 3306
- MySQL 绑定了 127.0.0.1
- SELinux 阻止
- 解决 :
- 开放防火墙端口(见 10.2)
- 检查
/etc/my.cnf中bind-address - 临时测试:
setenforce 0(生产环境不建议永久关闭 SELinux,应配置正确策略)
5.2 最佳实践
- 安装前对重要数据 全量备份 ;
rm -rf /var/lib/mysql/*仅用于确定可丢弃的空库环境 - 记录并妥善保管 临时密码 ,首次登录后立即
ALTER USER - 生产环境使用 独立业务账号 + 最小权限 ,避免
root@'%' - 改配置后习惯
systemctl restart mysqld,并用tail -f /var/log/mysqld.log观察启动日志 - CentOS 7 已 EOL,新环境优先考虑 Rocky/Alma 8+ 或容器化 MySQL;本文适用于必须留在 el7 的场景
附录:常用 MySQL 管理命令
| 操作 | 命令 |
|---|---|
| 启动服务 | systemctl start mysqld |
| 停止服务 | systemctl stop mysqld |
| 重启服务 | systemctl restart mysqld |
| 查看服务状态 | systemctl status mysqld |
| 查看错误日志 | tail -f /var/log/mysqld.log |
| 修改 root 密码 | ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; |
| 创建用户并授权 | CREATE USER 'user'@'%' IDENTIFIED BY 'pwd'; GRANT ALL ON *.* TO 'user'@'%'; |
| 刷新权限 | FLUSH PRIVILEGES; |
本文为 MY_TRUCK 原创实战学习笔记,持续更新 Java 后端与 AI 应用领域干货,问题欢迎评论区交流。