CentOS 7系统下通过Yum源安装与配置MySQL 8.0完整指南
2026/8/12 18:27:35 网站建设 项目流程

1. 项目概述与核心价值

最近在给一台老旧的测试服务器做环境升级,系统是经典的CentOS 7,数据库需要从老旧的MySQL 5.7迁移到功能更强大的MySQL 8。虽然现在容器化部署很流行,但对于一些对稳定性有硬性要求、或者资源受限、又或者运维规范要求使用系统包管理器统一管理的场景,直接在操作系统上用yum安装MySQL 8依然是很多运维工程师和开发者的首选方案。这个方案的优势在于,它能与系统深度集成,服务管理(systemctl)方便,后续的补丁和安全更新也可以通过yum统一处理,对于追求稳定和可维护性的生产环境来说,是一条非常稳妥的路径。

然而,CentOS 7默认的官方仓库并不包含MySQL 8,直接yum install mysql-server只会找到老版本的MariaDB。网上教程很多,但要么步骤跳跃太大,要么关键细节一笔带过,比如如何选择正确的官方仓库、安装过程中的依赖冲突怎么解决、以及安装完成后那些关乎安全与性能的初始化配置。我把自己最近几次在CentOS 7上部署MySQL 8的完整过程,结合踩过的坑和总结的最佳实践,整理成这篇超详细教程。无论你是刚接触Linux的新手,还是需要快速复现环境的老手,跟着步骤走,都能在半小时内搞定一个生产可用的MySQL 8数据库服务。

2. 环境准备与Yum源配置

在开始安装之前,确保你的CentOS 7系统处于一个干净、网络通畅的状态。通过yum安装软件,源头是关键,配置一个可靠且速度快的Yum仓库是第一步,也是避免后续各种依赖问题的基础。

2.1 系统基础检查与清理

首先,我们需要确认系统版本并清理可能存在的旧版MySQL或MariaDB组件,防止冲突。

# 1. 确认系统版本 cat /etc/redhat-release # 2. 检查是否已安装MySQL或MariaDB rpm -qa | grep -E 'mysql|mariadb'

如果上述命令返回了类似mariadb-libs-5.5.68-1.el7.x86_64这样的包,千万不要直接使用yum remove草率删除。mariadb-libs是许多其他系统应用(比如Postfix邮件服务、一些PHP模块)的基础依赖,冒然移除可能导致系统组件损坏。正确的做法是,在安装MySQL 8官方包时,系统会智能地处理这个冲突,我们稍后会用到yum replace命令。

注意:对于已经存在数据的生产服务器,请务必先进行完整的数据备份。本教程主要针对全新环境或允许清空数据的测试/开发环境。

2.2 配置MySQL官方Yum仓库

CentOS 7自带的baseepel仓库没有MySQL 8。我们需要从MySQL官方网站获取仓库安装包。

# 1. 进入临时目录并下载MySQL官方的Yum仓库安装包 cd /tmp wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 如果wget速度慢或无法使用,可以先在本地浏览器下载,然后通过SFTP工具上传到服务器。

下载完成后,安装这个仓库包:

# 2. 安装MySQL Yum仓库 sudo rpm -ivh mysql80-community-release-el7-11.noarch.rpm

安装成功后,仓库配置文件会出现在/etc/yum.repos.d/目录下,文件名类似mysql-community.repomysql-community-source.repo。此时,你可以用yum repolist all | grep mysql查看启用状态。默认情况下,MySQL 8.0社区版仓库是启用的,其他版本(如5.7)是禁用的,这正符合我们的需求。

2.3 替换系统默认Yum源为国内镜像(可选但强烈推荐)

虽然MySQL仓库配置好了,但安装过程中还会从系统默认仓库(如baseepel)下载一些依赖包。默认的国外源速度可能很慢。为了提高整体安装速度,我们可以将CentOS的基础源替换为国内镜像,例如阿里云镜像。

# 1. 备份原有的源配置文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 2. 下载阿里云的CentOS 7源配置文件 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 3. 清理Yum缓存并生成新缓存 sudo yum clean all sudo yum makecache

这个操作能显著加速glibcopenssl等系统基础依赖包的下载速度。完成以上步骤后,我们的安装环境就已经准备就绪了。

3. 安装MySQL 8.0服务器

环境配置妥当,现在开始核心的安装步骤。我们将使用yum命令进行安装,并妥善处理可能出现的依赖冲突。

3.1 执行安装命令

安装命令非常简单:

sudo yum install mysql-community-server

