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

日记详情

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

CentOS 7安装MySQL 8.0:从YUM仓库配置到安全加固的完整指南

CentOS 7安装MySQL 8.0:从YUM仓库配置到安全加固的完整指南

1. 项目概述:为什么在CentOS 7上安装MySQL依然重要?

如果你正在管理一台CentOS 7服务器,并且需要部署一个数据库,那么MySQL大概率是你的首选之一。尽管CentOS 7已经是一个相对“成熟”的系统,但它在企业内网、遗留系统以及许多对稳定性要求极高的生产环境中依然占据着重要地位。选择在CentOS 7上安装MySQL,往往不是追求最新潮的技术,而是为了寻求一个经过长期验证、文档丰富、社区支持广泛的稳定组合。这个过程看似基础,但其中涉及的细节——从正确的软件源选择、版本兼容性判断,到安装后的安全加固和性能调优——恰恰是决定一个数据库服务能否稳定、高效运行的关键。很多新手甚至是有一定经验的运维,都可能在这里踩坑:比如用默认的yum源安装了老旧的MySQL 5.1,或者安装完发现root用户无法远程登录,又或者没调整好配置文件导致内存使用不当。今天,我就结合自己多次在CentOS 7生产环境部署MySQL的经验,把从零开始到安全可用的完整流程拆解清楚,不仅告诉你每一步怎么做,更重点解释“为什么要这么做”,以及那些官方文档里不会写的“坑”在哪里。

2. 核心思路与方案选型:YUM仓库 vs 二进制包

在CentOS 7上安装MySQL,主流方法有两种:通过配置官方的YUM仓库安装,或者下载官方的二进制压缩包进行手动安装。选择哪种方式,取决于你对控制力、版本和系统集成度的需求。

2.1 官方YUM仓库安装:推荐大多数场景

这是我最推荐给新手和大多数生产环境的方法。它的核心优势在于管理方便。通过添加MySQL官方提供的YUM仓库,你可以直接使用yum install命令来安装,系统会自动处理依赖关系。更重要的是,后续的升级、补丁安装都可以通过yum update命令轻松完成,与系统其他软件包的管理方式保持一致,非常规范。

为什么选择官方仓库而不是系统默认仓库?CentOS 7自带的Base仓库或EPEL仓库里可能包含一个叫mariadb-server的包,它是MySQL的一个分支。虽然兼容,但如果你需要官方原版的MySQL特性、或者要确保与某些特定商业软件兼容,直接安装mysql-community-server是更稳妥的选择。官方仓库提供了最新的稳定版(比如MySQL 8.0)和长期支持版(比如MySQL 5.7),你可以自由选择。

实操心得:在添加仓库时,务必根据你的CentOS 7版本(通常是el7)和MySQL大版本号选择正确的仓库配置文件。弄错了会导致安装失败。通常,我们选择当前通用的稳定版,比如MySQL 8.0。

2.2 二进制包安装:追求极致控制与特定版本

当你需要安装一个非常特定的版本(比如某个小版本号),或者希望将MySQL安装到非标准目录(例如/opt/mysql),又或者你的服务器无法连接外网时,二进制包安装是唯一的选择。

这种方法需要你手动下载.tar.xz压缩包,解压、创建用户组、初始化数据目录、配置启动脚本等一系列操作。步骤繁琐,但每一步都完全可控。它的劣势也很明显:后续的版本升级、打补丁都需要手动操作,容易出错,且不易与系统的服务管理工具(systemd)完美集成,需要自己编写服务文件。

注意事项:对于生产环境,除非有强制性的特定版本需求或网络隔离限制,否则强烈建议使用YUM仓库安装,以降低长期的维护成本。本文将主要详细讲解通过官方YUM仓库安装MySQL 8.0的完整流程,并在最后简要对比二进制包安装的关键差异点。

3. 详细安装步骤解析与实操

接下来,我们进入核心的实操环节。假设你有一台刚装好的、最小化安装的CentOS 7.9服务器,并拥有root权限。我们的目标是安装最新稳定版的MySQL 8.0社区版服务器。

