news 2026/9/18 1:34:27

CentOS 7无网环境离线安装MySQL 8.0.36完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CentOS 7无网环境离线安装MySQL 8.0.36完整实战指南

做运维的朋友应该都经历过这种场景:生产环境安全策略严格,服务器只能访问内网,外网一概不通,但业务方又突然说需要一套MySQL 8.0。装数据库平时看起来简单,放到无网环境里马上就变成高难度操作——yum源用不了,wget等于摆设,MySQL 8.0对系统库的依赖又比5.7多不少,少了任何一个都会直接启动失败。这篇文章把我最近在CentOS 7无网环境下部署MySQL 8.0.36的完整流程整理了出来,从依赖包准备、RPM安装、数据目录规划到初始化、远程账号配置,每个步骤都有操作命令和对应的坑点说明。如果你恰好也卡在这个环节,参考这套流程,至少可以少走我当年踩过的弯路。

1. 离线安装前,先把方案想清楚

1.1 用RPM包而不是源码编译

第一次做无网安装,很多人第一反应是“源码编译最保险”。源码编译确实对平台依赖低,但它有两个问题:一是耗时长,MySQL源码编译需要完整的编译工具链支持,gcc、cmake、make、bison这些包在无网环境里同样缺一不可,凑齐这一套工具链比装MySQL本身还麻烦;二是出错概率高,编译参数、内存不足、甚至系统时间异常都会导致编译中断,排查起来相当头痛。

相比之下,MySQL官方提供的RPM Bundle包已经把服务器端、客户端、公共库等编译好了,也按RHEL/CentOS平台命名,比如mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar,在CentOS 7里直接用rpm或者yum localinstall去装,几分钟就搞定。所以我的建议是:只要你的系统是官方支持的CentOS 7架构,就优先用RPM包,不要跟自己过不去。源码编译更适合那些需要打自定义补丁、或者系统架构比较特殊的场景,普通生产部署完全没必要。

1.2 离线环境的依赖到底从哪来

RPM包虽然省了编译,却引出了另一个问题:依赖缺失。MySQL 8.0的安装包会依赖libaio、libaio-devel、ncurses-compat-libs、openssl等系统库,在CentOS 7默认安装里,libaio很可能不存在,而openssl版本也可能偏老。以前在有网环境里,yum会自动解决依赖,但无网环境里yum源不可用,依赖就得人工准备。

这里有一个非常实用的技巧:找一台能联网的同版本CentOS 7机器,用yumdownloader --resolve命令把目标rpm和它依赖的包全部下载到本地目录,再统一拷贝到无网环境。这样拿到的依赖包版本和系统匹配度最高,比去第三方网站东拼西凑靠谱得多。如果你的无网服务器已经配置了内网软件源,那就更简单了,直接把依赖包上传到内网源里,目标机器用yum安装即可,但大多数严格隔离环境不具备这个条件,所以手工收集依赖仍然是基本功。

1.3 安装文件清单规划

正式动手之前,先把需要的文件列清楚。根据我的实践经验,一份完整的离线安装物料大致包含这几类:

  • MySQL 8.0官方RPM包:mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar,这个包是核心,其他都围绕它来。
  • 系统依赖库RPM包:libaio、libaio-devel、ncurses-compat-libs、openssl、openssl-devel等,具体缺什么以实际报错为准,但我建议一次性备齐。
  • 临时工具包:比如net-tools(ifconfig查端口用)、lsof(查端口占用),无网环境装完再发现缺这些也挺折腾。
  • 配置文件模板:调整后的my.cnf,比如数据目录、字符集、端口号等,提前写好能少一步手忙脚乱。

把这些提前准备好,后面安装过程基本可以一气呵成。千万不要没规划就开装,装到一半缺包再去找,那种体验真的很糟糕,而且很容易在反复试错中把系统环境搞乱。

2. 依赖包的下载与传输:花10分钟准备,省半天排查

2.1 用yumdownloader批量搞定依赖

在有网的CentOS 7机器上,推荐用yumdownloader来拉取依赖包,它的好处是能自动分析依赖关系并下载全部rpm文件。操作方式如下:

yum install -y yum-utils mkdir -p /root/mysql-offline cd /root/mysql-offline yumdownloader --resolve --destdir=/root/mysql-offline libaio libaio-devel ncurses-compat-libs openssl openssl-devel

