【2026最新版Linux安装Mysql】CentOS 7 安装 MySQL 8.4.9 完整流程(RPM 手动安装+避坑+面试)

前言 :本文记录在 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 个核心 RPMmysqld --initialize 拿临时密码 → chown mysqlsystemctl 启服 → ALTER USER 改密
  • 最简步骤 :下载 mysql安装包 → 解压 → 卸 mariadb-libs → 装依赖 → 顺序 rpm -ivh → 初始化 → 改权限 → 启动 → 改 root 密码
  • 必备命令mysqld --initialize --consolechown -R mysql:mysql /var/lib/mysql/systemctl start mysqld
  • 高危避坑 :RPM 安装顺序不能乱;初始化后数据目录所有者必须是 mysql ;远程访问需同时处理 用户授权 + 防火墙 + bind-address

📚 学习目标

  1. 理解 MySQL 8.4 RPM Bundle 各包职责及与系统 MariaDB 的冲突关系
  2. 能独立完成 CentOS 7 上 MySQL 8.4.9 的安装、初始化、改密与远程访问配置
  3. 掌握初始化、权限、防火墙、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 命令行工具(mysqlmysqldump 等)
mysql-community-icu-data-files 国际化数据(MySQL 8 必需
mysql-community-server 数据库服务 mysqld

可选包(develtestdebuginfo 等)一般无需安装。

1.4 与 yum 在线安装对比

方式 优点 缺点 适用
RPM Bundle 手动装 版本精确、可离线、与官网一致 步骤多、依赖需自己处理 指定 8.4.9、内网、老系统
MySQL Yum 仓库 省事、易升级 需配 repo、网络 能访问官方源的环境

二、安装解释

2.1 安装顺序为什么固定

RPM 之间存在 依赖关系server 依赖 libsclienticu-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-toolsperl

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.cnfss -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/ 非空,可能之前已初始化过
  • 解决
    1. 优先查看日志获取已有临时密码:grep 'temporary password' /var/log/mysqld.log
    2. 若确需重新初始化(会清空数据):
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 ,而 mysqldmysql 用户运行
  • 解决
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.cnfbind-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 应用领域干货,问题欢迎评论区交流。

相关推荐
草莓熊Lotso6 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
张文君6 小时前
ubuntu26.04坏道坏块分区隔离急速版260831-V0.12
linux·python
九皇叔叔14 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
贝锐15 小时前
从国产化信创设备到商用安卓终端,向日葵如何帮助企业实现统一运维管理?
linux·运维·远程控制
Julien200416 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
愤怒的苹果ext17 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
小张同学a.18 小时前
Docker 容器实战 1—— docker 基础与镜像构建
linux·运维·docker·容器
超兔一体云20 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
Best-Wishes21 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
wuminyu21 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++