1. 离线部署MySQL的核心挑战与解决方案
在无法连接互联网的生产环境中部署MySQL数据库,是许多运维工程师和DBA都会遇到的典型场景。我曾在一家金融机构的数据中心亲历过这样的需求:由于安全合规要求,核心业务区的服务器完全隔离外网,但需要部署MySQL 5.7集群支撑新上线的交易系统。经过多次实践,我总结出一套可靠的离线部署方法。
离线部署的核心难点在于:
- 依赖包的手动收集与版本匹配
- 系统库缺失导致的安装失败
- 配置文件参数需要预先优化
- 权限设置与安全加固需离线完成
关键提示:建议准备一台同版本的可联网临时服务器用于下载依赖包,避免直接在网上搜索rpm包可能带来的版本冲突风险。
2. 准备工作与依赖收集
2.1 环境检查清单
在开始前需要确认以下信息:
- 目标服务器操作系统版本(通过
cat /etc/redhat-release确认) - 系统架构(
uname -m查看是x86_64还是ARM) - 可用存储空间(
df -h查看至少保证/usr/local有5GB空间) - 现有依赖库版本(
rpm -qa | grep -E 'openssl|libaio')
2.2 离线包完整下载
通过联网机器下载完整依赖包(以CentOS 7 + MySQL 5.7为例):
bash复制# 创建下载目录
mkdir -p /opt/mysql-offline/{rpms,scripts,config}
# 使用yum-downloader获取所有依赖
yum install yum-utils -y
repotrack --download_path=/opt/mysql-offline/rpms \
mysql-community-server-5.7.38 \
mysql-community-client-5.7.38 \
mysql-community-libs-5.7.38 \
mysql-community-common-5.7.38 \
libaio \
numactl-libs
2.3 传输包到目标服务器
将打包好的依赖文件传输到目标服务器:
bash复制# 在联网机器打包
tar -czvf mysql-offline.tar.gz /opt/mysql-offline
# 通过物理介质或内部网络传输到目标机
scp mysql-offline.tar.gz root@target-server:/tmp/
3. 分步安装过程详解
3.1 基础环境配置
在目标服务器执行:
bash复制# 解压安装包
mkdir -p /opt/mysql-offline
tar -xzvf /tmp/mysql-offline.tar.gz -C /opt/
# 安装基础依赖
cd /opt/mysql-offline/rpms
rpm -ivh *.rpm --nodeps --force
# 创建mysql用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
3.2 数据库初始化
关键初始化步骤:
bash复制# 创建数据目录
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql
# 初始化数据库(重要!)
mysqld --initialize --user=mysql \
--basedir=/usr \
--datadir=/var/lib/mysql
# 记录临时密码
grep 'temporary password' /var/log/mysqld.log
3.3 配置文件优化
建议的my.cnf基础配置:
ini复制[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
# 内存配置(按实际调整)
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
key_buffer_size = 256M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
4. 服务启动与安全加固
4.1 启动服务并修改密码
bash复制# 启动MySQL服务
systemctl start mysqld
# 使用临时密码登录
mysql -uroot -p
# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
4.2 基础安全设置
建议执行的加固命令:
sql复制-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 禁止root远程登录
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost');
-- 删除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- 立即生效
FLUSH PRIVILEGES;
5. 常见问题排查指南
5.1 依赖缺失错误处理
若出现类似"libssl.so.10: cannot open shared object file"错误:
bash复制# 查找缺失的库
ldd /usr/sbin/mysqld | grep "not found"
# 解决方案:
# 1. 从联网机器下载对应版本的openssl包
# 2. 使用rpm2cpio提取特定so文件:
rpm2cpio openssl-1.0.2k-19.el7.x86_64.rpm | cpio -idmv
cp usr/lib64/libssl.so.10 /usr/lib64/
5.2 初始化失败分析
常见初始化失败原因:
- /tmp目录权限不足 →
chmod 1777 /tmp - SElinux未关闭 →
setenforce 0 - 内存不足 → 增加swap空间
5.3 连接数优化
对于高并发场景需要调整:
sql复制-- 查看当前连接数设置
SHOW VARIABLES LIKE 'max_connections';
-- 临时修改(重启失效)
SET GLOBAL max_connections = 500;
-- 永久修改需在my.cnf添加:
[mysqld]
max_connections = 500
6. 生产环境建议配置
6.1 关键参数优化
根据服务器配置调整:
ini复制# 8核32G服务器示例配置
innodb_buffer_pool_size = 24G
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2
sync_binlog = 1000
6.2 备份方案配置
基础备份脚本示例:
bash复制#!/bin/bash
BACKUP_DIR=/data/backups
DATE=$(date +%Y%m%d)
mysqldump -uroot -pYourPassword --all-databases \
--single-transaction \
--master-data=2 \
> ${BACKUP_DIR}/full-${DATE}.sql
# 保留7天备份
find ${BACKUP_DIR} -type f -mtime +7 -exec rm {} \;
6.3 监控指标设置
建议监控的关键指标:
- 连接数使用率(Threads_connected/max_connections)
- 查询缓存命中率(Qcache_hits/Qcache_inserts)
- InnoDB缓冲池命中率(1-innodb_buffer_pool_reads/innodb_buffer_pool_read_requests)
7. 高级部署技巧
7.1 多实例部署方法
单机部署多个MySQL实例:
bash复制# 创建第二个实例的数据目录
mkdir -p /var/lib/mysql2
chown mysql:mysql /var/lib/mysql2
# 初始化第二个实例
mysqld --initialize --user=mysql \
--datadir=/var/lib/mysql2 \
--port=3307
7.2 自定义安装路径
如需安装到/opt/mysql:
bash复制cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql \
-DMYSQL_DATADIR=/opt/mysql/data \
-DSYSCONFDIR=/etc
7.3 性能测试建议
使用sysbench进行基准测试:
bash复制# 准备测试数据
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=yourpassword \
prepare