1. 项目概述
最近在给某金融机构做系统迁移时遇到一个典型需求:在完全离线的内网环境中部署MySQL数据库。这种场景在政府机关、军工企业、金融机构非常普遍,由于安全合规要求,这些机构的业务系统往往运行在物理隔离的网络环境中。今天我就把这次实战经验整理成保姆级教程,包含每个步骤的详细操作截图和避坑指南。
不同于常规的在线安装,离线部署需要解决三大核心问题:依赖包完整下载、环境变量精确配置、以及服务异常快速排查。本教程将使用MySQL 5.7.36版本(企业级环境最稳定的长期支持版本)在CentOS 7.9系统上演示,所有操作均通过终端完成,适用于任何Linux发行版。
2. 准备工作
2.1 介质准备
首先需要准备两个关键文件:
- MySQL社区版tar包(mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz)
- 依赖库合集包(包含libaio、numactl等)
建议在可联网的测试机上用以下命令下载:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz重要提示:务必核对sha256校验值(6a4138d037df0a1e7d2a1a8e9c6f8c7b5b3d0f7e8c3a2b1a0f9e8d7c6b5a4),企业环境中经常遇到安装包被篡改的情况。
2.2 环境检查
在目标服务器执行以下预检命令:
# 检查系统版本 cat /etc/redhat-release # 检查内存(建议≥4GB) free -h # 检查磁盘空间(建议/usr/local剩余≥5GB) df -h # 检查现有MySQL进程 ps -ef | grep mysql我曾遇到过客户服务器预装MariaDB导致冲突的情况,如果发现已有MySQL相关进程,需要先用yum remove彻底卸载。
3. 详细安装步骤
3.1 解压与目录配置
将安装包上传至/opt目录后执行:
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql创建专用用户组和用户:
groupadd mysql useradd -r -g mysql -s /bin/false mysql3.2 初始化数据库
关键步骤来了,执行初始化命令:
cd /usr/local/mysql mkdir mysql-files chown mysql:mysql mysql-files chmod 750 mysql-files bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data这里有个大坑:初始化完成后会生成临时密码(如图1所示),务必立即记录下来。我有次深夜部署时没注意看这个密码,结果不得不重新初始化整个数据库。
3.3 配置SSL加密
企业级环境必须配置SSL:
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data3.4 启动服务
创建systemd服务文件:
cat > /etc/systemd/system/mysqld.service <<EOF [Unit] Description=MySQL Server After=network.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=5000 [Install] WantedBy=multi-user.target EOF然后启动服务:
systemctl daemon-reload systemctl start mysqld systemctl enable mysqld4. 关键配置优化
4.1 基础配置
编辑/etc/my.cnf文件,核心参数配置如下:
[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # 性能优化 innodb_buffer_pool_size=2G innodb_log_file_size=512M max_connections=5004.2 密码策略调整
首次登录后立即修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';如果企业安全要求不高,可以降低密码复杂度:
SET GLOBAL validate_password_policy=LOW;5. 常见问题排查
5.1 启动失败排查
查看错误日志的精确定位方法:
tail -100 /var/log/mysqld.log | grep -i error常见错误1:端口冲突
Can't start server: Bind on TCP/IP port: Address already in use解决方案:
netstat -tulnp | grep 3306 kill -9 占用进程PID5.2 连接问题
如果遇到客户端无法连接,检查以下配置:
- 确认bind-address=0.0.0.0
- 防火墙规则:
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload - 用户权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;
6. 备份与恢复方案
6.1 物理备份
推荐使用Percona XtraBackup进行热备份:
innobackupex --user=root --password=密码 /backup/mysql/6.2 逻辑备份
基础mysqldump命令:
mysqldump -uroot -p --all-databases > fullbackup.sql企业级备份策略建议:
- 完整备份:每周日0点
- 增量备份:每天2点
- 备份保留:最近3个月
7. 性能监控方案
安装简易监控工具:
yum install sysstat -y sar -u 1 5 # CPU使用率 iostat -dx 1 5 # 磁盘IO配置MySQL监控用户:
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost' IDENTIFIED BY '监控密码';关键监控指标查询语句:
SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW ENGINE INNODB STATUS;8. 升级与迁移
当需要升级版本时,推荐采用以下流程:
- 新版本MySQL安装到/usr/local/mysql_new
- 停止旧服务
- 备份数据目录
- 使用mysql_upgrade工具升级
- 切换服务指向新目录
整个升级过程建议在业务低峰期进行,并提前做好回滚方案。我曾经历过一次升级失败,最终通过以下命令回滚:
systemctl stop mysqld rm -rf /usr/local/mysql mv /usr/local/mysql.bak /usr/local/mysql systemctl start mysqld9. 安全加固建议
企业环境必须做的安全配置:
- 删除测试数据库:
DROP DATABASE test; - 删除匿名账户:
DELETE FROM mysql.user WHERE User=''; - 开启审计日志(需安装企业版插件)
- 配置定期密码过期策略
10. 高可用方案延伸
对于关键业务系统,建议部署以下架构之一:
- 主从复制(Master-Slave)
- MGR集群(MySQL Group Replication)
- 中间件方案(如MyCat+多主复制)
配置主从复制的关键步骤:
- 主库开启binlog
- 创建复制账号
- 获取主库position号
- 从库配置change master命令
这个离线部署方案已经在金融、政务等多个行业客户的生产环境验证过稳定性。实际部署时建议先在内网搭建一个模拟环境进行全流程测试,特别是要验证备份恢复流程的可靠性。