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

日记详情

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

Rocky Linux 10安装MySQL 9.7全攻略:从零配置到安全优化

Rocky Linux 10安装MySQL 9.7全攻略:从零配置到安全优化

最近在部署新的服务器环境时,选择了Rocky Linux 10作为操作系统,并需要安装最新的MySQL 9.7版本。过程中发现,虽然MySQL 8.0的教程很多,但针对Rocky Linux 10和MySQL 9.7的完整中文指南却比较零散,尤其是在配置优化和安全加固方面。本文将为你提供一份从零开始的详细安装与配置教程,涵盖从系统准备、软件安装、安全初始化到远程连接和基础优化的全流程。无论你是运维工程师还是后端开发者,都能按照步骤成功搭建一个稳定、安全的MySQL数据库服务。

1. 环境准备与系统检查

在开始安装MySQL之前,确保你的Rocky Linux 10系统已经准备就绪。一个干净、稳定的基础环境是后续步骤顺利进行的保障。

1.1 系统更新与依赖检查

首先,我们需要将系统更新到最新状态,并安装一些必要的工具。通过SSH连接到你的Rocky Linux 10服务器,执行以下命令:

# 1. 更新系统所有包到最新版本 sudo dnf update -y # 2. 安装常用的工具,如wget、vim、net-tools等 sudo dnf install -y wget vim net-tools bash-completion # 3. 检查系统版本,确认是Rocky Linux 10 cat /etc/redhat-release

执行cat /etc/redhat-release后,你应该看到类似Rocky Linux release 10.x (Blue Onyx)的输出。这一步很重要,因为不同大版本的系统,其软件仓库和依赖库可能不同。

1.2 关闭SELinux与防火墙(临时,用于测试环境)

对于学习和测试环境,为了避免SELinux和防火墙带来的额外配置复杂度,我们可以暂时将其关闭。请注意,在生产环境中,你需要根据安全策略仔细配置防火墙规则和SELinux,而不是直接关闭。

# 1. 临时关闭SELinux(重启后失效) sudo setenforce 0 # 2. 永久关闭SELinux(需要重启系统) # 编辑SELinux配置文件 sudo vim /etc/selinux/config # 将 `SELINUX=enforcing` 修改为 `SELINUX=disabled` # 保存并退出 # 3. 停止并禁用防火墙(firewalld) sudo systemctl stop firewalld sudo systemctl disable firewalld # 4. 检查防火墙状态,应为 inactive (dead) sudo systemctl status firewalld

重要提醒:在生产服务器上,请务必配置精确的防火墙规则,只开放必要的端口(如MySQL的3306端口给特定IP),并保持SELinux在 enforcing 模式下的适当策略。

1.3 添加MySQL官方存储库

Rocky Linux 10的默认AppStream仓库可能不包含最新的MySQL 9.7。为了获得官方支持、自动更新和最新的功能,我们需要添加MySQL的官方YUM存储库。

  1. 访问MySQL官方社区版下载页面,找到YUM Repository的RPM包链接。或者,直接使用wget下载。
  2. 执行以下命令:
# 下载MySQL 9.7的YUM仓库安装包 # 请注意,具体的RPM包链接可能会随版本更新而变化,请以官网为准。 # 这里以目前常见的el9版本为例(Rocky Linux 10兼容RHEL 9的包) sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-7.noarch.rpm # 安装下载的仓库包 sudo dnf install -y mysql80-community-release-el9-7.noarch.rpm # 检查是否添加成功,会列出所有启用的MySQL仓库 sudo dnf repolist enabled | grep mysql

安装成功后,你会看到名为mysql-9.7-community的仓库被启用。如果默认启用的不是9.7版本,你可能需要运行sudo dnf config-manager --disable mysql80-communitysudo dnf config-manager --enable mysql97-community来切换。

2. 安装MySQL 9.7服务器

存储库配置好后,安装过程就变得非常简单。

2.1 执行安装命令

使用DNF包管理器一键安装MySQL服务器社区版及其客户端:

