1. 项目概述
最近在给客户部署一套内部管理系统时遇到了一个棘手问题:目标服务器位于内网环境,无法连接外网下载软件包。经过评估,我们决定在Rocky Linux 8.7系统上离线安装MySQL 8.4数据库。这个方案看似简单,实际操作中却有不少坑需要特别注意。
MySQL作为最流行的开源关系型数据库,8.0版本带来了诸多性能提升和新特性,如窗口函数、CTE(Common Table Expressions)以及更好的JSON支持。而Rocky Linux作为CentOS的替代品,在企业级环境中越来越受欢迎。本文将详细记录整个离线安装过程,包括我在实际操作中踩过的坑和总结的经验技巧。
2. 环境准备与软件包获取
2.1 系统环境确认
首先需要确认基础环境是否符合要求:
bash复制# 查看系统版本
cat /etc/redhat-release
# 查看内核版本
uname -r
# 检查glibc版本
ldd --version
Rocky Linux 8.7默认使用glibc 2.28,这与MySQL 8.4的兼容性要求完全匹配。如果系统版本不一致,建议先升级系统或寻找对应版本的MySQL安装包。
注意:生产环境强烈建议使用相同版本的系统进行测试验证,避免因环境差异导致兼容性问题。
2.2 MySQL软件包下载
在有网络的环境中,从MySQL官网下载对应版本的tar包:
bash复制wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz
下载完成后,建议校验文件完整性:
bash复制md5sum mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz
# 对比官网提供的MD5值
将下载好的软件包通过U盘或内部文件服务器传输到目标机器。我通常会在/opt目录下创建临时目录存放安装文件:
bash复制mkdir -p /opt/install_packages
cp mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz /opt/install_packages/
3. MySQL安装步骤详解
3.1 解压软件包
进入存放安装包的目录执行解压:
bash复制cd /opt/install_packages
tar -xvf mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz
解压后移动目录到/usr/local:
bash复制mv mysql-8.4.5-linux-glibc2.28-x86_64 /usr/local/mysql
经验之谈:/usr/local是Linux系统存放本地安装软件的标准位置,保持这个习惯有利于后续维护。我曾见过有人直接解压到/opt下使用,结果系统升级后出现各种路径问题。
3.2 创建MySQL配置文件
MySQL 8.4不再提供默认的my.cnf文件,需要手动创建:
bash复制vim /etc/my.cnf
以下是一个经过生产环境验证的基础配置:
ini复制[client]
default-character-set=UTF8MB4
port = 3306
socket = /tmp/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
default-storage-engine=INNODB
character-set-server=UTF8MB4
port=3306
socket=/tmp/mysql.sock
skip-external-locking
# 内存配置根据服务器实际情况调整
key_buffer_size=16M
max_allowed_packet=64M
table_open_cache=4000
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=4M
thread_stack=256K
server-id=1
[mysqldump]
quick
max_allowed_packet = 64M
设置正确的文件权限:
bash复制chmod 644 /etc/my.cnf
3.3 创建MySQL用户和用户组
为MySQL创建专用系统账户:
bash复制groupadd mysql
useradd -r -g mysql -s /bin/false mysql
设置目录权限:
bash复制chown -R mysql:mysql /usr/local/mysql
避坑指南:这里使用-r参数创建系统用户,-s /bin/false限制登录权限,这是生产环境的安全最佳实践。我曾遇到过因为使用普通用户安装导致的安全漏洞问题。
4. MySQL初始化与启动
4.1 初始化MySQL数据目录
执行初始化命令:
bash复制cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
初始化完成后会显示临时root密码,务必记录下来:
code复制[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: WVgFh1VpFQ?;
重要提示:MySQL 8.0开始使用caching_sha2_password作为默认认证插件,如果客户端工具版本较旧可能无法连接,可以在初始化时添加--default-authentication-plugin=mysql_native_password参数。
4.2 配置系统服务
将MySQL添加为系统服务:
bash复制cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
使用systemd管理服务:
bash复制cp /usr/local/mysql/support-files/mysql.server /usr/lib/systemd/system/mysql.service
systemctl daemon-reload
systemctl enable mysql
启动MySQL服务:
bash复制systemctl start mysql
检查服务状态:
bash复制systemctl status mysql
5. 安全配置与基础优化
5.1 修改root密码
使用临时密码登录:
bash复制mysql -uroot -p
执行密码修改:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
FLUSH PRIVILEGES;
安全建议:生产环境密码应包含大小写字母、数字和特殊字符,长度至少16位。我曾处理过因简单密码导致的入侵事件,教训深刻。
5.2 基础安全设置
运行安全脚本:
bash复制mysql_secure_installation
根据提示完成以下安全设置:
- 设置root密码强度验证策略
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
5.3 性能基础优化
根据服务器配置调整InnoDB参数:
sql复制-- 查看缓冲池大小建议
SELECT @@innodb_buffer_pool_size/1024/1024 AS 'Current Size (MB)';
-- 设置缓冲池大小(根据服务器内存的70-80%调整)
SET GLOBAL innodb_buffer_pool_size=4*1024*1024*1024; -- 4GB
6. 常见问题与解决方案
6.1 初始化失败问题排查
问题现象:初始化时报错"error while loading shared libraries: libaio.so.1"
解决方案:
bash复制# 离线环境下需要提前下载这些依赖包
rpm -ivh libaio-*.rpm
问题现象:启动时报错"Can't create/write to file '/var/run/mysqld/mysqld.pid'"
解决方案:
bash复制mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
6.2 连接问题排查
问题现象:客户端工具无法连接,报错"caching_sha2_password cannot be loaded"
解决方案:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
6.3 性能问题排查
问题现象:MySQL响应缓慢
排查步骤:
- 检查当前连接数:
sql复制SHOW STATUS LIKE 'Threads_connected';
- 查看慢查询:
sql复制SHOW VARIABLES LIKE 'slow_query_log';
- 检查锁等待:
sql复制SHOW ENGINE INNODB STATUS;
7. 后续维护建议
- 定期备份策略:
bash复制# 使用mysqldump进行逻辑备份
mysqldump -uroot -p --all-databases --single-transaction > full_backup.sql
- 监控设置:
- 配置Prometheus + Grafana监控MySQL关键指标
- 设置告警规则,如连接数、QPS、慢查询等
- 升级计划:
- 定期检查MySQL安全公告
- 测试环境验证后再进行生产环境升级
- 日常维护命令:
sql复制-- 查看版本和运行状态
SELECT VERSION(), @@hostname, NOW();
-- 检查表状态
ANALYZE TABLE important_table;
-- 优化表空间
OPTIMIZE TABLE large_table;
在实际部署过程中,我发现Rocky Linux 8与MySQL 8.4的兼容性非常好,系统资源占用也比之前使用的MySQL 5.7有明显改善。特别是在处理JSON数据类型时,8.4版本的性能提升尤为明显。一个实用的技巧是,在数据目录下创建软链接将错误日志和慢查询日志放到单独的磁盘分区,既方便查看又不会影响系统分区。