1. 为什么需要离线部署MySQL?
在企业级生产环境中,我们经常会遇到无法直接连接互联网的服务器。这些服务器可能位于内网隔离区、金融专网或军工保密网络中。我曾在某银行数据中心项目中,遇到过核心业务系统必须完全离线的严苛要求。
离线部署的本质是解决依赖项完整性问题。与在线安装不同,离线部署需要预先下载所有相关软件包及其依赖项。根据我的经验,一个完整的MySQL离线部署包通常包含以下组件:
- MySQL Server核心安装包(如mysql-community-server)
- 客户端工具包(mysql-community-client)
- 共享库文件(mysql-community-libs)
- 开发用头文件(mysql-community-devel)
- 字符集支持包(mysql-community-common)
提示:建议下载对应Linux发行版的RPM包或DEB包时,同时下载所有依赖项的离线包。Red Hat系使用
yumdownloader工具,Debian系使用apt-offline工具可以方便地收集依赖。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作:构建完整的离线资源库
2.1 确定系统环境
首先通过以下命令确认系统架构和版本:
bash复制cat /etc/os-release # 查看发行版信息
uname -m # 查看CPU架构
常见的兼容性问题包括:
- glibc版本不匹配(特别是从新系统向旧系统部署时)
- libssl等基础库版本冲突
- 系统服务管理器差异(systemd vs sysvinit)
2.2 下载MySQL官方离线包
访问MySQL官方仓库(https://dev.mysql.com/downloads/repo/)选择对应版本。以MySQL 8.0为例:
bash复制wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
对于无法直接下载的情况,可在联网机器上使用以下命令下载完整依赖树:
bash复制mkdir mysql-offline
cd mysql-offline
yum install --downloadonly --downloaddir=. mysql-community-server
2.3 处理依赖关系
创建一个本地YUM仓库:
bash复制createrepo .
然后在目标机器上配置本地源:
bash复制cat > /etc/yum.repos.d/mysql-local.repo <<EOF
[mysql-local]
name=MySQL Local Repository
baseurl=file:///path/to/mysql-offline
enabled=1
gpgcheck=0
EOF
3. 详细安装步骤
3.1 安装前环境检查
检查系统是否已有MySQL:
bash复制rpm -qa | grep mysql
systemctl list-unit-files | grep mysql
清理旧版本(如有):
bash复制yum remove mysql*
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
3.2 正式安装过程
安装核心组件:
bash复制yum --disablerepo=\* --enablerepo=mysql-local install mysql-community-server
关键目录说明:
/var/lib/mysql:数据文件默认位置/etc/my.cnf:主配置文件/usr/bin/mysql:客户端程序/usr/sbin/mysqld:服务端程序
3.3 初始化数据库
安全初始化(MySQL 5.7+版本):
bash复制mysqld --initialize --user=mysql
获取临时密码:
bash复制grep 'temporary password' /var/log/mysqld.log
4. 配置与优化
4.1 基础安全设置
启动服务后立即修改root密码:
bash复制ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
运行安全脚本:
bash复制mysql_secure_installation
4.2 关键配置调整
编辑/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
# 性能优化
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
max_connections=200
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
4.3 服务管理
设置开机自启:
bash复制systemctl enable mysqld
systemctl start mysqld
检查运行状态:
bash复制systemctl status mysqld
mysqladmin -u root -p version
5. 常见问题排查
5.1 依赖缺失问题
典型报错:
code复制libssl.so.10: cannot open shared object file
解决方案:
bash复制# 查找缺失的库
ldd /usr/sbin/mysqld | grep "not found"
# 从其他机器复制对应的库文件到/lib64或/usr/lib64
5.2 初始化失败
查看详细日志:
bash复制journalctl -xe
tail -n 100 /var/log/mysqld.log
常见原因:
- SElinux未关闭
- 磁盘空间不足
- 目录权限不正确
5.3 连接问题
防火墙设置:
bash复制firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
6. 高级部署技巧
6.1 制作可移植安装包
将整个安装环境打包:
bash复制tar czvf mysql-offline-bundle.tar.gz \
/etc/yum.repos.d/mysql-local.repo \
/path/to/mysql-offline \
/var/lib/mysql \
/etc/my.cnf
6.2 自动化部署脚本
创建安装脚本install_mysql.sh:
bash复制#!/bin/bash
# 解压安装包
tar xzvf mysql-offline-bundle.tar.gz -C /
# 安装服务
yum --disablerepo=\* --enablerepo=mysql-local -y install mysql-community-server
# 初始化数据库
mysqld --initialize --user=mysql
temp_pw=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
# 自动修改密码
mysql --connect-expired-password -uroot -p"$temp_pw" <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${NEW_PASSWORD}';
FLUSH PRIVILEGES;
EOF
# 启动服务
systemctl enable --now mysqld
6.3 版本升级方案
离线升级步骤:
- 下载新版本RPM包
- 停止现有服务
- 备份数据目录
- 安装新版本
- 运行
mysql_upgrade
7. 生产环境建议
7.1 数据目录规划
最佳实践:
- 单独挂载
/var/lib/mysql到高性能磁盘 - 使用LVM实现快照备份
- 设置正确的目录权限:
bash复制chown -R mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql
7.2 监控配置
基础监控项:
- 连接数监控
- 查询缓存命中率
- InnoDB缓冲池使用率
- 复制延迟(如果部署主从)
7.3 备份策略
推荐方案:
bash复制# 每日全量备份
mysqldump -uroot -p --all-databases --single-transaction > /backup/full-$(date +%F).sql
# 二进制日志备份
mysql -uroot -p -e "FLUSH BINARY LOGS;"
cp /var/lib/mysql/mysql-bin.* /backup/
我在某次数据中心迁移项目中,就因为忽略了二进制日志备份,导致数据无法完整恢复。这个教训让我深刻认识到离线环境中备份完整性的重要性。
