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

📅 发布时间:2026/9/18 1:34:27
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-toolsifconfig查端口用、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.rpmmysql-community-libs-8.0.36-1.el7.x86_64.rpmmysql-community-client-8.0.36-1.el7.x86_64.rpmmysql-community-server-8.0.36-1.el7.x86_64.rpmmysql-community-client-plugins-8.0.36-1.el7.x86_64.rpmmysql-community-icu-data-files-8.0.36-1.el7.x86_64.rpmmysql-community-libs-compat-8.0.36-1.el7.x86_64.rpm这几个包之间存在依赖关系最好用yum localinstall一条命令让yum自动解依赖前提是你已经把依赖rpm也放到了同一目录yum localinstall -y /tmp/mysql-offline/*.rpmyum 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会依赖libslibs又依赖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] port3306 character_set_serverutf8mb4 collation_serverutf8mb4_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_connections500有几个参数值得展开说一下。character_set_serverutf8mb4是现在主流的字符集选择能完整支持中文和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 --usermysql --datadir/data/mysql这里有几个容易踩的坑。第一--initialize参数在root用户下执行时命令行里必须带--usermysql否则初始化会报错或者生成的文件属主不对。第二如果datadir指向的目录不为空初始化会直接报错所以要么用全新的空目录要么先把目录清理干净。第三初始化过程不会在终端打印任何密码临时密码会记录到错误日志中。对于自定义的log-error路径查看方式就是grep temporary password /data/mysql/mysql-error.log日志里会有一行“A temporary password is generated for rootlocalhost: 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 rootlocalhost IDENTIFIED BY NewStrongPass123;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 AppUserPass123; GRANT ALL PRIVILEGES ON *.* TO appuser% WITH GRANT OPTION; FLUSH PRIVILEGES;这里%代表允许任意主机访问如果只想让某个应用服务器连就写成具体的IP例如user192.168.1.100。另外MySQL 8.0默认的认证插件是caching_sha2_password较老版本的Navicat或驱动可能不兼容连接时会报“Authentication plugin caching_sha2_password cannot be loaded”。这种情况下要么升级客户端工具版本要么把这个账号的认证方式改成mysql_native_passwordALTER USER appuser% IDENTIFIED WITH mysql_native_password BY AppUserPass123;我建议优先考虑升级客户端因为mysql_native_password是旧的认证方式安全性和性能都不如默认插件。如果实在没法升级客户端再退而求其次用旧插件但内部系统还是应该把安全性和长远维护放在第一位。4. 避坑合集安装过程中最常见的几个坎4.1 依赖缺失导致的安装失败无网安装最怕的就是“缺这个缺那个”。我在实际部署里遇到的依赖报错按出现的频率排序大概是这几类libaio缺失这是MySQL 8.0启动阶段最常见的错误报错位置通常在错误日志或者启动的时候表现为“/usr/sbin/mysqld: error while loading shared libraries: libaio.so.1”。缺少libncurses.so.5CentOS 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 userroot AND hostlocalhost; 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 --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload firewall-cmd --list-ports如果企业环境中还有更上层的防火墙或者安全组也要同步放行否则服务端全配置好了路由不通照样白搭。第三检查账号的host限制。MySQL的账号权限是按“用户来源主机”匹配的如果你用rootlocalhost去连即使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分钟以内。希望这份实战记录能帮你避开我之前踩过的坑先把这套流程跑通后续维护会省心很多。