# 安装MySQL服务器和客户端 sudo dnf install -y mysql-community-server mysql-community-client # 安装常用的MySQL工具和兼容库(可选但推荐) sudo dnf install -y mysql-community-common mysql-community-libs

安装过程会自动处理所有依赖关系。mysql-community-server是核心数据库服务,mysql-community-client包含了mysql命令行工具。

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

安装完成后,需要启动服务并确保它在系统重启后能自动运行。

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

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

3. 安全初始化与密码配置

MySQL 9.7在首次启动后,会为root用户生成一个临时的随机密码。我们必须找到这个密码,并运行安全脚本来进行初始化设置。

3.1 获取临时root密码

临时密码记录在MySQL的日志文件中。

# 查看MySQL的错误日志,其中包含了初始密码 sudo grep ‘temporary password’ /var/log/mysqld.log

命令输出会类似于:

2024-05-XXTXX:XX:XX.XXXXXXZ 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: JqkfT2&sa!eG

请务必记下root@localhost:后面的字符串JqkfT2&sa!eG,这就是你的临时密码。

3.2 运行安全配置向导

使用mysql_secure_installation脚本是加固MySQL安装安全性的标准步骤。它会引导你完成以下操作:

  • 设置新的root密码。
  • 移除匿名用户。
  • 禁止root用户远程登录(可选,但建议)。
  • 移除测试数据库。
  • 重新加载权限表。
# 运行安全初始化脚本 sudo mysql_secure_installation

按照提示进行操作:

  1. 输入刚才找到的临时密码
  2. 系统会询问你是否要更改root密码。输入y并设置一个强密码。MySQL 9.7默认有密码强度策略,密码需包含大小写字母、数字和特殊字符,长度至少8位。
  3. 移除匿名用户?输入y
  4. 禁止root账户远程登录?输入y。这是关键的安全实践,root权限应仅限于本地连接。远程管理请使用具有特定权限的普通用户。
  5. 删除测试数据库test?输入y
  6. 立即重新加载权限表?输入y

完成以上步骤后,你的MySQL安装就基本安全了。

3.3 验证安装与登录

现在,使用你刚设置的新root密码登录MySQL,验证安装是否成功。

# 使用root用户和密码登录MySQL命令行 mysql -u root -p

输入密码后,你将看到MySQL的命令行提示符mysql>。执行一些简单命令测试:

-- 显示当前MySQL版本 SELECT VERSION(); -- 显示所有数据库 SHOW DATABASES; -- 退出MySQL命令行 EXIT;

如果SELECT VERSION();返回9.7.x之类的版本号,恭喜你,MySQL 9.7已经成功安装并运行。

4. 基础配置与优化

默认的MySQL配置可能不适合你的服务器硬件和应用需求。我们需要进行一些基础调整。

4.1 配置MySQL服务器(my.cnf)

MySQL的主配置文件通常是/etc/my.cnf/etc/mysql/my.cnf。在Rocky Linux上,我们编辑/etc/my.cnf

# 备份原始配置文件 sudo cp /etc/my.cnf /etc/my.cnf.bak # 使用vim编辑配置文件 sudo vim /etc/my.cnf

[mysqld]部分,添加或修改以下关键参数。请根据你的服务器内存大小进行调整(以下配置假设服务器内存为4GB):

