三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CentOS 8上MySQL 8.0.22安装配置与性能调优实战指南

CentOS 8上MySQL 8.0.22安装配置与性能调优实战指南

1. 项目概述与核心价值

最近在给一台新部署的CentOS 8服务器配置后端环境,数据库选型毫无悬念地指向了MySQL 8.0。虽然网上教程不少,但实际操作下来,发现从CentOS 8默认的软件仓库变迁,到MySQL 8.0.22特定版本的依赖处理,再到安全初始化的一连串细节,每一步都可能藏着“坑”。特别是对于刚接触Linux运维或者从CentOS 7迁移过来的朋友,沿用老方法很可能直接“翻车”。这篇文章,我就把自己从零开始在CentOS 8.5上成功部署MySQL 8.0.22的完整过程、踩过的坑以及最优实践整理出来。这不是一个简单的命令罗列,而是一个融合了环境理解、方案选型、问题预判和精细调试的实战记录,目标是让你看完后,不仅能顺利安装,更能理解每个操作背后的“为什么”,真正掌握在CentOS 8上驾驭MySQL 8的方法。

2. 环境准备与方案选型

2.1 理解CentOS 8的软件生态变化

在动手之前,我们必须先搞清楚CentOS 8和它的前辈们(比如CentOS 7)在软件管理上的一个关键区别,这直接决定了我们的安装路径。CentOS 8引入了一个重大的变化:它用DNF(Dandified YUM)作为默认的包管理器,取代了老牌的YUM。虽然yum命令依然作为dnf的软链接存在,兼容大部分旧有操作,但其底层已是dnf。更重要的是,CentOS 8默认的AppStream和BaseOS仓库中,不再直接提供MySQL服务器软件包,取而代之的是它的一个社区分支——MariaDB。

这意味着,如果你直接运行sudo dnf install mysql-server,系统会提示你安装的是mariadb-server。对于许多追求与Oracle官方MySQL完全兼容或需要特定MySQL 8.0功能(如窗口函数、公用表表达式、JSON增强等)的项目来说,这显然不是我们想要的结果。因此,我们的核心任务变成了:为系统添加Oracle官方的MySQL软件仓库(MySQL Yum Repository),然后通过这个“官方渠道”来安装我们需要的mysql-community-server

2.2 安装路径决策:Yum Repository vs. 通用二进制包

面对MySQL安装,通常有几种选择:通过操作系统的包管理器(如Yum/DNF)、下载通用二进制包(Generic Binary)解压配置,或者从源码编译。对于生产环境或追求稳定、便捷管理的场景,通过官方Yum仓库安装是首选方案,理由如下:

  1. 自动依赖管理dnf会自动解决并安装MySQL运行所需的所有依赖库(如numactl-libs,perl等),无需手动查找。
  2. 便捷的服务管理:安装包会自动集成Systemd服务单元(mysqld.service),可以使用标准的systemctl命令来启动、停止、启用开机自启,管理起来非常规范。
  3. 集中的文件布局:遵循Linux文件系统层次结构标准(FHS),配置文件在/etc/my.cnf,数据文件在/var/lib/mysql,日志在/var/log/mysqld.log,统一且易于定位。
  4. 安全的更新路径:通过仓库可以方便地进行安全更新和版本升级。

而通用二进制包虽然灵活,但需要手动处理依赖、创建用户、配置服务等,步骤繁琐,更适合需要高度定制化部署或无法连接外网的特殊环境。因此,本教程将围绕“配置官方Yum仓库并安装”这条最优路径展开。

2.3 基础系统检查与清理

在添加任何外部仓库之前,先给系统做个“体检”和“清洁”是个好习惯。

首先,更新系统已有的包到最新版本,这能确保基础库的稳定性:

sudo dnf update -y

接着,检查系统是否曾经安装过MySQL或MariaDB的旧版本。如果存在,为了避免版本冲突和配置污染,必须彻底清理。运行以下命令进行检查:

rpm -qa | grep -E 'mysql|mariadb'

如果输出类似mariadb-libs-5.5.68-1.el8.x86_64这样的包,说明有残留。使用dnf remove命令将其移除:

sudo dnf remove -y mariadb-libs

同时,检查并清理可能存在的旧配置文件和数据目录(如果这是全新服务器或你确认可以删除旧数据):

sudo rm -rf /etc/my.cnf /etc/my.cnf.d/ /var/lib/mysql

注意:删除/var/lib/mysql永久清除所有已有的MySQL数据库数据!请仅在全新安装或已备份数据的情况下执行。

3. 配置MySQL官方Yum仓库

3.1 下载与安装仓库配置包