执行这个命令后,yum会自动解析依赖关系。它会发现我们需要安装mysql-community-server,而这个包依赖于mysql-community-clientmysql-community-commonmysql-community-libs等一系列包。yum会从我们刚刚配置好的MySQL官方仓库中拉取所有这些包。

关键点来了:在解析依赖时,yum会识别出mysql-community-libs与系统已存在的mariadb-libs包冲突。在旧版本的教程中,可能需要手动强制移除mariadb-libs。但现在,yum会提供一个更优雅的解决方案。你会看到类似下面的提示:

... --> 正在处理依赖关系 mysql-community-libs(x86-64) >= 8.0.11,它被软件包 mysql-community-server-8.0.xx.x86_64 需要 --> 正在处理依赖关系 mariadb-libs(x86-64),它被软件包 postfix-2:2.10.1-9.el7.x86_64 需要 --> 解决依赖关系完成 ... ================================================================================ 软件包 架构 版本 仓库 大小 ================================================================================ 正在安装: mysql-community-server x86_64 8.0.xx-1.el7 mysql80 500 M 为依赖而安装: mysql-community-client x86_64 8.0.xx-1.el7 mysql80 50 M mysql-community-common x86_64 8.0.xx-1.el7 mysql80 600 k mysql-community-libs x86_64 8.0.xx-1.el7 mysql80 2.5 M 替换: mariadb-libs x86_64 1:5.5.68-1.el7 @base 4.5 M 事务概要 ================================================================================ 安装 3 软件包 (+1 个依赖软件包) 升级 0 软件包 替换 1 软件包 (mariadb-libs -> mysql-community-libs) ...

注意最后一行“替换 1 软件包 (mariadb-libs -> mysql-community-libs)”。这意味着yum会主动用mysql-community-libs替换掉mariadb-libs,并处理好由此引发的其他系统包的依赖关系变更(比如上面提到的postfix)。这是一个安全的操作,也是目前推荐的做法。输入y并回车,继续安装。

3.2 安装过程详解与验证

安装过程会自动下载所有必要的RPM包并进行安装。根据你的网络速度,可能需要等待几分钟。安装完成后,验证MySQL相关的包是否已正确安装:

rpm -qa | grep mysql-community

你应该能看到mysql-community-servermysql-community-clientmysql-community-libsmysql-community-common等包。

此时,MySQL 8.0软件已经安装到你的系统上,位于/usr/bin/mysql(客户端)和/usr/sbin/mysqld(服务器)。相关的配置文件模板在/usr/share/mysql,而真正的配置文件目录/etc/my.cnf.d和数据库数据目录/var/lib/mysql也已经创建好。

4. 初始化配置与安全加固

软件安装只是第一步,让MySQL服务安全地运行起来,并设置好管理员密码,才是重中之重。MySQL 8.0安装后,默认数据目录是空的,需要一个初始化过程。

4.1 启动MySQL服务并获取初始密码

首先启动MySQL服务,并设置开机自启:

# 启动MySQL服务 sudo systemctl start mysqld # 设置开机自启 sudo systemctl enable mysqld # 查看服务状态,确认是否启动成功 sudo systemctl status mysqld

如果状态显示为active (running),说明服务已成功启动。MySQL 8.0在首次启动时,会自动进行数据目录的初始化。在这个过程中,它会为root用户生成一个临时的随机密码。这个密码被记录在MySQL的错误日志文件中。我们需要找到它:

sudo grep 'temporary password' /var/log/mysqld.log

输出会类似于:

2024-05-10T03:02:12.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: JqslT8Gm*9Qa

请务必记下冒号后面的字符串JqslT8Gm*9Qa(你的实际密码会不同),这就是你的初始root密码。

4.2 运行安全配置向导并修改root密码

使用获取到的临时密码登录MySQL,并立即修改它。MySQL 8.0自带了一个强大的安全配置脚本mysql_secure_installation,但为了更清晰地理解每一步,我们手动操作一遍。

# 使用临时密码登录,-p后面直接回车,然后在提示符下输入密码 mysql -u root -p

输入临时密码登录成功后,你会看到mysql>提示符。在修改密码前,MySQL要求必须先修改密码策略,因为临时密码是随机的,不符合默认的密码强度要求。但我们可以先设置一个符合强密码策略的复杂密码。

-- 首先,必须修改root用户的密码。MySQL 8.0默认密码策略要求密码包含大小写字母、数字和特殊字符,长度至少8位。 ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewStrongPass123!'; -- 请务必将 'MyNewStrongPass123!' 替换为你自己设计的、足够复杂的密码。

