1. 项目概述与核心需求解析
最近在给一个客户部署一套内部管理系统,他们的服务器环境比较特殊,位于一个完全隔离的内网中,无法连接外网。客户要求使用稳定成熟的 CentOS 7 作为操作系统,数据库则指定了 MySQL 5.7 版本。这个“Linux CentOS-7 离线安装MYSQL5.7”的需求,听起来简单,但实际操作起来,从准备安装包、解决依赖关系到最终配置成功,每一步都可能遇到意想不到的“坑”。对于很多运维工程师、系统管理员或者需要在内网环境部署服务的开发者来说,离线安装数据库是一项必备且考验基本功的操作。它不像在线安装那样,一条yum install命令就能自动解决所有问题,离线安装要求你对软件包的依赖关系、系统环境、配置细节有更清晰的认识。本文将基于我多次在真实生产环境中实施的经验,手把手带你走通整个流程,不仅告诉你每一步怎么做,更会重点解释为什么这么做,以及过程中可能遇到的典型问题和我的独家避坑技巧。无论你是刚接触 Linux 的新手,还是需要快速查阅流程的老手,这篇超过五千字的详细教程都能为你提供一份可靠的“离线安装作战地图”。
2. 离线安装的整体思路与准备工作
2.1 为什么选择离线安装及方案选型
离线安装的需求通常源于生产服务器的高安全要求、网络策略限制或纯粹的物理隔离环境。在这种场景下,我们无法使用 CentOS 默认的 YUM 仓库在线下载安装包和依赖。因此,核心思路就转变为:在一台可以访问互联网的、操作系统版本一致的“跳板机”上,预先下载好所有必需的 RPM 安装包,然后通过 U 盘、内网共享或物理介质拷贝到目标服务器进行安装。
为什么选择 RPM 包安装,而不是源码编译?对于 MySQL 这类核心基础服务,在追求稳定和可维护性的生产环境中,RPM 包安装是更主流和推荐的方式。官方提供的 RPM 包已经经过了良好的编译和优化,包含了标准的服务管理脚本(systemd unit file)、默认的配置文件路径和安全初始化脚本。使用 RPM 包安装,后续的升级、卸载和管理都会更加规范。而源码编译虽然灵活性高,但过程复杂,容易因环境差异引入不稳定因素,且后续维护成本较高。
2.2 准备工作清单:工具与材料
工欲善其事,必先利其器。开始之前,请确保你拥有以下资源:
- 一台可联网的“下载机”(跳板机):这台机器必须安装CentOS 7,并且系统版本、架构(通常是 x86_64)最好与目标服务器完全一致。这是为了避免因系统库版本差异导致的依赖问题。你可以通过
cat /etc/redhat-release和uname -m命令来确认。 - 一个足够容量的存储介质:用于将下载好的安装包从下载机传输到目标服务器。根据经验,完整下载 MySQL 5.7 社区版 Server、Client、共享库等核心 RPM 包及其依赖,大约需要 200-300 MB 空间。准备一个 1GB 的 U 盘或规划好网络共享路径是稳妥的。
- 目标服务器:同样安装好 CentOS 7 的最小化系统。建议在安装前执行
yum update更新系统(如果在线)或至少确保系统是干净的。 - MySQL 5.7 官方 RPM 包仓库地址:我们将从 MySQL 官方 YUM 仓库下载,这能保证我们获取到的是经过签名、完整且最新的 5.7 系列版本。主要需要以下几个包(以 x86_64 架构为例):
mysql-community-server: MySQL 服务器主程序。mysql-community-client: MySQL 客户端工具,如 mysql 命令行。mysql-community-libs: 共享库文件。mysql-community-common: 公共文件。mysql-community-devel: 开发用头文件和库(非必需,但某些应用可能需要)。mysql-community-libs-compat: 旧版本兼容库(为使用老版本客户端连接提供兼容性)。
注意:在下载机上,我们虽然能联网,但不要直接使用
yum install,而是使用yumdownloader或repoquery工具来仅下载不安装RPM 包及其所有依赖。
3. 核心步骤一:在下载机获取完整 RPM 包及依赖
这是整个离线安装最关键的一步,目的是建立一个完整的、无缺失的离线包仓库。
3.1 配置 MySQL 官方 YUM 仓库
首先,在下载机上添加 MySQL 的官方 YUM 源。访问 MySQL 官网的 YUM 仓库下载页面,找到对应 CentOS 7 的仓库配置文件。通常,你可以通过以下命令快速完成(需要wget工具):
# 进入YUM仓库配置目录 cd /etc/yum.repos.d/ # 下载MySQL官方为EL7(即CentOS/RHEL 7)准备的仓库配置文件 sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 安装这个仓库包,它会在/etc/yum.repos.d/下生成mysql-community.repo等文件 sudo rpm -ivh mysql80-community-release-el7-7.noarch.rpm安装后,默认启用的是 MySQL 8.0 的仓库。我们需要启用 5.7 仓库,禁用 8.0。编辑生成的/etc/yum.repos.d/mysql-community.repo文件:
sudo vim /etc/yum.repos.d/mysql-community.repo找到[mysql57-community]和[mysql80-community]这两个部分,修改enabled参数:
[mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 # 将0改为1,启用5.7仓库 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql [mysql80-community] name=MySQL 8.0 Community Server baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/ enabled=0 # 确保这里是0,禁用8.0仓库 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql保存退出后,清除 YUM 缓存并重建:sudo yum clean all && sudo yum makecache。
3.2 使用 yumdownloader 下载完整依赖树
现在,使用yumdownloader工具来下载我们需要的包。如果系统没有这个命令,需要先安装yum-utils包:sudo yum install -y yum-utils。
接下来,创建一个目录用于存放所有下载的 RPM 包,例如/opt/mysql-offline-packages:
sudo mkdir -p /opt/mysql-offline-packages cd /opt/mysql-offline-packages执行下载命令。--resolve参数会自动下载所有依赖包,--destdir指定下载目录。
sudo yumdownloader --resolve --destdir=/opt/mysql-offline-packages mysql-community-server mysql-community-client实操心得:有时候yumdownloader可能不会下载mysql-community-libs和mysql-community-common这类被server和client共同依赖的基础包。为了更保险,我习惯显式地指定所有核心包一起下载:
sudo yumdownloader --resolve --destdir=/opt/mysql-offline-packages \ mysql-community-server \ mysql-community-client \ mysql-community-libs \ mysql-community-common \ mysql-community-devel下载完成后,使用ls -lh查看目录,应该能看到几十个 RPM 文件,总大小约 200-300 MB。
3.3 验证与打包传输
下载完成后,强烈建议进行一次模拟安装检查,确保依赖包完整且无冲突。这可以在下载机上进行(使用--test参数不真正安装):
cd /opt/mysql-offline-packages sudo rpm -ivh --test *.rpm如果命令执行后没有报错(特别是关于缺失依赖的error: Failed dependencies),说明包集合基本完整。如果有报错,记下缺失的包名,回到上一步用yumdownloader单独下载补齐。
最后,将整个/opt/mysql-offline-packages目录打包,准备传输到目标服务器:
cd /opt sudo tar -czf mysql-5.7-offline.tar.gz mysql-offline-packages/现在,你可以将mysql-5.7-offline.tar.gz这个压缩包通过 U 盘、SCP(如果存在内部通路)或其他方式,复制到目标服务器的某个目录,例如/tmp。
4. 核心步骤二:在目标服务器离线安装 MySQL
4.1 环境检查与包传输
登录到目标 CentOS 7 服务器。首先进行基础检查:
- 检查是否已安装 MariaDB 或旧版 MySQL:CentOS 7 默认可能安装了 MariaDB,这会导致与 MySQL 冲突。执行
rpm -qa | grep -i mariadb和rpm -qa | grep -i mysql查看。如果存在,必须卸载:sudo rpm -e --nodeps <包名>。 - 检查关键依赖:虽然 RPM 会处理大部分依赖,但像
libaio、numactl这类系统库最好提前确认。可尝试rpm -q libaio numactl。如果不存在,你需要回到下载机,用同样的yumdownloader方法下载这些系统包的 RPM,并一并传到目标机安装。
将从下载机拷贝来的压缩包解压:
sudo tar -xzf /tmp/mysql-5.7-offline.tar.gz -C /opt/ cd /opt/mysql-offline-packages4.2 使用 RPM 命令顺序安装
安装 RPM 包时,顺序很重要。应该先安装基础依赖和公共包,再安装主程序。一个可靠的安装顺序如下:
# 1. 安装公共包和库文件 sudo rpm -ivh mysql-community-common-*.rpm sudo rpm -ivh mysql-community-libs-*.rpm sudo rpm -ivh mysql-community-libs-compat-*.rpm sudo rpm -ivh mysql-community-client-*.rpm # 2. 安装服务器主程序(这一步可能会因为依赖检查失败,如果上一步都成功了,这里加--nodeps强制安装) sudo rpm -ivh mysql-community-server-*.rpm # 3. (可选)安装开发包 # sudo rpm -ivh mysql-community-devel-*.rpm踩坑记录:在安装mysql-community-server时,即使你已经安装了所有依赖,RPM 可能仍会报错提示缺少perl相关的依赖(如perl(Data::Dumper))。这是因为 MySQL 的初始化脚本用到了 Perl。在离线环境下,你需要提前准备好这些 Perl 模块的 RPM 包。更简单的做法是,如果确认依赖已满足,可以使用--nodeps参数跳过依赖检查强制安装服务器包:sudo rpm -ivh --nodeps mysql-community-server-*.rpm。但务必确保你已手动安装了所有必要的依赖包,否则服务可能无法启动。
4.3 初始化 MySQL 数据目录
安装完成后,MySQL 的数据目录(默认/var/lib/mysql)是空的,需要进行初始化。MySQL 5.7 推荐使用mysqld --initialize命令(随机生成 root 密码)或mysqld --initialize-insecure(root 密码为空)。生产环境建议使用前者以保障安全。
# 先确保数据目录为空且权限正确 sudo rm -rf /var/lib/mysql/* sudo chown mysql:mysql /var/lib/mysql # 执行初始化,这会在日志中生成一个临时root密码 sudo mysqld --initialize --user=mysql初始化命令会在 MySQL 的错误日志文件中(默认/var/log/mysqld.log)打印出生成的临时 root 密码。务必立即查看并记录:
sudo grep 'temporary password' /var/log/mysqld.log输出类似:A temporary password is generated for root@localhost: JqkR7>ieQ8t-。记下冒号后面的密码。
4.4 启动服务并修改 root 密码
启动 MySQL 服务并设置开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld sudo systemctl status mysqld # 检查服务状态,确认是active (running)使用获取到的临时密码登录 MySQL,并立即修改密码。MySQL 5.7 有默认的密码强度策略。
mysql -u root -p # 输入刚才记录的临时密码登录成功后,在 MySQL 提示符下执行:
-- 修改root用户密码,请将‘YourNewStrongPassword!123’替换成你自己的强密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!123'; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;5. 核心步骤三:基础安全配置与远程访问设置
5.1 运行 MySQL 安全安装向导(强烈推荐)
MySQL 提供了一个交互式的安全配置脚本mysql_secure_installation,它能帮你完成一系列安全加固操作,如设置 root 密码、移除匿名用户、禁止 root 远程登录、删除测试数据库等。即使你已经修改了密码,也强烈建议运行它来检查其他安全项。
sudo mysql_secure_installation根据提示依次操作即可。对于“是否设置验证密码插件?”的问题,如果对密码强度有要求可以启用,否则可以选择否(n)。
5.2 配置远程连接(按需)
默认情况下,MySQL 5.7 只允许本地(localhost)连接。如果需要从其他服务器访问,需要进行配置。
修改绑定地址:编辑 MySQL 配置文件
/etc/my.cnf(或/etc/mysql/my.cnf),在[mysqld]部分找到bind-address项,将其值从127.0.0.1改为0.0.0.0(监听所有网卡)或指定的服务器 IP。[mysqld] bind-address = 0.0.0.0注意:改为
0.0.0.0会允许所有 IP 连接,请确保结合防火墙策略使用。创建远程访问用户并授权:不建议直接使用 root 用户进行远程连接。登录 MySQL,创建一个新用户并授予特定权限。
CREATE USER 'your_username'@'%' IDENTIFIED BY 'StrongRemotePassword!456'; -- 授予所有数据库的所有权限(生产环境建议按需授予更细粒度的权限) GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;配置防火墙:如果目标服务器开启了防火墙(如 firewalld),需要开放 MySQL 默认的 3306 端口。
sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload重启 MySQL 服务使配置生效:
sudo systemctl restart mysqld
6. 常见问题、故障排查与优化建议
6.1 安装阶段典型问题
问题1:安装 RPM 时提示 “Failed dependencies: libc.so.6(GLIBC_2.xx)(64bit) is needed”
- 原因:目标服务器的 glibc 库版本低于安装包要求。这是离线安装中最棘手的问题之一。
- 排查:在下载机和目标机分别执行
rpm -q glibc和strings /lib64/libc.so.6 | grep GLIBC_对比版本。 - 解决:尽量保证下载机与目标机的 CentOS 7 小版本号一致。如果必须升级目标机 glibc,需极其谨慎,因为它是系统核心库。建议寻找版本要求更低的 MySQL 5.7 RPM 包,或考虑在目标机上从源码编译 glibc(风险高)。
问题2:启动 mysqld 服务失败,日志显示 “Could not create unix socket lock file /var/lib/mysql/mysql.sock.lock”
- 原因:SELinux 或目录权限问题。
- 排查:查看
/var/log/mysqld.log获取详细错误。临时禁用 SELinux 测试:sudo setenforce 0。检查/var/lib/mysql目录所有权是否为mysql:mysql。 - 解决:
- 权限:
sudo chown -R mysql:mysql /var/lib/mysql - SELinux:如果确认是 SELinux 阻止,可以永久调整策略(生产环境需评估)或设置正确的上下文:
sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"然后sudo restorecon -Rv /var/lib/mysql。更简单(但安全性降低)的方法是临时禁用 SELinux(编辑/etc/selinux/config将SELINUX=enforcing改为SELINUX=disabled,然后重启),但这并非最佳实践。
- 权限:
6.2 运行阶段典型问题
问题3:使用临时密码无法登录,提示 “Access denied”
- 原因:密码输入错误(注意大小写和特殊字符)、密码已过期或日志文件被覆盖。
- 排查:确认复制的密码完全正确,包括末尾可能存在的空格。检查是否使用了错误的用户(如
root@127.0.0.1和root@localhost在某些配置下被视为不同)。查看最新的错误日志是否有新信息。 - 解决:如果密码丢失,可以尝试“跳过授权表”模式启动 MySQL 来重置密码:
- 停止 MySQL:
sudo systemctl stop mysqld - 编辑配置文件
/etc/my.cnf,在[mysqld]部分添加skip-grant-tables - 启动 MySQL:
sudo systemctl start mysqld - 无需密码登录:
mysql -u root - 执行
UPDATE mysql.user SET authentication_string=PASSWORD('YourNewPassword') WHERE User='root';和FLUSH PRIVILEGES;(注意 MySQL 5.7 后密码字段是authentication_string)。 - 退出,移除配置文件中的
skip-grant-tables行,重启 MySQL。
- 停止 MySQL:
问题4:远程客户端无法连接,但本地可以
- 原因:未正确配置
bind-address、用户未授权远程主机、防火墙未放行端口。 - 排查:遵循“由近及远”原则:
- 在服务器本地用
mysql -u your_username -p -h 127.0.0.1测试用户密码是否正确。 - 检查
bind-address配置。 - 检查 MySQL 用户授权:
SELECT User, Host FROM mysql.user;确认存在'your_username'@'%'或对应客户端 IP 的记录。 - 在服务器上使用
sudo netstat -tlnp | grep 3306查看 3306 端口是否在监听0.0.0.0。 - 检查服务器防火墙规则。
- 检查客户端与服务器之间的网络路由和安全组(如果是云服务器)。
- 在服务器本地用
6.3 性能与安全优化建议(离线环境考量)
在离线环境中,一些优化同样重要:
- 调整 InnoDB 缓冲池大小:编辑
/etc/my.cnf,根据服务器物理内存调整innodb_buffer_pool_size,通常设置为可用内存的 50%-70%。例如,对于 4GB 内存的服务器:innodb_buffer_pool_size = 2G。 - 配置字符集:为避免乱码,建议统一设置为
utf8mb4。[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 - 日志管理:在离线环境,日志轮转和清理尤为重要。确认
log_error、slow_query_log等日志配置,并规划好日志清理策略(如使用logrotate)。 - 备份策略:离线环境的数据备份更为关键。即使没有网络,也应定期使用
mysqldump进行逻辑备份,并将备份文件拷贝到其他存储介质。可以编写 Shell 脚本结合 crontab 实现自动化。
整个离线安装过程,从准备、传输到安装配置,考验的是对系统包管理、服务配置和故障排查的全面理解。我个人的体会是,准备工作做得越细致(尤其是依赖包的完整性和版本一致性),后续安装过程就越顺畅。每次完成这样的离线部署,最好能详细记录下所有下载的 RPM 包列表及其版本,形成一份属于自己环境的“离线部署清单”,这会在未来类似的任务中节省大量时间。最后一个小技巧是,可以在下载机上使用createrepo命令将下载的 RPM 包制作成一个本地的 YUM 仓库,这样在目标服务器上就可以模拟在线安装的环境,用yum --disablerepo=\* --enablerepo=local-mysql install mysql-community-server这样的命令来安装,能更好地自动处理依赖关系,这是比手动rpm -ivh更优雅的进阶方案。