【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 应用领域干货,问题欢迎评论区交流。

相关推荐
倔强的石头1062 小时前
【Linux 指南】文件系统系列(三):Ext系统核心实现 —— 从块组到 inode 与数据块映射全解析
大数据·linux·运维
我叫张小白。2 小时前
VMware 虚拟机安装 CentOS 7 并配置 SSH 远程连接全流程
linux·centos·ssh·vmware·mobaxterm
Hunter_pcx3 小时前
ubuntu:内存假泄漏
linux·运维·服务器·开发语言·c++·人工智能·ubuntu
赵成ccc3 小时前
【无标题】
linux·nginx
川石课堂软件测试3 小时前
接口测试常见面试题及答案
python·网络协议·mysql·华为·单元测试·prometheus·harmonyos
刘一说3 小时前
Ubuntu 系统上安装 Docker
linux·ubuntu·docker
星马梦缘3 小时前
操作系统实验5 —— 进程互斥
linux·操作系统·进程互斥
阳光九叶草LXGZXJ3 小时前
自制数据库迁移工具-C版-07-HappySunshineV1.6-(支持PG、达梦、Gbase8a)
linux·c语言·开发语言·数据库·学习·postgresql
剑神一笑3 小时前
深入理解 Linux gzip 压缩:从 DEFLATE 算法到实战优化
linux·运维·php