无网络环境下 MySQL 5.7 完整离线部署指南
1. 为什么需要离线安装MySQL在企业级应用场景中经常会遇到服务器处于严格的内网隔离环境无法直接连接互联网下载软件包的情况。我曾在某金融机构的数据中心项目中遇到过核心数据库服务器完全物理隔离的环境当时就是通过离线方式部署的MySQL 5.7。这种场景下传统的在线安装方式完全行不通必须提前准备好所有依赖组件。MySQL 5.7作为长期支持版本(LTS)在企业环境中应用广泛。它的离线安装包实际上是由多个相互依赖的RPM组件构成的完整生态。就像搭积木一样必须按照特定顺序组装否则就会出现各种依赖报错。我曾经因为安装顺序错误导致花了整整一天时间排查各种奇怪的错误提示。2. 准备工作获取正确的安装包2.1 官方资源获取指南首先需要从MySQL官方归档站点获取完整的安装包套件。这里有个小技巧建议使用带图形界面的联网机器访问https://downloads.mysql.com/archives/community/因为页面上的筛选器能帮你快速找到匹配的版本。对于CentOS 7系统通常需要下载以下核心组件mysql-community-common-5.7.xx-1.el7.x86_64.rpmmysql-community-libs-5.7.xx-1.el7.x86_64.rpmmysql-community-client-5.7.xx-1.el7.x86_64.rpmmysql-community-server-5.7.xx-1.el7.x86_64.rpm注意版本号中的el7表示适用于RHEL/CentOS 7系列。我曾经犯过下载el6包的错误结果安装时出现大量兼容性问题。2.2 依赖包收集清单除了MySQL主包外还需要准备这些系统依赖libaio异步I/O支持库numactlNUMA架构支持工具net-tools基础网络工具集可以使用这个命令在有网络的机器上下载yumdownloader libaio numactl net-tools建议把这些rpm包和MySQL安装包放在同一个目录方便后续传输。我习惯用这样的目录结构/mysql_offline/ ├── mysql_pkgs/ │ ├── mysql-community-*.rpm └── deps/ ├── libaio-*.rpm └── numactl-*.rpm3. 离线环境部署实战3.1 安全传输文件到目标服务器在严格的内网环境中通常需要通过审批流程使用安全U盘传输文件。这里有个重要提示传输前务必校验文件完整性。我常用的方法是md5sum *.rpm checksum.md5到目标服务器后再次校验md5sum -c checksum.md53.2 系统依赖安装进入存放rpm包的目录先安装系统依赖rpm -ivh libaio-*.rpm rpm -ivh numactl-*.rpm如果遇到依赖错误可能需要额外安装其他基础包。曾经有个项目因为缺少openssl-libs导致安装失败后来我们建立了完整的依赖清单。3.3 MySQL组件安装顺序详解严格按照以下顺序安装MySQL组件common包提供基础配置文件rpm -ivh mysql-community-common-5.7.*.rpmlibs包安装共享库rpm -ivh mysql-community-libs-5.7.*.rpmclient包安装客户端工具rpm -ivh mysql-community-client-5.7.*.rpmserver包最后安装服务端rpm -ivh mysql-community-server-5.7.*.rpm这个顺序绝对不能错我有次先装了server包结果遇到了一堆依赖错误不得不全部卸载重来。4. 初始化与配置4.1 数据库初始化执行初始化命令mysqld --initialize --usermysql这里有个关键点初始化过程会生成临时root密码必须立即记录grep temporary password /var/log/mysqld.log建议同时备份整个日志文件cp /var/log/mysqld.log /root/mysql_init.log4.2 服务管理配置启动MySQL服务并设置开机自启systemctl start mysqld systemctl enable mysqld检查服务状态systemctl status mysqld如果启动失败可以查看详细日志journalctl -xe5. 安全加固与基础配置5.1 修改root密码使用临时密码登录mysql -u root -p立即修改密码ALTER USER rootlocalhost IDENTIFIED BY ComplexPassword123!;建议密码包含大小写字母、数字和特殊字符长度至少12位。5.2 创建管理用户建议不要直接使用root账户而是创建专用管理账号CREATE USER adminlocalhost IDENTIFIED BY AdminPass456; GRANT ALL PRIVILEGES ON *.* TO adminlocalhost WITH GRANT OPTION; FLUSH PRIVILEGES;5.3 基础参数调优编辑MySQL配置文件vi /etc/my.cnf添加这些基础优化参数[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineINNODB max_connections200 innodb_buffer_pool_size1G重启服务使配置生效systemctl restart mysqld6. 数据库创建与管理6.1 创建业务数据库使用UTF8MB4字符集创建数据库支持完整emoji字符CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;6.2 基础表结构示例创建用户表USE app_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash CHAR(60) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;6.3 备份策略配置即使在内网环境也要建立备份机制。最简单的定时备份mkdir /backups mysqldump -u admin -p app_db /backups/app_db_$(date %Y%m%d).sql可以添加到crontab实现每日自动备份0 2 * * * /usr/bin/mysqldump -u admin -p密码 app_db /backups/app_db_$(date \%Y\%m\%d).sql7. 故障排查指南7.1 常见安装错误依赖问题如果出现requires libssl.so.10等错误可能是系统openssl版本不匹配。解决方案是下载兼容版本的openssl-libs包。服务启动失败检查/var/log/mysqld.log中的详细错误信息。常见原因是SElinux限制或磁盘空间不足。7.2 连接问题排查如果本地无法连接netstat -tulnp | grep mysql应该看到类似输出tcp6 0 0 :::3306 :::* LISTEN 12345/mysqld如果没有检查防火墙设置firewall-cmd --add-servicemysql --permanent firewall-cmd --reload7.3 密码重置方法如果忘记root密码可以这样重置停止MySQL服务在my.cnf的[mysqld]段添加skip-grant-tables重启服务后无需密码登录执行密码更新UPDATE mysql.user SET authentication_stringPASSWORD(新密码) WHERE Userroot;移除skip-grant-tables选项并重启服务8. 高级配置建议8.1 性能优化参数对于8G内存的数据库服务器建议添加这些参数innodb_buffer_pool_size4G innodb_log_file_size512M innodb_flush_methodO_DIRECT innodb_flush_log_at_trx_commit1 sync_binlog18.2 监控设置即使在内网也应该配置基础监控# 创建监控用户 mysql -u root -p -e CREATE USER monitorlocalhost IDENTIFIED BY Monitor123; mysql -u root -p -e GRANT PROCESS, REPLICATION CLIENT ON *.* TO monitorlocalhost; # 安装简单监控脚本 cat EOF /usr/local/bin/mysql_monitor.sh #!/bin/bash mysqladmin -u monitor -pMonitor123 processlist mysqladmin -u monitor -pMonitor123 status EOF chmod x /usr/local/bin/mysql_monitor.sh8.3 审计日志配置在my.cnf中添加审计配置[mysqld] plugin-loadaudit_log.so audit_log_formatJSON audit_log_file/var/log/mysql_audit.log然后创建日志文件并设置权限touch /var/log/mysql_audit.log chown mysql:mysql /var/log/mysql_audit.log9. 实际项目经验分享在某次银行系统迁移项目中我们必须在完全隔离的网络环境中部署MySQL集群。当时最大的挑战是处理隐式依赖关系 - 有些依赖包在在线安装时会自动解决但离线环境必须手动准备。我们最终整理出了完整的依赖树包括直接依赖libaio、numactl等间接依赖openssl、libstdc等系统工具perl、net-tools等建议在测试环境先完整演练整个安装过程记录所有需要的包。我现在的标准做法是准备一个包含所有依赖的离线仓库使用createrepo工具创建本地yum源这样后续安装其他软件也会方便很多。另一个经验是版本一致性非常重要。曾经因为测试环境用5.7.28而生产环境用5.7.32导致某些SQL语句行为不一致。现在我们的标准是从开发到生产所有环境必须使用完全相同的MySQL版本和补丁级别。