Oracle为RHEL/CentOS系列提供了专门的仓库配置包(.rpm文件)。我们需要从MySQL官方网站下载对应CentOS 8的版本。

访问MySQL官方Yum仓库下载页面(通常可以通过搜索引擎找到),找到适用于EL8(Enterprise Linux 8, CentOS 8兼容)的仓库安装包。你也可以直接使用wget命令下载。这里以当前较新的版本为例(请注意,链接版本可能会更新):

sudo dnf install -y wget wget https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

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

sudo rpm -ivh mysql80-community-release-el8-4.noarch.rpm

这个操作不会安装MySQL软件本身,它只是向系统中添加了一个新的软件源配置文件(/etc/yum.repos.d/mysql-community.repo),告诉dnf可以从哪里找到MySQL的安装包。

3.2 理解仓库配置文件与版本锁定

安装完仓库包后,让我们查看一下关键的配置文件:

cat /etc/yum.repos.d/mysql-community.repo

你会看到文件中有多个[mysql80-community]这样的段落,它们可能对应着不同的子仓库,如[mysql80-community][mysql-cluster-8.0-community]等。每个段落下有几个关键参数:

  • enabled: 决定这个仓库是否启用,1为启用,0为禁用。
  • gpgcheck: 是否进行GPG签名校验,通常为1以确保软件包完整性。
  • gpgkey: GPG密钥的存放地址。

默认情况下,[mysql80-community]仓库是启用的(enabled=1),它会指向MySQL 8.0系列的最新版本。但我们的标题指定了要安装8.0.22这个特定版本。如果仓库中此版本可用,我们需要确保dnf安装的就是它,而不是更新的8.0.33或8.0.34。

首先,我们可以查看仓库中所有可用的mysql-community-server版本:

sudo dnf list available mysql-community-server --showduplicates | sort -r

在输出列表中寻找8.0.22版本。如果存在,我们可以通过两种方式指定安装它:

  1. 直接指定完整版本号安装
    sudo dnf install -y mysql-community-server-8.0.22
  2. 使用dnf module命令(如果该版本被包含在模块流中)。但更通用的做法是直接指定版本号。

如果仓库中已经没有8.0.22版本(因为官方仓库可能只保留最近几个版本),那么安装最新版的MySQL 8.0(如8.0.36)是更实际的选择,它们在核心功能和安装步骤上几乎一致,本教程的后续配置步骤完全通用。为了教程的连贯性,我们假设8.0.22版本可用。

实操心得:生产环境中,除非有严格的版本兼容性要求(例如,与某个特定版本的应用程序绑定),否则建议安装该系列(如8.0.x)的最新小版本,因为它包含了最多的错误修复和安全补丁。锁定一个过于陈旧的版本可能会带来安全风险。

4. 安装MySQL服务器与初始配置

4.1 执行安装命令

确定了版本策略后,开始安装MySQL服务器及其必要的客户端工具:

sudo dnf install -y mysql-community-server mysql-community-client

这个命令会安装mysql-community-server(数据库服务端)、mysql-community-client(命令行客户端)以及它们依赖的所有包。安装过程会自动创建mysql用户和用户组。

4.2 启动MySQL服务并设置开机自启

安装完成后,MySQL服务(mysqld)并不会自动运行。我们需要启动它,并设置为系统启动时自动运行:

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

运行status命令后,如果看到Active: active (running)字样,并且下面没有红色的错误日志,说明服务已经成功启动。

4.3 获取初始临时密码并安全初始化

MySQL 8.0 在首次启动后,为了安全起见,会为root用户生成一个临时随机密码。这个密码写在日志文件中。我们需要找到它:

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

输出会类似于:2023-10-27T08:00:00.000000Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: JqweKsl_8a?f。冒号后面的JqweKsl_8a?f就是你的临时密码,请立即复制下来。

接下来,使用这个临时密码登录MySQL,并进行安全初始化设置:

mysql -u root -p

输入刚才复制的临时密码。成功登录后,你会处于mysql>提示符下。在首次登录后,任何数据库操作都会被强制要求先修改root密码。因此,我们首先修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';

请将'YourNewStrongPassword123!'替换为你自己设定的高强度密码。MySQL 8.0默认启用了密码强度验证插件validate_password,密码必须包含大小写字母、数字和特殊字符,且长度通常至少8位。

密码修改成功后,建议运行MySQL自带的安全初始化脚本(虽然我们已手动改密,但该脚本还处理其他安全设置)。你可以退出MySQL(exit;),然后运行:

mysql_secure_installation