3.1 准备工作:清理环境与配置仓库

在开始安装前,一个好的习惯是检查系统是否已经安装了旧版本的MySQL或MariaDB,并清理干净,避免冲突。

# 检查已安装的MariaDB或MySQL包 rpm -qa | grep -i mariadb rpm -qa | grep -i mysql # 如果发现旧版本,使用yum remove卸载它们及其相关包 # 例如:yum remove mariadb-server mariadb-client mariadb-libs -y # 卸载后,顺带删除残留的数据目录和配置文件(谨慎操作,确认无需备份) # rm -rf /var/lib/mysql # rm -rf /etc/my.cnf /etc/my.cnf.d/

清理完成后,开始配置MySQL官方的YUM仓库。访问MySQL官网的YUM仓库下载页面,找到对应CentOS 7的仓库RPM包链接。通常,我们可以直接使用wget下载并安装这个仓库配置包。

# 下载MySQL官方的YUM仓库安装包(以el7为例) wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 安装这个仓库包 rpm -ivh mysql80-community-release-el7-11.noarch.rpm

安装成功后,你会在/etc/yum.repos.d/目录下看到新增的mysql-community.repo等文件。这个文件里定义了多个子仓库,如mysql80-communitymysql57-community等,默认启用的是8.0版本。

注意:wget命令可能在某些最小化安装的系统中不存在,如果提示命令未找到,需要先安装它:yum install wget -y

3.2 执行安装与启动服务

仓库配置好之后,安装就变得非常简单了。

# 安装MySQL社区版服务器、客户端和一些常用工具 yum install mysql-community-server mysql-community-client -y

这个命令会安装mysql-community-server(服务器主程序)、mysql-community-client(命令行客户端)、mysql-community-libs(共享库)等一整套包。安装过程会自动解决所有依赖。

安装完成后,我们需要启动MySQL服务,并设置开机自启。在CentOS 7中,我们使用systemctl来管理服务。

# 启动MySQL服务 systemctl start mysqld # 设置MySQL服务开机自启 systemctl enable mysqld # 检查服务运行状态 systemctl status mysqld

如果状态显示为active (running),恭喜你,MySQL服务已经成功运行起来了。

3.3 获取初始密码与安全加固

MySQL 8.0在首次安装启动后,会为root@localhost用户生成一个临时的随机密码。这个密码记录在MySQL的错误日志文件中。我们必须先找到这个密码,才能登录并进行后续操作。

# 查看MySQL的临时root密码,日志文件通常位于/var/log/mysqld.log grep 'temporary password' /var/log/mysqld.log

输出结果类似于:2023-10-27T06:12:34.567890Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: JqweK,l-12aQ。冒号后面的JqweK,l-12aQ就是你的临时密码。

使用这个临时密码登录MySQL:

mysql -uroot -p

输入刚才查到的临时密码。成功登录后,你会发现命令行提示符变成了mysql>,但此时任何操作都会被拒绝,因为强制要求你必须先修改root密码

安全加固实操:在MySQL提示符下,执行以下命令修改root密码。MySQL 8.0有密码强度策略,要求密码包含大小写字母、数字和特殊字符,且长度至少8位。

# 修改root用户的本地登录密码,请将‘YourNewStrongPassword123!’替换成你自己的强密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';

修改密码后,建议运行MySQL自带的安全安装向导mysql_secure_installation。这是一个交互式脚本,会引导你完成一系列安全设置:

  1. 验证密码强度插件:是否使用密码强度验证组件?建议输入y启用,这样以后创建用户时会对密码强度有要求。
  2. 更改root密码:我们已经改过了,这里输入n跳过。
  3. 移除匿名用户:输入y,删除匿名测试账户,提高安全性。
  4. 禁止root远程登录这是关键一步!输入y,这意味着root用户只能从本地服务器(localhost)连接。生产环境务必这样做。
  5. 删除测试数据库:输入y,移除名为test的公开测试数据库。
  6. 立即重载权限表:输入y,使上述所有安全变更立即生效。

