1. 项目概述
在RedHat 8系统上安装MySQL 9.1数据库服务是一个典型的企业级数据库部署场景。作为目前最流行的开源关系型数据库之一,MySQL 9.1版本带来了诸多性能优化和新特性,包括增强的JSON支持、改进的窗口函数、更好的GIS功能等。而RedHat 8作为企业级Linux发行版,其稳定性和安全性使其成为数据库服务器的理想选择。
这个安装过程看似简单,但实际操作中会遇到不少坑点。比如RedHat 8默认使用dnf包管理器而非yum,系统自带的MariaDB可能与MySQL产生冲突,SELinux安全策略可能导致服务启动失败等。本文将基于我多年在Linux环境下部署MySQL的经验,带你一步步避开这些陷阱。
2. 环境准备
2.1 系统要求检查
在开始安装前,我们需要确认系统满足MySQL 9.1的基本要求:
# 查看系统版本 cat /etc/redhat-release # 检查内存和存储空间 free -h df -h # 检查CPU架构 uname -mMySQL 9.1对系统的最低要求是:
- 内存:至少2GB(生产环境建议8GB以上)
- 磁盘空间:至少5GB可用空间
- 操作系统:RedHat 8或兼容系统(x86_64架构)
提示:如果是在虚拟机环境测试,建议分配至少4GB内存和20GB磁盘空间,否则性能测试时可能会遇到瓶颈。
2.2 卸载冲突软件包
RedHat 8默认安装了MariaDB,这是MySQL的一个分支,可能会与MySQL产生冲突。我们需要先移除这些包:
# 检查已安装的MariaDB相关包 rpm -qa | grep mariadb # 卸载MariaDB sudo dnf remove mariadb-server mariadb-client mariadb-common -y # 清理残留文件和目录 sudo rm -rf /var/lib/mysql/ sudo rm -rf /etc/my.cnf*3. 安装MySQL 9.1
3.1 添加MySQL官方仓库
MySQL官方提供了针对RedHat系列的YUM仓库,我们需要先配置这个仓库:
# 下载MySQL YUM仓库安装包 sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm -y # 启用MySQL 9.1仓库 sudo dnf module disable mysql -y sudo dnf config-manager --enable mysql91-community3.2 安装MySQL服务器
现在可以正式安装MySQL 9.1服务器了:
# 安装MySQL服务器和客户端 sudo dnf install mysql-community-server mysql-community-client -y # 验证安装 rpm -qi mysql-community-server安装完成后,MySQL服务会自动创建mysql用户和组,并设置好必要的目录结构:
- 配置文件:/etc/my.cnf
- 数据目录:/var/lib/mysql
- 日志文件:/var/log/mysqld.log
- 套接字文件:/var/lib/mysql/mysql.sock
3.3 启动MySQL服务
使用systemctl管理MySQL服务:
# 启动MySQL服务 sudo systemctl start mysqld # 设置开机自启 sudo systemctl enable mysqld # 检查服务状态 sudo systemctl status mysqld4. 初始配置
4.1 获取临时密码
MySQL 9.1在首次安装后会生成一个临时root密码:
# 查看临时密码 sudo grep 'temporary password' /var/log/mysqld.log输出类似:
2023-07-20T03:12:34.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Abc123!@#4.2 安全配置向导
使用mysql_secure_installation脚本进行基本安全配置:
sudo mysql_secure_installation按照提示操作:
- 输入临时密码
- 设置新密码(需满足复杂度要求)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
注意:MySQL 9.1默认启用了密码强度验证插件,新密码必须包含大小写字母、数字和特殊字符,长度至少8位。
4.3 防火墙配置
如果系统启用了firewalld,需要开放MySQL默认端口3306:
# 添加防火墙规则 sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --reload # 验证端口开放 sudo firewall-cmd --list-ports5. 高级配置
5.1 调整MySQL配置文件
编辑/etc/my.cnf文件进行性能调优:
[mysqld] # 基础配置 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # 内存配置 innodb_buffer_pool_size = 1G # 建议为系统内存的50-70% key_buffer_size = 256M query_cache_size = 0 # MySQL 8.0+已弃用查询缓存 # 日志配置 log_error=/var/log/mysqld.log slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=2 # 连接配置 max_connections=200 wait_timeout=300 interactive_timeout=300 # 其他优化 default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci修改配置后需要重启MySQL服务:
sudo systemctl restart mysqld5.2 创建管理用户
不建议直接使用root账户进行日常操作,应该创建专用管理用户:
-- 登录MySQL mysql -u root -p -- 创建管理员用户 CREATE USER 'admin'@'localhost' IDENTIFIED BY 'Complex@Password123!'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;6. 验证安装
6.1 基本功能测试
-- 创建测试数据库 CREATE DATABASE test_db; USE test_db; -- 创建测试表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入测试数据 INSERT INTO users (username, email) VALUES ('user1', 'user1@example.com'), ('user2', 'user2@example.com'); -- 查询数据 SELECT * FROM users;6.2 性能基准测试
可以使用sysbench进行简单性能测试:
# 安装sysbench sudo dnf install sysbench -y # 准备测试数据 sysbench oltp_read_write --db-driver=mysql --mysql-user=admin --mysql-password='Complex@Password123!' --mysql-db=test_db prepare # 运行测试 sysbench oltp_read_write --db-driver=mysql --mysql-user=admin --mysql-password='Complex@Password123!' --mysql-db=test_db --threads=4 --time=60 run7. 常见问题解决
7.1 安装失败问题排查
问题1:依赖冲突
Error: Package: mysql-community-server-9.1.0-1.el8.x86_64 (mysql91-community) Requires: libssl.so.1.1()(64bit)解决方案:
sudo dnf install openssl1.1 -y问题2:SELinux阻止服务启动
检查SELinux状态:
sudo sestatus临时解决方案(生产环境不推荐):
sudo setenforce 0永久解决方案:
sudo semanage port -a -t mysqld_port_t -p tcp 3306 sudo restorecon -Rv /var/lib/mysql7.2 连接问题
问题:客户端无法连接
检查网络连接和权限:
-- 在MySQL中检查用户权限 SELECT host, user FROM mysql.user; -- 检查绑定地址 SHOW VARIABLES LIKE 'bind_address';如果bind_address是127.0.0.1,需要修改为0.0.0.0(注意安全风险):
[mysqld] bind-address = 0.0.0.07.3 性能问题
问题:查询速度慢
检查慢查询日志:
sudo less /var/log/mysql-slow.log在MySQL中分析查询:
-- 启用查询分析 SET profiling = 1; -- 运行你的查询 SELECT * FROM large_table WHERE condition; -- 查看分析结果 SHOW PROFILE;8. 维护与监控
8.1 日常维护命令
-- 检查运行状态 SHOW STATUS; -- 检查变量设置 SHOW VARIABLES; -- 检查进程列表 SHOW PROCESSLIST; -- 检查表状态 CHECK TABLE table_name; -- 优化表 OPTIMIZE TABLE table_name;8.2 备份与恢复
使用mysqldump进行备份:
# 全库备份 mysqldump -u admin -p --all-databases --single-transaction > full_backup.sql # 单库备份 mysqldump -u admin -p test_db > test_db_backup.sql恢复数据库:
mysql -u admin -p < full_backup.sql8.3 监控设置
安装MySQL企业监控器或使用开源的Prometheus + Grafana方案:
# 安装MySQL exporter用于Prometheus wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz tar xvfz mysqld_exporter-*.tar.gz cd mysqld_exporter-* # 创建监控用户 mysql -u root -p -e "CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'ExporterPassword123!' WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost'; FLUSH PRIVILEGES;" # 启动exporter ./mysqld_exporter --config.my-cnf=.my.cnf9. 升级与卸载
9.1 升级MySQL版本
# 先备份数据 mysqldump -u admin -p --all-databases --single-transaction > upgrade_backup.sql # 停止MySQL服务 sudo systemctl stop mysqld # 安装新版本 sudo dnf upgrade mysql-community-server9.2 完全卸载MySQL
# 停止服务 sudo systemctl stop mysqld # 卸载软件包 sudo dnf remove mysql-community-server mysql-community-client -y # 删除数据文件和配置文件 sudo rm -rf /var/lib/mysql/ sudo rm -rf /etc/my.cnf* sudo rm -rf /var/log/mysqld.log10. 最佳实践与经验分享
在实际生产环境中部署MySQL 9.1时,我总结了以下几点经验:
内存配置:innodb_buffer_pool_size不宜设置过大,否则可能导致系统OOM。建议不超过物理内存的70%,并保留足够内存给操作系统和其他服务。
连接管理:max_connections参数需要根据应用特点调整。过高的值会消耗更多内存,通常200-500对于大多数应用已经足够。
监控指标:必须监控的关键指标包括:
- QPS/TPS
- 连接数
- 慢查询数量
- 缓冲池命中率
- 复制延迟(如果使用主从)
备份策略:除了定期全量备份外,还应该:
- 启用二进制日志(binlog)实现时间点恢复
- 测试备份恢复流程
- 考虑使用Percona XtraBackup进行热备份
安全加固:
- 定期轮换密码
- 限制管理用户的白名单IP
- 启用SSL连接
- 定期审计用户权限
性能调优:
- 使用EXPLAIN分析慢查询
- 合理添加索引(避免过度索引)
- 考虑使用连接池
- 对大表考虑分区策略
高可用方案:
- 对于关键业务,建议部署MySQL组复制(Group Replication)或InnoDB Cluster
- 使用ProxySQL实现读写分离
- 考虑多活架构设计
版本管理:
- 保持小版本更新(如9.1.x)
- 大版本升级前充分测试
- 关注官方发布的安全公告
在实际操作中,我发现很多问题都源于配置不当或对MySQL工作机制理解不深。建议花时间深入学习InnoDB存储引擎的工作原理,这对性能调优和故障排查都有极大帮助。