但更常见的做法是,在登录状态下直接执行一系列SQL命令来完成同等配置,这样更清晰可控:

  1. 移除匿名用户
    DELETE FROM mysql.user WHERE User='';
  2. 禁止root用户远程登录(生产环境强烈建议)
    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
  3. 移除测试数据库
    DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
  4. 刷新权限,使更改立即生效
    FLUSH PRIVILEGES;
  5. 退出MySQL
    exit;

至此,一个基本安全、可用的MySQL 8.0.22服务器就在你的CentOS 8上安装并配置完成了。

5. 基础配置与性能调优入门

5.1 核心配置文件 my.cnf 详解

MySQL的主要配置文件是/etc/my.cnf(它通常会包含/etc/my.cnf.d/目录下的所有.cnf文件)。默认安装后,这个文件可能比较简单。对于生产环境或有一定负载的测试环境,我们需要根据服务器硬件资源进行一些基础调优。

在修改任何配置文件之前,务必先备份

sudo cp /etc/my.cnf /etc/my.cnf.bak

然后使用vimnano编辑/etc/my.cnf。下面是一些针对拥有2核4GB内存的虚拟机的基础配置建议,你可以添加到[mysqld]段落下:

[mysqld] # 基础设置 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # 字符集设置,避免中文乱码 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 连接设置 max_connections=200 # 最大连接数,根据应用需求调整 connect_timeout=10 wait_timeout=300 # 非交互连接超时时间(秒) interactive_timeout=300 # 交互连接超时时间(秒) # 内存缓冲设置 (针对4GB内存的示例) innodb_buffer_pool_size=1G # InnoDB缓冲池大小,通常是物理内存的50%-70% key_buffer_size=64M # MyISAM键缓冲区(如果不用MyISAM表,可设小) query_cache_size=0 # MySQL 8.0已移除查询缓存,设为0或忽略 tmp_table_size=64M max_heap_table_size=64M # InnoDB存储引擎设置 innodb_log_file_size=256M # 重做日志文件大小 innodb_log_buffer_size=32M innodb_flush_log_at_trx_commit=1 # 事务提交时刷写日志,1最安全,2折中,0性能最好但风险高 innodb_file_per_table=ON # 每个表独立表空间,便于管理 innodb_flush_method=O_DIRECT # 建议在Linux上使用,减少双缓冲开销 # 二进制日志(用于主从复制或时间点恢复) # server-id=1 # 如果开启主从,需要设置唯一的server-id # log-bin=mysql-bin # 开启二进制日志 # binlog_format=ROW # 推荐使用ROW格式

保存并退出编辑器后,必须重启MySQL服务使配置生效

sudo systemctl restart mysqld

重启后,务必检查服务状态和日志,确认没有错误:

sudo systemctl status mysqld sudo tail -50 /var/log/mysqld.log

5.2 创建专用管理用户与远程访问控制

出于安全考虑,不应直接用root用户进行日常数据库操作。我们应该创建一个具有适当权限的专用管理用户。

首先,用root登录MySQL:

mysql -u root -p

然后执行以下SQL语句(请替换your_usernameyour_password):

-- 创建一个新用户,并设置密码 CREATE USER 'your_username'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; -- 授予该用户对所有数据库的所有权限(模拟root权限,但仅限本地连接) GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'localhost' WITH GRANT OPTION; -- 如果该用户需要从特定IP(例如192.168.1.100)远程连接,可以创建另一个用户 CREATE USER 'your_username'@'192.168.1.100' IDENTIFIED BY 'YourStrongPassword123!'; GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'192.168.1.100' WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;

重要安全提示GRANT ALL PRIVILEGES ON *.*赋予了用户极高的权限,等同于root。在生产环境中,应遵循最小权限原则,只授予应用或用户所必需的特定数据库(如app_db.*)和特定操作(如SELECT, INSERT, UPDATE, DELETE)的权限。

如果需要允许从任何主机远程连接(极度不推荐用于生产环境,仅限测试或内网可信环境),可以使用'your_username'@'%'。但请注意,这需要同时修改MySQL的绑定地址。编辑/etc/my.cnf,在[mysqld]段添加:

bind-address=0.0.0.0

重启服务后,防火墙还需要开放3306端口:

sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload

6. 常见问题排查与运维技巧

6.1 安装与启动阶段典型问题

问题1:安装时提示“没有可用软件包 mysql-community-server”或“无法找到匹配的参数:mysql-community-server”

  • 原因:最可能的原因是MySQL官方仓库没有成功启用,或者仓库配置文件中的enabled值被设为0。也可能是网络问题导致无法访问仓库。
  • 排查
    1. 检查仓库文件:cat /etc/yum.repos.d/mysql-community.repo,确认[mysql80-community]段落下的enabled=1
    2. 清理DNF缓存并重建:sudo dnf clean all && sudo dnf makecache
    3. 尝试手动启用仓库:sudo dnf config-manager --enable mysql80-community(需要安装dnf-utilssudo dnf install -y dnf-utils)。
    4. 检查网络连通性:ping repo.mysql.com