修改成功后,你可以选择是否运行安全脚本,或者手动执行一些安全加固操作。手动操作可以让你更清楚每一步在做什么:

-- 1. 移除匿名用户(安装后默认存在) DELETE FROM mysql.user WHERE User=''; -- 2. 禁止root账户远程登录(生产环境强烈建议) -- 先确认root用户是否有'%'主机记录 SELECT Host, User FROM mysql.user WHERE User='root'; -- 通常有'localhost'和'%'。删除'%'的记录,只保留localhost。 DELETE FROM mysql.user WHERE User='root' AND Host='%'; -- 3. 移除名为'test'的测试数据库 DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; -- 4. 重新加载权限表,使所有更改立即生效 FLUSH PRIVILEGES; -- 退出MySQL命令行 EXIT;

完成这些操作后,你的MySQL 8.0实例已经具备了基本的安全性。下次登录就需要使用你新设置的强密码了。

5. 基础配置与远程连接设置

安装并加固后,我们还需要进行一些基础配置,以适应具体的应用需求,比如调整字符集、设置默认存储引擎,以及最重要的——配置远程连接(如果需要的话)。

5.1 调整MySQL配置文件 (my.cnf)

MySQL的主配置文件通常是/etc/my.cnf,但它通常会包含/etc/my.cnf.d/目录下的所有.cnf文件。建议在/etc/my.cnf.d/下创建自己的配置文件,例如my-custom.cnf,以避免直接修改主文件。

sudo vi /etc/my.cnf.d/my-custom.cnf

添加以下基础配置内容。这些配置覆盖了字符集、时区、连接数等常见调优点:

[mysqld] # 设置默认字符集为utf8mb4,支持完整的UTF-8编码(如emoji) character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 设置默认存储引擎为InnoDB default-storage-engine=INNODB # 设置服务器时区为东八区(中国标准时间) default-time-zone='+08:00' # 最大连接数,根据服务器内存和应用压力调整,默认151可能不够 max_connections=500 # 连接超时时间(秒) wait_timeout=600 interactive_timeout=600 # InnoDB缓冲池大小,这是最重要的性能参数,建议设置为系统物理内存的50%-70% # 例如,8G内存的机器可以设置为4G innodb_buffer_pool_size=4G # 禁用DNS反向解析,可以加快连接速度 skip-name-resolve [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4

注意innodb_buffer_pool_size的值需要根据你的服务器实际内存来调整。设置过大可能导致系统内存不足,设置过小则影响数据库性能。对于只有1-2G内存的测试机,设置为512M或1G即可。

保存退出后,需要重启MySQL服务使配置生效:

sudo systemctl restart mysqld sudo systemctl status mysqld # 确认重启成功

5.2 配置远程连接访问

默认情况下,MySQL只允许root用户从本地(localhost)连接。如果你的应用程序部署在另一台服务器上,需要开启远程访问。

重要警告:直接允许root用户远程访问是极高的安全风险。最佳实践是创建一个具有所需权限的专用用户,并仅允许从特定的应用服务器IP访问。

假设你的应用服务器IP是192.168.1.100,你需要创建一个数据库和用户:

# 登录MySQL mysql -u root -p
-- 1. 创建一个新的数据库(例如叫 `myappdb`) CREATE DATABASE myappdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 创建一个新用户,并设置密码。'myuser'@'192.168.1.100'表示只允许从该IP连接 CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY 'AnotherStrongPass456!'; -- 3. 授予用户对`myappdb`数据库的所有权限 GRANT ALL PRIVILEGES ON myappdb.* TO 'myuser'@'192.168.1.100'; -- 4. 立即生效权限 FLUSH PRIVILEGES; -- 退出 EXIT;

如果你必须允许root从任何主机远程连接(极度不推荐用于生产环境),可以执行:

-- 创建(或修改)一个可以从任何主机连接的root用户('%'代表任意主机) CREATE USER 'root'@'%' IDENTIFIED BY 'YourRootPassword'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

防火墙配置:别忘了,CentOS 7的防火墙(firewalld)默认会阻止3306端口。你需要开放它:

# 开放3306端口 sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent # 重新加载防火墙规则 sudo firewall-cmd --reload # 查看已开放的端口,确认3306在列 sudo firewall-cmd --zone=public --list-ports

完成以上所有步骤后,你的MySQL 8.0服务器就已经安装、配置完毕,并且可以从网络上的其他机器(在授权范围内)进行访问了。

6. 常见问题排查与性能调优建议