完成这些步骤,你的MySQL实例就有了一个最基本的安全基线。

3.4 基础配置与远程连接设置

默认的MySQL配置文件是/etc/my.cnf,它通常会包含一个指向/etc/my.cnf.d/目录的语句,实际的配置片段放在那个目录下,比如mysql-server.cnf。对于刚安装的实例,我们可能需要进行一些基础调整。

常见调整项:

  • 字符集:确保数据库默认使用UTF-8编码,避免中文乱码。可以在/etc/my.cnf.d/mysql-server.cnf中的[mysqld]段下添加:
    [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
    utf8mb4是真正的UTF-8编码,支持所有Unicode字符(如emoji)。
  • 默认存储引擎:设置为InnoDB。
    default-storage-engine=INNODB

修改配置后,需要重启MySQL服务使配置生效:systemctl restart mysqld

配置远程连接(谨慎操作):出于安全考虑,默认只允许本地连接。如果你的应用部署在另一台服务器上,需要开启远程连接。请注意,永远不要直接允许root用户远程连接。

正确的做法是:

  1. 在MySQL中创建一个专门用于远程连接的业务用户,并授予其最小必要权限。
    # 登录MySQL mysql -uroot -p # 创建用户‘appuser’,并允许其从‘192.168.1.%’网段连接,使用强密码 CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'AnotherStrongPass456!'; # 授予用户对特定数据库(例如‘myappdb’)的所有权限 GRANT ALL PRIVILEGES ON myappdb.* TO 'appuser'@'192.168.1.%'; # 刷新权限 FLUSH PRIVILEGES;
  2. 如果服务器有防火墙(如firewalld),需要开放MySQL的默认端口3306。
    # 查看防火墙状态 systemctl status firewalld # 如果防火墙开启,添加端口规则 firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload

4. 安装后的关键检查与性能初调

安装并配置完成后,不能假设一切就绪。进行以下几项检查,可以提前发现潜在问题。

4.1 服务与端口检查

确保服务在运行,并且监听在正确的端口和地址上。

# 检查服务状态 systemctl status mysqld | grep Active # 检查3306端口是否被监听,以及监听地址 netstat -tlnp | grep 3306 # 或使用ss命令 ss -tlnp | grep 3306

正常情况应看到0.0.0.0:3306:::3306,表示监听所有IPV4或IPV6地址。如果只看到127.0.0.1:3306,说明MySQL只绑定了本地回环地址,远程无法连接,需要检查配置文件中的bind-address项。

4.2 错误日志监控

安装或运行初期,多关注错误日志,能快速定位问题。错误日志位置通常在/var/log/mysqld.log

# 查看错误日志尾部最新内容 tail -f /var/log/mysqld.log

4.3 基础性能参数审视

对于小内存服务器(如1-2GB),MySQL的默认配置可能过高,需要调整。主要关注innodb_buffer_pool_size这个参数,它定义了InnoDB存储引擎缓存数据和索引的内存池大小,对性能影响极大。经验法则是,在专用数据库服务器上,可以设置为系统物理内存的50%-70%。如果只有1GB内存,可以尝试在/etc/my.cnf.d/mysql-server.cnf中调整:

[mysqld] innodb_buffer_pool_size = 256M

修改后重启服务。不要在生产环境盲目调整大量参数,应先从核心参数开始,并做好监控。

5. 常见问题排查与解决方案实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了几个我踩过的坑和解决方案。

5.1 安装失败:公钥检查未通过

yum install时,可能会遇到类似Failing package is: mysql-community-client-8.0.xx-1.el7.x86_64 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql的错误。

原因与解决:这是因为YUM在安装来自MySQL官方仓库的包时,会使用GPG密钥来验证软件包的完整性。有时密钥导入或验证会失败。解决方法就是手动导入MySQL的GPG公钥:

# 从MySQL服务器获取公钥并导入 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 # 也可以尝试导入历史密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2018

导入后,再次运行yum install即可。

5.2 忘记root密码怎么办?

如果你遗失了初始随机密码,或者修改后忘记了,无法登录MySQL,可以通过“跳过授权表”的方式重置。

  1. 停止MySQL服务:systemctl stop mysqld
  2. 以安全模式启动MySQL,跳过权限验证:
    mysqld_safe --skip-grant-tables --skip-networking &
    --skip-networking参数是为了防止此时任何远程连接,保证安全。
  3. 使用root用户无密码登录MySQL:mysql -uroot
  4. 在MySQL中执行以下命令刷新权限并修改密码(MySQL 8.0语法):
    FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword123!'; exit;
  5. 关闭安全模式下的MySQL进程,然后正常启动服务:
    # 找到mysqld_safe进程ID并kill掉 ps aux | grep mysqld_safe kill [进程ID] # 正常启动 systemctl start mysqld

5.3 远程客户端连接被拒绝

即使创建了用户、开放了防火墙,连接时仍可能收到ERROR 1130 (HY000): Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to this MySQL server错误。

排查思路:

  1. 检查用户授权:确认你创建的用户host部分是否正确。‘appuser’@‘%’表示允许从任何主机连接,‘appuser’@‘192.168.1.%’表示允许从192.168.1.0/24网段连接。使用SELECT user, host FROM mysql.user;查看。
  2. 检查MySQL绑定地址:确认my.cnfbind-address配置。如果是127.0.0.1localhost,MySQL只监听本地。可以将其注释掉或改为0.0.0.0(监听所有IPV4地址),然后重启服务。注意:改为0.0.0.0会增大安全风险,务必配合严格的防火墙和用户权限控制。
  3. 检查服务器防火墙:确认服务器的防火墙(firewalld或iptables)确实放行了3306端口。可以使用telnet [服务器IP] 3306从客户端测试端口连通性。

5.4 启动失败:数据目录权限问题

如果MySQL服务启动失败,查看日志/var/log/mysqld.log发现权限错误,例如[ERROR] [MY-010267] [Server] Could not create unix socket lock file /var/lib/mysql/mysql.sock.lock

原因与解决:这通常是MySQL数据目录(默认/var/lib/mysql)的文件所有权不对。MySQL服务进程默认以mysql用户和mysql组运行。你需要确保该目录及其内容属于mysql:mysql

# 停止MySQL服务 systemctl stop mysqld # 递归更改数据目录的所有权 chown -R mysql:mysql /var/lib/mysql # 重新启动服务 systemctl start mysqld

6. 二进制包安装方案关键差异点

对于必须使用二进制包安装的场景,这里简述关键步骤和与YUM安装的核心差异:

  1. 下载与解压:从MySQL官网下载对应版本的二进制包(如mysql-8.0.xx-linux-glibc2.17-x86_64.tar.xz),解压到目标目录,例如/usr/local/mysql
  2. 创建系统用户和组groupadd mysqluseradd -r -g mysql -s /bin/false mysql
  3. 准备数据目录:创建数据目录,如/data/mysql,并赋予mysql:mysql权限。
  4. 初始化数据库:进入解压目录,执行bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql。此步骤会生成临时root密码,务必记下。
  5. 配置启动脚本:这是最麻烦的一步。你需要手动复制或编写一个systemd服务文件(如/etc/systemd/system/mysqld.service),其中需要正确指定basedirdatadirpid-file等路径。也可以使用解压包内提供的support-files/mysql.server脚本,但集成度不如systemd。
  6. 后续管理:所有的操作,如启动(systemctl start mysqld)、停止、设置环境变量(需要手动将/usr/local/mysql/bin加入PATH)都需要自行配置和维护。

对比总结:二进制包安装给了你最大的灵活性,但将版本管理、依赖解决、服务集成、路径配置等所有负担都转移给了你自己。对于生产环境,除非万不得已,否则请坚持使用YUM仓库安装。

← 返回列表