问题2:启动mysqld服务失败,状态显示failed

  • 原因:配置文件语法错误、数据目录权限问题、端口被占用、内存不足等。
  • 排查
    1. 首要查看错误日志sudo tail -100 /var/log/mysqld.log,日志会明确指示失败原因。
    2. 检查配置文件语法mysqld --verbose --help | grep -A 1 -B 1 "my.cnf"可以查看配置文件加载顺序。也可以使用mysqld --defaults-file=/etc/my.cnf --validate-config来校验配置(MySQL 8.0.16+支持)。
    3. 检查数据目录权限:确保/var/lib/mysql目录的所有者和组都是mysqlsudo chown -R mysql:mysql /var/lib/mysql
    4. 检查端口占用sudo ss -tlnp | grep :3306,看3306端口是否被其他进程占用。

问题3:忘记root密码怎么办?

MySQL 8.0修改了免密重置root密码的流程,比之前版本稍复杂:

  1. 停止MySQL服务:sudo systemctl stop mysqld
  2. 创建一个初始化文件,例如/tmp/mysql-init,内容为:
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewStrongPassword!';
  3. --init-file选项启动MySQL,并跳过权限表和网络:
    sudo mysqld --user=mysql --init-file=/tmp/mysql-init --skip-grant-tables --skip-networking &
    注意,--skip-grant-tables--skip-networking是安全关键参数。
  4. 等待几秒,然后用新密码登录测试:mysql -u root -p,输入新密码。
  5. 登录成功后,务必关闭这个特殊的MySQL实例。找到其进程ID并终止:sudo kill [PID]
  6. 删除初始化文件:sudo rm /tmp/mysql-init
  7. 以正常方式启动MySQL服务:sudo systemctl start mysqld

6.2 日常运维与监控命令速查

掌握一些基本的运维命令,能让数据库管理事半功倍:

  • 服务管理

    sudo systemctl status mysqld # 查看状态 sudo systemctl start mysqld # 启动 sudo systemctl stop mysqld # 停止 sudo systemctl restart mysqld # 重启(配置生效) sudo systemctl reload mysqld # 重载(部分配置生效) sudo journalctl -u mysqld -f # 实时查看服务日志
  • 数据库连接与基础信息

    mysql -u your_username -p # 连接数据库

    登录后常用SQL:

    SHOW DATABASES; -- 显示所有数据库 USE database_name; -- 切换到指定数据库 SHOW TABLES; -- 显示当前数据库所有表 SHOW PROCESSLIST; -- 显示当前所有连接/进程 SELECT VERSION(); -- 查看MySQL版本 STATUS; -- 查看服务器状态信息
  • 用户与权限管理

    SELECT User, Host FROM mysql.user; -- 查看所有用户 SHOW GRANTS FOR 'username'@'host'; -- 查看特定用户权限 -- 创建用户并授权(示例) CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'newuser'@'localhost'; FLUSH PRIVILEGES;
  • 备份与恢复(基础)

    # 使用mysqldump进行逻辑备份(全库) mysqldump -u username -p --all-databases > full_backup.sql # 备份单个数据库 mysqldump -u username -p database_name > db_backup.sql # 恢复数据库 mysql -u username -p database_name < db_backup.sql

6.3 性能与健康状态检查点

定期检查以下指标,可以了解数据库的健康状况:

  1. 连接数使用率:在MySQL内执行SHOW STATUS LIKE 'Threads_connected';SHOW VARIABLES LIKE 'max_connections';。如果连接数接近最大值,需要考虑调整max_connections或优化应用连接池。
  2. InnoDB缓冲池命中率:这是一个关键性能指标。执行SHOW ENGINE INNODB STATUS\G,在输出中查找Buffer pool hit rate。通常应高于99%,如果过低,说明innodb_buffer_pool_size可能设置得太小。
  3. 慢查询监控:确保slow_query_log已开启(在my.cnf中设置),并定期分析/var/lib/mysql/slow.log文件,找出需要优化的SQL语句。
  4. 磁盘空间监控:监控/var/lib/mysql目录的增长情况,特别是二进制日志(如果开启)和大的表数据文件。

安装只是第一步,让MySQL在CentOS 8上稳定、高效、安全地运行,需要持续的监控、调优和维护。建议在熟悉基础操作后,进一步学习如何解读EXPLAIN执行计划、如何设置主从复制、如何进行定期的物理备份(如使用Percona XtraBackup)等进阶主题。

← 返回列表