这条命令会把指定的包和它们的所有依赖下载到/root/mysql-offline目录。有一个细节需要特别注意:yumdownloader的--resolve参数只会根据当前已安装的环境去解析依赖,如果某个依赖已经在当前系统中安装,它就不会再下载,但这种包往往在目标机器上也需要存在。保险起见,可以在一台尽量精简的全新CentOS 7虚拟机里执行下载,确保依赖包足够齐全。

另一个思路是直接把MySQL的RPM Bundle解压后,把里面所有rpm和系统依赖rpm放到同一个目录,用createrepo生成一个本地仓库,到无网服务器上配置一个本地yum源。这个方案能省去很多人肉判断依赖的麻烦,适合包多、依赖复杂的场景。createrepo的用法很简单,在某个目录下执行createrepo .,再用一个本地file:///路径的.repo文件指向它即可。

2.2 确认版本、校验文件完整性

下载完不是直接塞进U盘就完事,版本匹配是最大的坑。MySQL 8.0的RPM Bundle有区分el7和el8两个平台,文件名中会明确标注。比如mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar对应CentOS 7,如果误下载了el8版本,安装时大概率会报“Wrong ELF class”或者依赖解析失败,这种情况在无网环境里排查起来极其痛苦。

另外一个常被人忽略的点是文件完整性。无网传输过程中U盘拷贝、内网传文件都可能导致文件损坏,拷贝完成后建议立即做一次校验:

md5sum mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar

拿这个值和官网发布的MD5值对比,一致再开始装。我在一次实际部署中,就因为U盘拷贝时文件损坏,rpm -ivh执行到一半报“package mysql-community-server-8.0.36-1.el7.x86_64.rpm is not installed”,白白排查了快一个小时。

2.3 怎么把文件安全送到无网服务器