[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=1000 # 最大连接数,根据应用需求调整 connect_timeout=10 # 连接超时时间 wait_timeout=28800 # 非交互式连接超时时间 interactive_timeout=28800 # 交互式连接超时时间 # 内存与缓存设置(针对4GB内存的示例) innodb_buffer_pool_size=1G # InnoDB缓冲池大小,通常是物理内存的50%-70% key_buffer_size=256M # MyISAM键缓冲区大小 query_cache_size=0 # MySQL 8.0+已移除查询缓存,9.7应设置为0或忽略 tmp_table_size=64M max_heap_table_size=64M # InnoDB存储引擎设置 innodb_log_file_size=256M # 重做日志文件大小 innodb_flush_log_at_trx_commit=1 # 事务提交时刷写日志,1为最安全,2性能更好但可能丢1秒数据 innodb_lock_wait_timeout=50 # 锁等待超时时间 # 二进制日志(用于主从复制或时间点恢复),按需开启 # server-id=1 # log-bin=mysql-bin # binlog_format=ROW # 慢查询日志,用于性能分析 slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=2 # 超过2秒的查询被记录

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

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

4.2 创建用于远程连接的管理用户

出于安全考虑,我们不应该直接用root用户进行远程连接。最佳实践是创建一个具有所需权限的专用用户。

  1. 使用root用户登录MySQL:

    mysql -u root -p
  2. 执行以下SQL语句创建一个新用户并授权。将‘your_strong_password’替换为强密码,将‘your_remote_ip’替换为允许连接的服务器的IP地址,或者使用‘%’允许任何IP连接(不推荐,仅用于测试)。

    -- 创建一个新用户,例如 ‘admin’@‘your_remote_ip’ CREATE USER ‘admin’@‘your_remote_ip’ IDENTIFIED BY ‘your_strong_password’; -- 授予该用户对所有数据库的所有权限(相当于远程的root,生产环境请按需授权) GRANT ALL PRIVILEGES ON *.* TO ‘admin’@‘your_remote_ip’ WITH GRANT OPTION; -- 或者,授予更细粒度的权限,例如对特定数据库‘mydb’的所有权限 -- GRANT ALL PRIVILEGES ON mydb.* TO ‘app_user’@‘%’; -- 刷新权限,使授权立即生效 FLUSH PRIVILEGES; -- 查看用户权限 SELECT host, user FROM mysql.user;
  3. 退出MySQL命令行:EXIT;

5. 配置防火墙开放MySQL端口

如果你在生产环境中没有禁用防火墙(firewalld),那么需要开放MySQL的默认端口3306,以便远程客户端能够连接。

# 启动防火墙(如果之前停止了) sudo systemctl start firewalld sudo systemctl enable firewalld # 永久开放3306端口 sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent # 重新加载防火墙配置 sudo firewall-cmd --reload # 查看已开放的端口,确认3306在列表中 sudo firewall-cmd --zone=public --list-ports

6. 常见问题与故障排查

即使按照步骤操作,你也可能会遇到一些问题。下面是一些常见问题的解决方法。

6.1 安装失败:公钥检查错误

问题现象:执行sudo dnf install mysql-community-server时,出现GPG key retrieval failedSignature verification failed错误。

原因:未导入或无法验证MySQL仓库的GPG密钥。

解决方案

# 手动导入MySQL的GPG密钥 sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 # 再次尝试安装 sudo dnf install -y mysql-community-server

6.2 启动失败:权限问题

问题现象sudo systemctl status mysqld显示失败,日志/var/log/mysqld.log中有Permission deniedCannot create directory错误。

原因/var/lib/mysql数据目录的权限不正确。

解决方案

# 停止MySQL服务 sudo systemctl stop mysqld # 确保数据目录的属主和属组是mysql:mysql sudo chown -R mysql:mysql /var/lib/mysql # 重新启动服务 sudo systemctl start mysqld

6.3 远程客户端无法连接

问题现象:从另一台机器使用mysql -h <server_ip> -u admin -p连接时,提示Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to this MySQL server

原因

  1. 用户授权的主机部分不正确(例如,创建用户时用了‘admin’@‘localhost’)。
  2. 服务器防火墙未开放3306端口。
  3. MySQL配置文件中bind-address绑定了127.0.0.1(只监听本地)。

排查步骤

  1. 检查用户权限:在服务器上登录MySQL,执行SELECT host, user FROM mysql.user;,确认你的用户(如admin)对应的host是‘%’或你的客户端IP。
  2. 检查防火墙:在服务器上执行sudo firewall-cmd --list-ports,确认3306端口已开放。
  3. 检查绑定地址:查看/etc/my.cnf,确认没有bind-address = 127.0.0.1这一行,或者将其改为bind-address = 0.0.0.0(监听所有接口)。修改后需重启MySQL
  4. 网络测试:在客户端使用telnet <server_ip> 3306测试端口连通性。如果不通,说明是网络或防火墙问题。

6.4 忘记root密码

问题现象:无法用root密码登录MySQL。

解决方案:使用--skip-grant-tables模式启动MySQL,然后修改密码。

# 1. 停止MySQL服务 sudo systemctl stop mysqld # 2. 以跳过权限表的方式启动MySQL(安全模式) sudo mysqld_safe --skip-grant-tables --skip-networking & # 3. 无密码登录MySQL mysql -u root # 4. 在MySQL命令行中刷新权限并修改密码(MySQL 9.7+) mysql> FLUSH PRIVILEGES; mysql> ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘YourNewStrongPassword!’; mysql> EXIT; # 5. 关闭安全模式的MySQL进程,然后正常启动服务 # 首先找到mysqld_safe进程ID并kill掉,或者重启服务器。 # 更简单的方法是直接重启服务器,或者: sudo pkill mysqld_safe sudo pkill mysqld sudo systemctl start mysqld

7. 生产环境最佳实践与进阶建议

将MySQL用于生产环境时,除了基本安装,还需要考虑高可用、备份、监控和安全。

7.1 安全加固

  • 定期更换密码:为所有数据库用户设置强密码策略并定期更换。
  • 最小权限原则:为每个应用程序创建独立的数据库用户,并只授予其操作特定数据库所需的最小权限(SELECT, INSERT, UPDATE, DELETE),避免使用ALL PRIVILEGES
  • 禁用LOCAL INFILE:在/etc/my.cnf[mysqld]部分添加local-infile=0,防止通过LOAD DATA LOCAL INFILE读取客户端文件。
  • 启用SSL连接:如果客户端与服务器不在同一可信网络,应配置SSL加密数据传输。
  • 审计日志:考虑启用MySQL企业版审计插件或使用第三方审计工具,记录所有数据库活动。

7.2 备份与恢复策略

  • 物理备份:使用mysqlbackup(企业版)或Percona XtraBackup(开源)进行在线热备份,对大型数据库效率高。
  • 逻辑备份:使用mysqldump进行逻辑备份,适合中小型数据库和数据迁移。
    # 全库备份 mysqldump -u root -p --all-databases --single-transaction --routines --events > full_backup_$(date +%Y%m%d).sql # 单库备份 mysqldump -u root -p mydatabase > mydatabase_backup.sql
  • 定时任务:使用crontab设置定时备份任务,并将备份文件传输到远程存储或对象存储。
  • 定期恢复测试:定期从备份文件中执行恢复测试,确保备份有效。

7.3 性能监控与优化

  • 监控工具:部署如Prometheus+Grafana+mysqld_exporter监控栈,可视化监控MySQL的QPS、连接数、慢查询、缓冲池命中率等关键指标。
  • 慢查询分析:定期分析/var/log/mysql-slow.log,使用mysqldumpslowpt-query-digest工具找出性能瓶颈SQL并进行优化(如添加索引、重写查询)。
  • 配置调优:根据服务器硬件(CPU、内存、磁盘类型)和工作负载(读多写少、写多读少、OLTP、OLAP)持续调整my.cnf中的参数,特别是innodb_buffer_pool_sizeinnodb_log_file_sizeinnodb_flush_method等。

7.4 高可用考虑

对于关键业务,单点MySQL实例存在风险。可以考虑以下架构:

  • 主从复制:搭建一个或多个只读从库,分担读负载,并作为主库的备份。
  • 组复制:使用MySQL Group Replication提供内置的高可用和自动故障转移。
  • 中间件分片:对于超大规模数据,考虑使用MyCatProxySQLVitess等进行分库分表。

至此,你已经成功在Rocky Linux 10上完成了MySQL 9.7的安装、基础配置、安全加固和远程访问设置。这套流程涵盖了从零搭建一个可用数据库服务的主要环节。数据库管理是一个持续的过程,建议你结合具体的应用场景,深入学习和实践备份恢复、性能优化和高可用架构,以构建更健壮的数据服务。如果在实践中遇到其他问题,多查看/var/log/mysqld.log官方文档和社区讨论,大部分问题都能找到解决方案。

← 返回列表