1. 项目概述
在服务器运维和数据库管理领域,离线部署MySQL是一项基础但极其重要的技能。不同于在线安装只需几条命令就能搞定,离线部署需要提前准备所有依赖包,处理复杂的库文件关系,还要确保不同环境下的兼容性。我经历过数十次从内网测试环境到生产服务器的MySQL离线部署,深知其中每个环节可能出现的"坑"。
这个教程将用最直白的方式,手把手带你完成从安装包准备到服务调优的全过程。针对企业内网、安全隔离环境等无法连接外网的特殊场景,我会特别说明如何规避常见依赖缺失问题。所有操作步骤都配有实机截图,即使是刚接触Linux的运维新人也能按图索骥完成部署。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖检查
2.1 硬件与系统要求
首先确认你的服务器满足这些基本条件:
- CPU:至少2核(建议4核以上)
- 内存:最低4GB(生产环境建议8GB+)
- 磁盘空间:/usr/local目录剩余20GB以上
- 操作系统:CentOS/RHEL 7.x或8.x(本教程以CentOS 7.9为例)
重要提示:32位系统已不被新版本MySQL支持,务必使用x86_64架构
2.2 离线安装包获取
在有网络的环境下载这些必备文件:
- MySQL社区版tar包(以8.0.33为例):
code复制mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz - 依赖库合集(关键!):
- libaio
- numactl
- openssl
- libtinfo
建议使用以下命令批量下载依赖:
bash复制yum install --downloadonly --downloaddir=./mysql_deps libaio numactl openssl
2.3 传输文件到目标服务器
将下载的安装包和依赖通过以下方式传输:
- 内网SCP:
scp -r mysql_pkg root@target_ip:/tmp - 物理介质:U盘或移动硬盘拷贝
- 企业级方案:Nexus私服同步
3. 详细安装步骤
3.1 解压与目录准备
bash复制# 创建mysql用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 解压安装包到/usr/local
tar xvf mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz -C /usr/local
cd /usr/local
ln -s mysql-8.0.33-linux-glibc2.17-x86_64 mysql
3.2 安装依赖库
将提前下载的rpm包复制到服务器后:
bash复制rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm
rpm -ivh numactl-2.0.12-5.el7.x86_64.rpm
3.3 初始化数据目录
bash复制cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql
初始化后会显示临时密码(务必记录):
code复制[Note] A temporary password is generated for root@localhost: JqkL12!sDf
3.4 配置SSL加密
bash复制bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
4. 服务配置与启动
4.1 创建配置文件my.cnf
ini复制[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
# 性能优化项
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
4.2 设置systemd服务
创建/etc/systemd/system/mysqld.service:
ini复制[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务:
bash复制systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
5. 安全加固与远程访问
5.1 修改root密码
bash复制/usr/local/mysql/bin/mysql -uroot -p
# 输入初始化时的临时密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
5.2 创建远程访问用户
sql复制CREATE USER 'admin'@'%' IDENTIFIED BY 'ComplexPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6. 常见问题排查
6.1 启动时报libssl错误
现象:
code复制error while loading shared libraries: libssl.so.10
解决方案:
bash复制# 查找已有版本
find / -name "libssl.so*"
# 创建软链接
ln -s /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.10
6.2 客户端连接缓慢
在my.cnf添加:
ini复制[mysqld]
skip-name-resolve
6.3 表名大小写敏感问题
ini复制[mysqld]
lower_case_table_names=1
7. 性能优化建议
-
内存配置规则:
- innodb_buffer_pool_size = 总内存的50-70%
- key_buffer_size = 64M(MyISAM表使用)
-
连接数调整:
sql复制SET GLOBAL max_connections=500; -
查询缓存禁用(MySQL 8.0+默认禁用):
ini复制query_cache_type=0 query_cache_size=0
8. 备份与恢复方案
8.1 物理备份
bash复制# 热备份
/usr/local/mysql/bin/mysqlbackup --user=root --password=xxx --backup-dir=/backup backup
8.2 逻辑备份
bash复制/usr/local/mysql/bin/mysqldump -uroot -p --all-databases > full_backup.sql
8.3 自动备份脚本
创建/etc/cron.daily/mysql_backup:
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
/usr/local/mysql/bin/mysqldump -uroot -pPASSWORD --all-databases | gzip > /backup/mysql_$DATE.sql.gz
find /backup -type f -mtime +30 -delete
9. 升级与迁移指南
9.1 小版本升级步骤
- 停止MySQL服务
- 备份数据目录
- 解压新版本覆盖安装
- 执行升级检查:
bash复制
./bin/mysql_upgrade -uroot -p
9.2 跨大版本迁移
建议使用逻辑备份方式:
bash复制# 旧版本导出
mysqldump --all-databases --routines --events > full_dump.sql
# 新版本导入
mysql -uroot -p < full_dump.sql
10. 监控与维护
10.1 关键指标监控
sql复制-- 查看连接数
SHOW STATUS LIKE 'Threads_connected';
-- InnoDB状态
SHOW ENGINE INNODB STATUS;
-- 慢查询统计
SELECT * FROM sys.schema_table_statistics;
10.2 日志管理配置
ini复制[mysqld]
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2
log_error=/var/log/mysql-error.log
11. 高可用方案扩展
11.1 主从复制配置
在主库执行:
sql复制CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
在从库配置:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
11.2 半同步复制
安装插件:
sql复制INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=1;
12. 安全加固进阶
12.1 审计日志配置
安装企业版审计插件:
sql复制INSTALL PLUGIN audit_log SONAME 'audit_log.so';
12.2 防火墙规则
bash复制iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
13. 性能测试建议
使用sysbench进行基准测试:
bash复制# 准备测试数据
sysbench oltp_read_write --db-driver=mysql --mysql-host=127.0.0.1 \
--mysql-port=3306 --mysql-user=root --mysql-password=xxx prepare
# 执行测试
sysbench oltp_read_write --db-driver=mysql --threads=16 --time=300 \
--mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root run
14. 容器化部署方案
虽然本文主要讲解传统部署,但在容器环境下可参考:
dockerfile复制FROM centos:7
RUN yum install -y libaio numactl
COPY mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz /tmp
RUN tar xvf /tmp/mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz -C /usr/local \
&& ln -s /usr/local/mysql-8.0.33-linux-glibc2.17-x86_64 /usr/local/mysql
15. 终极排错指南
当遇到无法启动的情况时:
- 检查错误日志:
bash复制tail -n 100 /var/log/mysql-error.log - 验证文件权限:
bash复制
namei -l /usr/local/mysql/data - 测试配置文件:
bash复制
/usr/local/mysql/bin/mysqld --validate-config
经过这些年的运维实践,我发现90%的MySQL离线部署问题都出在依赖库缺失和文件权限配置上。建议在正式部署前,先用测试机完整走一遍流程。另外提醒一点,MySQL 8.0默认使用caching_sha2_password认证插件,如果客户端工具版本较旧,需要在创建用户时指定mysql_native_password插件。