物料准备好后,传输方式一般有三种,按推荐顺序排列:

  • 内网HTTP/RPM共享目录:如果公司内部有软件源服务器,直接把这堆rpm挂上去最方便,无网服务器通过内网地址访问即可,这是最规范的方案。
  • SCP/SFTP:如果无网服务器允许内网SSH,直接用scp从操作机拉取,例如scp /root/mysql-offline/*.rpm user@内网IP:/tmp/,注意目标目录要有写权限。
  • 移动介质:U盘或移动硬盘拷贝。注意拷贝前先做病毒扫描,拷贝完成做md5sum校验,然后挂载到服务器,比如U盘设备名通常是/dev/sdb1,执行mount /dev/sdb1 /mnt/usb即可。

关于传输,我建议不要把大量rpm文件放在中文目录或带空格路径下,否则后续命令处理容易出幺蛾子。统一放到/tmp/mysql-offline这种简洁路径下,后边执行命令也顺手。

3. CentOS7无网安装MySQL8.0完整实操

3.1 检查系统基础环境

在无网服务器上,先确认几项基本情况,避免白忙活:

cat /etc/redhat-release whoami free -h df -h /data getenforce

首先要确认你是root用户,MySQL的初始化、安装过程基本都要求root权限。其次确认磁盘空间,MySQL 8.0安装包解压后大概占用1GB左右,数据目录建议预留至少10GB以上空间,具体看业务量。然后查看SELinux状态,如果getenforce输出是Enforcing,安装好后MySQL可能因为SELinux策略导致无法写入数据目录或者启动失败。

很多教程会建议直接setenforce 0关闭SELinux,如果生产环境有安全合规要求,不建议永久关闭,可以用ausearch去查具体被拒的AVC记录,针对性放行。但说实话,在测试环境或者内网隔离环境,直接把SELinux临时设为Permissive,能省不少排查时间。这个取舍需要你自己结合运维规范来定,后文会再展开。

3.2 解压RPM包并安装

先把MySQL官方Bundle解压出来:

mkdir -p /tmp/mysql-offline && cd /tmp/mysql-offline tar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar

解压后目录里一般会包含这些包:

  • mysql-community-common-8.0.36-1.el7.x86_64.rpm
  • mysql-community-libs-8.0.36-1.el7.x86_64.rpm
  • mysql-community-client-8.0.36-1.el7.x86_64.rpm
  • mysql-community-server-8.0.36-1.el7.x86_64.rpm
  • mysql-community-client-plugins-8.0.36-1.el7.x86_64.rpm
  • mysql-community-icu-data-files-8.0.36-1.el7.x86_64.rpm
  • mysql-community-libs-compat-8.0.36-1.el7.x86_64.rpm

这几个包之间存在依赖关系,最好用yum localinstall一条命令让yum自动解依赖,前提是你已经把依赖rpm也放到了同一目录:

yum localinstall -y /tmp/mysql-offline/*.rpm

yum localinstall会在当前目录和指定目录中寻找依赖的rpm,能自动处理本地的包依赖。如果目录里依赖不全,它会报missing dependency并且明确指出缺哪个包。如果你的无网环境里根本没有配置本地yum源,也可以用rpm -ivh按顺序安装:

rpm -ivh mysql-community-common-*.rpm rpm -ivh mysql-community-libs-*.rpm rpm -ivh mysql-community-client-plugins-*.rpm rpm -ivh mysql-community-icu-data-files-*.rpm rpm -ivh mysql-community-client-*.rpm rpm -ivh mysql-community-server-*.rpm

这里要注意,libs和client-plugins的顺序不能乱,因为client会依赖libs,libs又依赖common。如果出现“libmysqlclient.so.21()(64bit) is needed by xxx”这类似的报错,一般就是common或libs没装好。最稳妥的做法还是建一个本地yum源,在目标机器上把rpm目录用createrepo做成仓库,后续任何缺依赖都能自动从本地源里补齐,不只是MySQL这个一次性的需求。

3.3 修改配置文件,规划好数据目录

安装完成后,默认配置文件是/etc/my.cnf,一般不直接改原文件,建议在/etc/my.cnf.d/下新建一个自定义配置文件,比如mysql-custom.cnf:

[mysqld] port=3306 character_set_server=utf8mb4 collation_server=utf8mb4_0900_ai_ci datadir=/data/mysql socket=/data/mysql/mysql.sock pid-file=/data/mysql/mysqld.pid log-error=/data/mysql/mysql-error.log skip-name-resolve max_connections=500

有几个参数值得展开说一下。character_set_server=utf8mb4是现在主流的字符集选择,能完整支持中文和emoji,避免出现中文乱码问题。skip-name-resolve的意思是跳过反向DNS解析,生产环境能显著减少客户端连接时的解析延迟,不过它会要求你后续创建账号时使用IP而不是主机名。datadir改成独立数据盘(比如/data/mysql)的好处是,系统盘故障时数据还在数据盘上,且后续扩容也方便。

手动建目录并授权:

mkdir -p /data/mysql chown -R mysql:mysql /data/mysql

如果直接用默认的/var/lib/mysql,可以省去一部分权限配置,但生产环境我仍然建议把数据目录独立出来。数据备份、迁移、扩容都会更灵活,尤其是以后想把MySQL数据盘单独挂载成云硬盘或者做LVM快照时,独立目录的优势非常明显。

3.4 初始化数据库并启动服务

MySQL 8.0的初始化命令在RPM安装后是自带的:

mysqld --initialize --user=mysql --datadir=/data/mysql

这里有几个容易踩的坑。第一,--initialize参数在root用户下执行时,命令行里必须带--user=mysql,否则初始化会报错或者生成的文件属主不对。第二,如果datadir指向的目录不为空,初始化会直接报错,所以要么用全新的空目录,要么先把目录清理干净。第三,初始化过程不会在终端打印任何密码,临时密码会记录到错误日志中。对于自定义的log-error路径,查看方式就是:

grep 'temporary password' /data/mysql/mysql-error.log

日志里会有一行“A temporary password is generated for root@localhost: xxxxxxxx”,这个临时密码一定要记下来,后面首次登录要用。拿到临时密码后,启动服务:

systemctl start mysqld systemctl status mysqld

如果启动失败,第一步看错误日志,一般问题都写在日志末尾。其中最常见的启动失败原因是libaio缺失,日志里会报“libaio.so.1: cannot open shared object file”,解决办法就是把libaio包安装上再重启。另一个常见问题是数据目录属主不对,日志会报“Permission denied”,用chown -R mysql:mysql /data/mysql修正即可。

3.5 修改密码、创建远程访问账号

MySQL 8.0从安装到拿到临时密码,接下来的第一件事就是登录改密码,因为临时密码只允许你做很少的操作:

mysql -uroot -p

输入刚才日志里的临时密码进入MySQL后,会提示密码已过期,必须重置才能继续操作:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass@123';

MySQL 8.0默认的密码策略是medium级别,密码必须至少8位、包含大小写字母、数字和特殊字符。如果不想被这个策略卡住,可以降低验证级别:

SET GLOBAL validate_password.policy = LOW;

这里需要提醒一句,MySQL 8.0里的变量名是validate_password.policy,不是5.7时代的validate_password_policy,中间是英文句点,不是下划线。这个差异我见过很多人写错,包括我自己第一次也踩过。如果修改完还没有生效,可能需要执行FLUSH PRIVILEGES,或者确认当前会话变量。

如果业务需要远程连接数据库,比如用Navicat或者应用服务器去连,那还要创建一个允许从其他主机访问的账号。可以用root提权,但生产环境强烈不建议让root远程登录,更好的做法是创建一个专用账号:

CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUserPass@123'; GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

这里%代表允许任意主机访问,如果只想让某个应用服务器连,就写成具体的IP,例如'user'@'192.168.1.100'。另外,MySQL 8.0默认的认证插件是caching_sha2_password,较老版本的Navicat或驱动可能不兼容,连接时会报“Authentication plugin 'caching_sha2_password' cannot be loaded”。这种情况下,要么升级客户端工具版本,要么把这个账号的认证方式改成mysql_native_password:

ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppUserPass@123';

我建议优先考虑升级客户端,因为mysql_native_password是旧的认证方式,安全性和性能都不如默认插件。如果实在没法升级客户端,再退而求其次用旧插件,但内部系统还是应该把安全性和长远维护放在第一位。

4. 避坑合集:安装过程中最常见的几个坎

4.1 依赖缺失导致的安装失败

无网安装最怕的就是“缺这个缺那个”。我在实际部署里遇到的依赖报错,按出现的频率排序大概是这几类:

  • libaio缺失:这是MySQL 8.0启动阶段最常见的错误,报错位置通常在错误日志或者启动的时候,表现为“/usr/sbin/mysqld: error while loading shared libraries: libaio.so.1”。
  • 缺少libncurses.so.5:CentOS 7默认带的ncurses版本是6,但部分MySQL客户端组件仍会去找旧版本,这时需要额外安装ncurses-compat-libs。
  • 缺少libstdc++相关的旧版本:一般出现在系统比较精简的环境,可以一次性把libstdc++、libtinfo等常见库备好。

处理依赖问题,我有个习惯性的做法:先rpm -ivh某个包看它报什么依赖缺失,然后把依赖名记下来,按照依赖树逐级安装。还有一种更高效的方式,就是用前面说的本地yum仓库来自动解决,依赖报错基本能被yum自动消化,省心很多。虽然无网环境装MySQL不值得为此专门搭一套完整的镜像源,但是把备好的rpm目录用createrepo管理起来,对后续安装Nginx、Python等其他软件同样有用,属于一次投入长期受益的做法。

4.2 初始密码和修改密码的那些坑

前面提到临时密码会在日志里生成,但实际操作中我发现两种意外情况。一种情况是日志里压根搜不到“temporary password”,这可能是因为log-error配置和实际输出日志的路径不一致,或者当前用户权限不够读取日志。另一种情况是初始化完成马上重启了服务,日志被覆盖,临时密码丢失。

这两个问题有一个共同的补救方法:如果MySQL服务已经能启动,可以用skip-grant-tables模式重置密码。具体做法是在配置文件里临时加入skip-grant-tables,然后重启服务,此时可以无密码进入MySQL,再手动重置密码。操作命令大概是:

UPDATE mysql.user SET authentication_string='' WHERE user='root' AND host='localhost'; FLUSH PRIVILEGES;

注意这个模式极度危险,操作完务必在第一时间重启去掉这个参数,否则任何人都能无密码登录数据库,相当于把数据裸奔在网络上。另外还要强调一点:MySQL 8.0里执行ALTER USER修改密码前,如果之前执行过CREATE USER,新的密码策略会校验密码强度。很多时候我们会为了省事把密码设置成简单组合,比如“123456”,结果被validate_password组件拦下,提示password does not satisfy the current policy requirements。这种问题要么换复杂密码,要么按前文方法修改策略,不建议用简单密码强行对抗策略。

4.3 远程连接不上,先从这三个方向排查

数据库装好了、密码改好了,但应用服务器就是连不上,报错五花八门。以我的经验,远程连接问题九成以上出在下面三个地方。

第一,确认服务监听的端口。执行netstat -tlnp | grep 3306,如果输出结果里的监听地址是127.0.0.1:3306,说明MySQL默认只允许本机连接,需要在my.cnf里把bind-address改为0.0.0.0或者直接注释掉,然后重启服务。这也是最容易被忽略的一个点,甚至有些教程从头到尾都没提过。

第二,防火墙要放行3306端口。CentOS 7默认用的是firewalld,执行:

firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload firewall-cmd --list-ports

如果企业环境中还有更上层的防火墙或者安全组,也要同步放行,否则服务端全配置好了,路由不通照样白搭。

第三,检查账号的host限制。MySQL的账号权限是按“用户+来源主机”匹配的,如果你用root@localhost去连,即使MySQL服务监听0.0.0.0,远程依然会被拒绝。所以在应用服务器上连接之前,要确认你的账号host确实是‘%’或者对应的IP段。

以上三件事检查完,远程连接基本就没有悬念了。如果还是不行,再用telnet 127.0.0.1 3306在服务器本机测试一下端口,接着用mysql -h内网IP -P3306 -uappuser -p从应用服务器测试,逐层定位,不要一上来就怀疑MySQL配置。

4.4 开机自启、安全加固的小建议

MySQL装好之后,先确认开机自启是否生效:

systemctl enable mysqld systemctl is-enabled mysqld

实测中很多人会忘记这一步,导致服务器重启后数据库没起来,结果业务方大半夜打电话说服务挂了,排查半天才发现是MySQL没自启。服务启动后,建议做几个基础安全操作:一是清理测试库和匿名用户,执行mysql_secure_installation,虽然无网环境里这个脚本也能正常使用,但要注意它需要你在交互式提示中选择是否移除匿名用户、是否禁止root远程登录等,按需选择即可;二是对数据目录做定期备份,最简单的方式是用mysqldump导出SQL文件到备份盘;三是把root远程登录禁掉,统一使用专用账号。这些操作看起来基础,但在真实生产事故里,很多问题都是从这些细节上爆发的。

5. 我的一些实操体会

最后讲一点个人经验。第一次在无网环境装MySQL 8.0的时候,我花了很多时间纠结“怎么把依赖找齐”,后来发现解决问题的正确姿势是:与其凭记忆去猜,不如在干净的同版本系统里,用yumdownloader --resolve一次性地把整个依赖树拉下来。这个思路不仅适用于MySQL,装Nginx、装Python、装各种中间件都可以复用。

还有一个细节值得提一下:如果无网服务器上以后还要部署别的软件,建议把下载好的所有rpm统一放到一个固定目录里,用createrepo做成本地源,以后不管装什么都能直接yum安装,别用完就删。整套流程跑顺以后,从解压rpm包到MySQL能正常被远程连接,我控制在10分钟以内。希望这份实战记录能帮你避开我之前踩过的坑,先把这套流程跑通,后续维护会省心很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 1:34:16

Flutter在OpenHarmony中优化动作表性能与跨设备适配

1. 项目背景与价值解析在OpenHarmony生态中实现流畅的交互组件一直是个技术难点。传统Native开发方式需要针对不同设备类型重复编写UI代码,而Flutter的跨平台特性恰好能弥补这一短板。这次我们选择"动作表"(ActionSheet)作为切入点…

作者头像 李华
网站建设 2026/9/18 1:33:08

企业档案管理数字化转型:痛点解析与解决方案

1. 档案管理数字化转型的痛点与机遇在各类企事业单位的日常运营中,跨部门档案调阅是再常见不过的基础需求。我曾在一家大型制造企业的档案室工作过三年,最常听到的抱怨就是:"这批生产档案怎么还没调过来?""上周申请…

作者头像 李华
网站建设 2026/9/18 1:30:45

数据中心交换芯片学习笔记:架构、表项、缓存调度与故障排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 1:30:12

DomainBed实战:ColoredMNIST与DomainNet数据集加载及实验复现指南

做领域泛化的同学,几乎没有绕开过DomainBed这个基准库。它把ColoredMNIST这类玩具级数据集和DomainNet这种大规模真实分布数据集全部收进来,给一堆“论文里说有效”的算法提供同一套评测协议。我最早接触DomainBed是想对比几个域泛化算法的基线&#xff…

作者头像 李华
网站建设 2026/9/18 1:29:05

CMake find_package 两种模式、搜索路径与导出包实战

第一次在别人的工程里翻到find_package(OpenCV REQUIRED)这行代码时,我盯着它看了足足两分钟——没有include_directories,没有link_directories,没有任何硬编码路径,一行就搞定了整个第三方库的引入。那会儿我刚从手写 Makefile …

作者头像 李华
网站建设 2026/9/18 1:29:01

Altium Designer快捷键肌肉记忆训练法

1. 为什么Altium Designer的快捷键不是“背下来就行”,而是必须重构操作肌肉记忆?Altium Designer的快捷键,从来就不是一份贴在显示器边上的“速查表”那么简单。我带过二十多个硬件工程师新人,几乎所有人第一周都在反复翻文档、点…

作者头像 李华