1. 为什么选择MySQL 9.1与RedHat 8的组合
在数据库选型时,MySQL 9.1作为最新稳定版本(截至2023年),相比5.7和8.0系列带来了多项关键改进。最显著的变化包括:
- 查询优化器重构:新的HyperGraph优化器可以处理更复杂的JOIN查询
- 直方图统计信息:大幅提升查询计划准确性
- JSON功能增强:新增JSON_TABLE()等函数
- 安全改进:默认启用caching_sha2_password认证插件
RedHat 8作为企业级Linux发行版,其优势在于:
- 长期支持周期(至2029年)
- 稳定的软件仓库管理
- 完善的SELinux集成
- 对现代硬件的良好支持
这个组合特别适合需要长期稳定运行的企业级应用场景。我在实际部署中发现,相比Ubuntu等发行版,RHEL8的yum/dnf包管理器与MySQL的兼容性更好,依赖冲突更少。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖处理
2.1 系统基础配置
首先确保系统为最新状态:
bash复制sudo dnf update -y
sudo reboot # 如有内核更新需要重启
检查SELinux状态:
bash复制sestatus
提示:生产环境建议保持SELinux enforcing模式,但初次安装可临时设为permissive:
sudo setenforce 0
2.2 添加MySQL官方仓库
RedHat 8默认仓库不包含MySQL 9.1,需要手动添加官方repo:
bash复制sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-6.noarch.rpm
启用MySQL 9.1仓库:
bash复制sudo dnf module disable mysql
sudo dnf config-manager --enable mysql91-community
验证仓库配置:
bash复制dnf repolist enabled | grep mysql
应看到mysql91-community出现在列表中
3. MySQL 9.1安装详解
3.1 核心软件包安装
执行完整安装:
bash复制sudo dnf install mysql-community-server mysql-community-client \
mysql-community-common mysql-community-devel
关键组件说明:
- mysql-community-server:主服务程序
- mysql-community-client:命令行工具
- mysql-community-libs:共享库文件
- mysql-community-devel:开发头文件(如需编译其他软件)
3.2 初始化数据库
首次启动前的安全初始化:
bash复制sudo mysqld --initialize --user=mysql
sudo chown -R mysql:mysql /var/lib/mysql
获取临时root密码:
bash复制sudo grep 'temporary password' /var/log/mysqld.log
输出类似:[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: JqUkfE3m!3Xi
3.3 服务启动与自启配置
启动MySQL服务:
bash复制sudo systemctl start mysqld
sudo systemctl enable mysqld
验证运行状态:
bash复制sudo systemctl status mysqld
正常应显示"active (running)"
4. 安全加固与基础配置
4.1 运行安全脚本
执行安全向导:
bash复制sudo mysql_secure_installation
按提示完成以下操作:
- 输入之前获取的临时密码
- 设置新root密码(需满足复杂度要求)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 立即重载权限表
4.2 防火墙配置
开放3306端口:
bash复制sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
注意:生产环境建议结合--source-ip限制访问源
4.3 关键参数调优
编辑配置文件:
bash复制sudo vi /etc/my.cnf
基础优化建议:
ini复制[mysqld]
default_authentication_plugin=mysql_native_password # 兼容旧客户端
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=200
innodb_buffer_pool_size=1G # 建议为物理内存的50-70%
重启生效:
bash复制sudo systemctl restart mysqld
5. 验证与问题排查
5.1 基础连接测试
使用新密码登录:
bash复制mysql -u root -p
执行基本SQL验证:
sql复制SHOW VARIABLES LIKE 'version%';
SELECT @@hostname, @@port;
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table(id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
INSERT INTO test_table(data) VALUES('安装验证');
SELECT * FROM test_table;
5.2 常见问题解决
问题1:无法连接到MySQL服务
- 检查服务状态:
systemctl status mysqld - 查看错误日志:
sudo tail -50 /var/log/mysqld.log - 确认端口监听:
ss -tulnp | grep 3306
问题2:密码复杂度报错
临时降低要求:
sql复制SET GLOBAL validate_password.policy=LOW;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
问题3:SELinux阻止操作
查看审计日志:
bash复制sudo ausearch -m avc -ts recent
添加SELinux策略:
bash复制sudo semanage port -a -t mysqld_port_t -p tcp 3306
6. 进阶配置建议
6.1 性能监控设置
安装MySQL工具集:
bash复制sudo dnf install mysql-community-utilities
配置性能监控:
sql复制-- 创建监控用户
CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'ComplexP@ss123';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
-- 启用性能schema
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES';
6.2 备份策略配置
设置定时备份(crontab示例):
bash复制0 2 * * * /usr/bin/mysqldump -u backup_user -p'password' --all-databases | gzip > /backups/mysql_$(date +\%Y\%m\%d).sql.gz
建议安装Percona XtraBackup进行热备份:
bash复制sudo dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo dnf install percona-xtrabackup-80
6.3 高可用方案选型
对于生产环境,建议考虑:
- MySQL InnoDB Cluster(Group Replication + MySQL Router)
- 主从复制(Master-Slave)
- Galera Cluster(Percona XtraDB Cluster)
配置主从复制示例:
sql复制-- 主库
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplP@ss123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 从库
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplP@ss123',
MASTER_AUTO_POSITION=1;
START SLAVE;
7. 日常维护技巧
7.1 日志管理
关键日志文件位置:
- 错误日志:/var/log/mysqld.log
- 慢查询日志:需在my.cnf中启用
- 二进制日志:/var/lib/mysql/mysql-bin.*
配置日志轮转:
bash复制sudo vi /etc/logrotate.d/mysql
添加内容:
code复制/var/log/mysqld.log {
daily
rotate 30
missingok
compress
delaycompress
notifempty
create 640 mysql mysql
postrotate
/usr/bin/mysqladmin flush-logs
endscript
}
7.2 用户权限管理
创建应用用户最佳实践:
sql复制CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppP@ss123';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
定期权限审计:
sql复制SELECT * FROM mysql.user WHERE User NOT IN ('root','mysql.sys');
7.3 版本升级路径
从MySQL 8.0升级到9.1的步骤:
- 完整备份所有数据库
- 停止MySQL服务
- 安装新版本RPM包
- 运行mysql_upgrade
- 重启服务并验证
具体命令:
bash复制sudo systemctl stop mysqld
sudo dnf upgrade mysql-community-server
sudo mysql_upgrade -u root -p
sudo systemctl start mysqld
8. 性能优化实战
8.1 索引优化案例
识别缺失索引:
sql复制SELECT * FROM sys.schema_unused_indexes;
分析慢查询:
sql复制-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 使用mysqldumpslow分析
mysqldumpslow -s t /var/lib/mysql/mysql-slow.log
8.2 内存配置调优
关键参数计算公式:
code复制innodb_buffer_pool_size = 总内存 × 0.7
innodb_log_file_size = buffer_pool_size × 0.25
监控内存使用:
sql复制SHOW ENGINE INNODB STATUS\G
8.3 连接池配置
建议使用ProxySQL管理连接:
bash复制sudo dnf install proxysql
配置示例:
sql复制INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES(10,'127.0.0.1',3306);
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES('app_user','AppP@ss123',10);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
