1. 项目概述
在RedHat Enterprise Linux 8(RHEL8)上安装MySQL 9.1数据库系统是一个典型的服务器环境配置任务。作为目前最流行的开源关系型数据库之一,MySQL 9.1版本带来了诸多性能优化和新特性,包括增强的JSON支持、改进的查询优化器以及更好的GIS功能等。选择在RHEL8这样的企业级Linux发行版上部署,能够充分发挥其稳定性和安全性的优势。
对于系统管理员和开发人员来说,掌握在不同Linux发行版上正确安装和配置MySQL的技能至关重要。这不仅关系到数据库系统的初始性能表现,更影响着后续的运维效率和系统稳定性。本文将详细介绍从官方源安装MySQL 9.1的完整过程,包括前期准备、安装步骤、初始配置以及常见问题的解决方法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备
2.1 系统要求检查
在开始安装前,首先需要确认你的RHEL8系统满足MySQL 9.1的基本要求:
- 操作系统:Red Hat Enterprise Linux 8.x(64位)
- 内存:建议至少2GB RAM(生产环境建议8GB以上)
- 磁盘空间:至少5GB可用空间(实际需求取决于数据量)
- 处理器:x86_64架构,建议2核以上
可以通过以下命令检查系统基本信息:
bash复制# 检查系统版本
cat /etc/redhat-release
# 检查内存和交换空间
free -h
# 检查磁盘空间
df -h
# 检查CPU信息
lscpu
2.2 关闭SELinux和防火墙
MySQL的正常运行可能需要特定的网络端口和文件系统访问权限。在安装前,建议临时调整SELinux和防火墙设置:
bash复制# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(需要重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
注意:生产环境中不建议完全关闭防火墙,而应该只开放必要的MySQL端口(默认3306)。可以使用以下命令替代完全关闭:
bash复制firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload
2.3 卸载旧版MySQL
如果你的系统上已经安装了旧版本的MySQL或MariaDB,建议先进行卸载以避免冲突:
bash复制# 检查已安装的MySQL相关包
rpm -qa | grep -i mysql
# 卸载现有MySQL/MariaDB
sudo yum remove -y mysql mysql-server mariadb-server mariadb
# 清理残留文件和目录
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
rm -rf /etc/my.cnf.d
3. 安装MySQL 9.1
3.1 添加MySQL官方Yum仓库
RedHat 8默认的软件仓库中不包含MySQL 9.1,需要手动添加MySQL官方Yum仓库:
bash复制# 下载MySQL Yum仓库安装包
wget https://dev.mysql.com/get/mysql80-community-release-el8-6.noarch.rpm
# 安装仓库包
sudo yum localinstall -y mysql80-community-release-el8-6.noarch.rpm
# 启用MySQL 9.1仓库(默认可能禁用)
sudo dnf config-manager --enable mysql91-community
3.2 安装MySQL服务器
添加仓库后,可以直接使用yum命令安装MySQL服务器:
bash复制# 安装MySQL服务器
sudo yum install -y mysql-community-server
# 验证安装
rpm -qi mysql-community-server
安装过程会自动处理所有依赖关系,包括客户端工具和共享库等。安装完成后,系统会创建mysql用户和组,用于运行MySQL服务。
3.3 启动MySQL服务
安装完成后,需要启动MySQL服务并设置为开机自启:
bash复制# 启动MySQL服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
# 检查服务状态
systemctl status mysqld
4. 初始配置
4.1 获取临时密码
MySQL 9.1在首次安装后会生成一个临时root密码,保存在日志文件中:
bash复制# 查看临时密码
grep 'temporary password' /var/log/mysqld.log
输出类似于:
code复制2023-07-15T03:12:34.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Abc123!@#
4.2 运行安全安装脚本
使用临时密码登录后,应立即运行mysql_secure_installation脚本进行基本安全配置:
bash复制mysql_secure_installation
脚本会引导你完成以下配置:
- 更改root密码(必须包含大小写字母、数字和特殊字符)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
4.3 创建配置文件
MySQL的主要配置文件位于/etc/my.cnf。对于生产环境,建议根据服务器配置进行优化:
bash复制# 备份原始配置文件
cp /etc/my.cnf /etc/my.cnf.bak
# 编辑配置文件
vi /etc/my.cnf
以下是基本的配置建议,可根据实际硬件调整:
ini复制[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
wait_timeout=300
interactive_timeout=300
# 缓冲池大小(建议为系统内存的50-70%)
innodb_buffer_pool_size=2G
# 日志设置
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2
log_queries_not_using_indexes=1
[client]
default-character-set=utf8mb4
修改配置后需要重启MySQL服务:
bash复制systemctl restart mysqld
5. 创建管理用户
5.1 创建专用管理员账户
不建议直接使用root账户进行日常管理,应该创建一个具有适当权限的专用管理员账户:
sql复制-- 登录MySQL
mysql -u root -p
-- 创建管理用户
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'StrongPassword123!';
-- 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
5.2 允许远程连接(可选)
如果需要从其他主机访问MySQL服务器,需要创建远程用户并开放防火墙端口:
sql复制-- 创建远程用户
CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'RemotePass123!';
-- 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'remoteuser'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
然后在防火墙中开放3306端口:
bash复制firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
注意:允许远程连接会增加安全风险,建议仅限特定IP访问或使用SSH隧道。
6. 常见问题解决
6.1 安装失败:依赖问题
如果在安装过程中遇到依赖问题,可以尝试以下解决方案:
bash复制# 清理yum缓存
yum clean all
rm -rf /var/cache/yum
# 安装EPEL仓库(提供额外依赖)
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 再次尝试安装MySQL
yum install -y mysql-community-server
6.2 服务启动失败
MySQL服务启动失败可能有多种原因,可以通过以下步骤排查:
- 检查错误日志:
bash复制tail -n 50 /var/log/mysqld.log
- 常见问题及解决方案:
- 端口冲突:确保3306端口未被占用
- 权限问题:确保/var/lib/mysql目录属于mysql用户
- 磁盘空间不足:检查df -h输出
- 内存不足:检查free -h输出
6.3 忘记root密码
如果忘记了MySQL root密码,可以按照以下步骤重置:
- 停止MySQL服务:
bash复制systemctl stop mysqld
- 以安全模式启动MySQL:
bash复制mysqld_safe --skip-grant-tables &
- 无密码登录并重置密码:
sql复制mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('NewPassword123!') WHERE User='root';
FLUSH PRIVILEGES;
exit;
- 重启MySQL服务:
bash复制systemctl restart mysqld
7. 性能优化建议
7.1 内存配置
根据服务器内存大小调整以下参数(在my.cnf中):
ini复制# 缓冲池大小(总内存的50-70%)
innodb_buffer_pool_size=4G
# 每个连接的缓冲大小
sort_buffer_size=2M
read_buffer_size=2M
read_rnd_buffer_size=2M
join_buffer_size=2M
7.2 存储引擎配置
对于InnoDB引擎的优化:
ini复制# InnoDB日志文件大小(建议256M-2G)
innodb_log_file_size=512M
# InnoDB缓冲池实例数(建议每个实例1G左右)
innodb_buffer_pool_instances=4
# IO设置(SSD建议使用O_DIRECT)
innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
innodb_io_capacity_max=4000
7.3 查询缓存
MySQL 8.0+已移除查询缓存,建议使用其他缓存方案:
ini复制# 禁用查询缓存(MySQL 8.0+默认)
query_cache_type=0
query_cache_size=0
8. 备份与恢复
8.1 使用mysqldump备份
定期备份是数据库管理的重要部分:
bash复制# 完整备份所有数据库
mysqldump -u admin -p --all-databases --single-transaction --master-data=2 > full_backup.sql
# 备份单个数据库
mysqldump -u admin -p --databases mydatabase --single-transaction --routines --triggers > mydatabase_backup.sql
# 压缩备份
mysqldump -u admin -p --all-databases | gzip > full_backup.sql.gz
8.2 恢复数据库
从备份文件恢复数据库:
bash复制# 恢复完整备份
mysql -u admin -p < full_backup.sql
# 恢复压缩备份
gunzip < full_backup.sql.gz | mysql -u admin -p
8.3 设置自动备份
可以创建cron任务实现自动备份:
bash复制# 编辑crontab
crontab -e
# 添加以下行(每天凌晨2点备份)
0 2 * * * /usr/bin/mysqldump -u admin -p'password' --all-databases --single-transaction | gzip > /backup/mysql_$(date +\%Y\%m\%d).sql.gz
# 保留最近7天备份
0 3 * * * find /backup/ -name "mysql_*.sql.gz" -mtime +7 -delete