即使按照教程一步步操作,在实际环境中也可能遇到各种问题。这里我总结几个最常见的问题及其解决方法,并给出一些基础的性能观察方向。

6.1 安装与启动故障排查

问题1:yum install失败,提示“没有可用软件包”或“找不到仓库”。

  • 原因:MySQL官方Yum仓库没有正确安装或启用。
  • 解决
    1. 检查仓库文件:ls -la /etc/yum.repos.d/mysql*
    2. 查看仓库是否启用:yum repolist enabled | grep mysql。如果没有输出,编辑/etc/yum.repos.d/mysql-community.repo,确保[mysql80-community]下的enabled=1
    3. 清理缓存重试:sudo yum clean all && sudo yum makecache

问题2:启动mysqld服务失败,systemctl status mysqld显示错误。

  • 原因:最常见的是数据目录/var/lib/mysql权限错误,或者配置文件有语法错误。
  • 解决
    1. 查看错误日志尾部:sudo tail -50 /var/log/mysqld.log,日志会明确指示错误原因。
    2. 权限问题:确保/var/lib/mysql目录的所有者和组是mysql:mysql
      sudo chown -R mysql:mysql /var/lib/mysql sudo systemctl restart mysqld
    3. 配置文件错误:检查最近修改的.cnf文件,特别是my-custom.cnf是否有拼写错误。可以暂时重命名它,然后重启服务测试。
      sudo mv /etc/my.cnf.d/my-custom.cnf /etc/my.cnf.d/my-custom.cnf.bak sudo systemctl restart mysqld

问题3:忘记root密码。

  • 解决:需要以“跳过授权表”的模式启动MySQL,然后修改密码。
    1. 停止MySQL服务:sudo systemctl stop mysqld
    2. 以安全模式启动:sudo mysqld_safe --skip-grant-tables &
    3. 无密码登录:mysql -u root
    4. 在MySQL命令行中执行:
      FLUSH PRIVILEGES; -- 先刷新权限 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass'; -- MySQL 8.0可能需要先清空密码字段,但上述命令通常有效。
    5. 退出MySQL,然后关闭安全模式的MySQL进程,并正常启动服务。

6.2 连接与访问问题

问题:应用程序无法远程连接到MySQL。

  • 排查步骤(按顺序检查):
    1. 用户权限:确认在MySQL中创建的用户主机部分('user'@'host')是否正确。'myuser'@'%'允许所有主机,'myuser'@'192.168.1.%'允许一个网段。
    2. 防火墙:确认服务器防火墙已开放3306端口。使用telnet <服务器IP> 3306从客户端测试端口连通性。
    3. MySQL绑定地址:检查MySQL是否监听在0.0.0.0(所有接口)。查看配置文件/etc/my.cnf/etc/my.cnf.d/*.cnf中是否有bind-address = 127.0.0.1这一行。如果有,将其注释掉(#bind-address = 127.0.0.1)或改为bind-address = 0.0.0.0,然后重启MySQL。
    4. 云服务器安全组:如果你使用的是阿里云、腾讯云等云服务器,还需要在云平台的控制台配置安全组规则,入方向允许3306端口。

6.3 基础性能监控与调优点

安装完成后,如何知道MySQL运行是否健康?这里有几个简单的命令和观察点:

  1. 查看运行状态:登录MySQL后,执行SHOW GLOBAL STATUS LIKE 'Threads_connected';可以查看当前连接数。与配置的max_connections对比,如果接近,说明需要调高连接数或优化应用连接池。
  2. 检查缓冲池命中率:InnoDB缓冲池是性能核心。执行以下SQL计算命中率(应高于99%):
    SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'; -- 命中率 = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%
    如果命中率低,考虑增加innodb_buffer_pool_size
  3. 慢查询日志:对于排查性能瓶颈至关重要。在my-custom.cnf中开启:
    slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=2 # 执行时间超过2秒的查询被记录
    重启服务后,定期分析慢日志文件,找出需要优化的SQL语句。
  4. 定期维护:对于写入频繁的表,定期执行OPTIMIZE TABLE table_name;(注意会在表上锁)或使用pt-online-schema-change等在线工具进行整理,可以回收空间、优化索引结构。

通过以上步骤,你不仅能在CentOS 7上成功安装MySQL 8,还能对其有一个从安全配置到基础运维的全面了解。这套流程经过了多次实践验证,兼顾了效率与稳定性,希望能帮助你顺利搭建数据库环境。如果在操作中遇到上面没覆盖的独特问题,多查看/var/log/mysqld.log这个日志文件,它几乎总是能给出最准确的错误线索。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询