2026/10/3 14:36:46

MySQL 8在RockyLinux 8上的rpm离线安装全流程详解

MySQL 8在RockyLinux 8上的rpm离线安装全流程详解 1. 离线方案选型为什么我建议rpm包而不是tar包或docker1.1 三种离线安装方式的真实对比遇到内网隔离或者完全物理隔离的环境要装MySQL 8我见过三种主流做法先说结论在RockyLinux 8这一类Red Hat系系统上rpm包离线安装是最省心的。第一种做法是用官方提供的rpm包。你在有网络的机器上从MySQL官方源或国内镜像把mysql-community-server、client、common、libs这一整套rpm包下载下来顺便把libaio、ncurses-libs这类依赖也一起收齐然后通过U盘或内网共享目录传到目标机器用rpm命令安装。整个过程跟Red Hat系Linux的包管理哲学高度一致文件路径、服务脚本、systemd配置、默认数据目录全都由包管理器安排得明明白白。出了问题想卸载rpm -e就干干净净。第二种做法是用tar包也就是mysql-8.0.x-linux-glibc2.28-x86_64.tar.xz这种二进制包。它的优点是一个文件就带全了但代价是你必须自己创建mysql用户、自己把可执行文件路径加进PATH、自己写/etc/my.cnf、自己准备systemd服务文件。MySQL 8的tar包解压出来并不带systemd unit这意味着开机自启还得额外写脚本。而且tar包对glibc版本有硬性要求老系统上经常出现解压了跑不起来的尴尬。我记得早年装MySQL 5.7的时候图省事用过tar包结果被手动配置折腾得够呛8.0时代的tar包更不适合新手。第三种做法是docker离线镜像。有网机器上docker pull mysql:8.0然后docker save成tar到内网机器docker load。这种方式在容器化基础好的公司里很常见但它要求目标机器上本来就有一套能用的容器运行时和镜像管理流程。如果只是为了装个数据库而特意引入docker那运维成本不降反升镜像体积也比rpm包大很多在严格的隔离环境里传递效率并不高。所以我的建议很直接纯数据库场景首选rpm包离线安装。Rocky Linux 8作为RHEL 8的兼容发行版用el8系列rpm包几乎不会遇到兼容性问题。1.2 rpm包离线安装的整体思路整个流程我习惯拆成四个阶段准备、上传、安装、配置。准备阶段要做的事确认目标机器的系统版本和CPU架构在有网络的机器上把需要的rpm包和依赖全部下载好把这些rpm打包成一个压缩文件或者直接拷进U盘。上传阶段把包传到目标机器。完全物理隔离就用U盘有内网就用scp或rsync。我通常会在目标机器上建一个专门的目录比如/opt/mysql-rpm所有rpm都放这里一方面是方便后续核对另一方面是安装时一条命令直接处理整个目录。安装阶段用rpm -ivh把核心包装进去然后执行mysqld --initialize初始化数据目录再通过systemctl start mysqld启动服务。配置阶段改root密码、建业务账号、调整bind-address、放通防火墙、设置开机自启、按机器规格调内存参数。这四个阶段的坑主要集中在第一阶段没把依赖收齐以及第三阶段没按顺序装。我在后面会逐个拆开讲你照着做基本能一次过。2. 动手前的准备版本选择、架构确认与依赖收集2.1 检查目标机器的系统状态拿到离线机器先别急着传包先确认三件事系统版本、CPU架构、有没有残留的数据库相关软件包。cat /etc/redhat-release uname -m rpm -qa | grep -E mysql|mariadb第一行看系统是不是Rocky Linux 8.x8.6到8.10用同一套el8的rpm包都没问题第二行看架构常见x86_64如果输出是aarch64那下载rpm包时就要选aarch64版本千万别拿x86_64的包硬塞第三行检查有没有已经存在的mysql、mariadb包Rocky Linux 8默认软件源里自带mariadb模块很多最小化安装没有但如果你之前装过别的数据库组件这里一定要看清楚。特别提醒如果你系统里装了mariadb-libs安装mysql-community-libs时会报文件冲突因为两个包抢的都是/usr/lib64/libmysqlclient.so系列路径。处理办法是先把mariadb-libs卸掉再装MySQL。卸载前最好确认一下有哪些组件依赖它用rpm -e正常卸载看提示即可不用一上来就--nodeps。2.2 在有网机器上收集MySQL 8的rpm包这一步是整个离线安装最容易被低估的环节。很多人到了内网才开始找包最后发现连下载源都没有那才是真抓瞎。所以必须提前在有网机器上准备好。最推荐的方式是用yumdownloader自动解析依赖。找一台同样是Rocky Linux 8或者CentOS 8的有网机器然后执行yum install -y yum-utils rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm yumdownloader --destdir/opt/mysql-rpm --resolve mysql-community-server这里--resolve是关键它会自动把mysql-community-client、client-plugins、common、libs、icu-data-files等所有被依赖的rpm全部下载到/opt/mysql-rpm目录省去你手动找依赖的麻烦。下载完看一眼目录ls -lh /opt/mysql-rpm/正常情况下你至少会看到这6个包RPM包作用mysql-community-server服务端主体mysql-community-client命令行客户端mysql-community-client-plugins认证插件等mysql-community-common公共配置和文档mysql-community-libs客户端共享库mysql-community-icu-data-filesICU排序规则数据如果走不了MySQL官方源国内镜像站也有对应仓库先把镜像站提供的mysql80-community-release-el8包装好再执行同样的yumdownloader流程效果一样。2.3 常见依赖libaio、ncurses等怎么补即使有了mysql-community的rpm包少了一系统基础库依然装不上。MySQL 8在安装和运行阶段依赖的底层库主要有这些依赖用途漏了会怎样libaio异步I/Omysqld装完启动直接失败ncurses-libs终端交互mysql命令行客户端异常opensslTLS/加密初始化报错numactl-libsNUMA内存策略多核机器启动警告perl辅助脚本部分工具无法使用用yumdownloader --resolve的好处就是它会把这一层依赖也一起拉下来所以只要你在有网机器上执行了上面的命令/opt/mysql-rpm里大概率已经包含了libaio、ncurses-libs等rpm。如果仍然缺就再执行一次yumdownloader --destdir/opt/mysql-rpm --resolve libaio ncurses-libs再补充一个我个人的建议下载完所有rpm后顺手生成一份校验文件cd /opt/mysql-rpm sha256sum *.rpm sha256sums.txt把这行记录跟你U盘里的文件一起带到内网装之前先校验一遍防止U盘拷贝导致文件损坏。这个习惯在长期离线维护环境里非常实用别偷懒。3. 正式安装从上传rpm到数据库初始化3.1 上传并解压rpm包或者直接放目录目标机器上建好目录mkdir -p /opt/mysql-rpm如果是U盘先挂载再拷贝。U盘通常被识别为/dev/sdb1或/dev/sdc1你可以用lsblk确认设备名lsblk mount /dev/sdb1 /mnt cp /mnt/*.rpm /opt/mysql-rpm/ umount /mnt如果是把rpm打成了tar.gz带进来的就解压到目标目录mkdir -p /opt/mysql-rpm tar -xzf mysql-rpm-packages.tar.gz -C /opt/mysql-rpm/拷贝完成后我建议立刻做个完整性校验cd /opt/mysql-rpm sha256sum -c sha256sums.txt看到每个文件后面都是OK说明拷贝过程中没有损坏。这一步看着浪费时间但我真遇到过因为U盘快坏了导致rpm包拷贝后大小不对、安装到一半报错的情况排查起来相当费劲。3.2 rpm -ivh安装顺序与冲突处理进到rpm目录建议一条命令把核心包全部装完cd /opt/mysql-rpm rpm -ivh mysql-community-common-*.rpm mysql-community-client-plugins-*.rpm mysql-community-libs-*.rpm mysql-community-icu-data-files-*.rpm mysql-community-client-*.rpm mysql-community-server-*.rpm理论上rpm会在同一条命令里自动解决包与包之间的依赖所以顺序影响不大。但如果你是一次一次分开装就必须遵循common - libs - client - server的顺序先装server会直接告诉你缺少mysql-community-libs。如果安装时报文件冲突大概率是残留的mariadb-libs在作祟file /usr/lib64/libmysqlclient.so.21 from install of mysql-community-libs conflicts with file from package mariadb-libs-...处理方式rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs这里用--nodeps是合理的因为mysql-community-libs会提供兼容的库文件把mariadb-libs删掉后被依赖的功能由MySQL自己顶上。卸完后再重跑上面的rpm -ivh命令。装完之后验证一下rpm -qa | grep mysql mysql --version看到mysql Ver 8.0.x for Linux on x86_64的输出说明客户端已经就位。3.3 初始化数据目录与启动服务安装完成后mysqld还不能直接启动必须先做数据目录初始化mysqld --initialize --usermysql这一步会在/var/lib/mysql下生成MySQL系统库和权限表同时生成root的临时密码并把它写入/var/log/mysqld.log。这一步千万不能省网上很多教程让你直接启动服务那个其实是旧版本不同流程的误导MySQL 8.0必须显式初始化。初始化完成后启动服务systemctl start mysqld systemctl status mysqld如果看到active (running)说明服务已经起来了。这一步卡住的话百分之八十的情况出在权限或日志tail -100 /var/log/mysqld.log比如[ERROR] Could not open required defaults file是my.cnf路径问题[ERROR] Cant find error-messages file通常是icu-data-files没装上还有SELinux拦截造成的权限类报错。SELinux的问题可以先临时关闭测试setenforce 0 systemctl restart mysqld如果确认是SELinux导致的再针对mysqld放通规则而不是长期把SELinux关着。生产环境我一般会把SELinux开着只对mysqld做定向放通。4. 安装后的配置密码、远程连接、自启动与关键参数4.1 用临时密码登录并修改root密码启动成功后第一件事是从日志里拿root临时密码grep temporary password /var/log/mysqld.log输出大概是这样的2024-XX-XXT10:12:33.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for rootlocalhost: k!Dq7x2#PzR冒号后面的k!Dq7x2#PzR就是临时密码。登录mysql -uroot -p登录后立刻执行ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass123!;这里要注意MySQL 8的默认密码策略validate_password要求密码至少8位且包含大小写字母、数字和特殊字符。如果你用太简单的密码会看到ERROR 1819 (HY000): Your password does not satisfy the current policy requirements非生产环境图省事的话可以降低策略SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;但这只是临时降低重启后如果没写进配置文件又会恢复默认。生产环境我强烈建议保持强密码策略root密码只给DBA自己保管业务账号单独创建。4.2 创建业务账号并放通远程连接生产环境没人会用root让业务连。建一个业务账号比如appuserCREATE USER appuser% IDENTIFIED BY AppUserPass123!; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;如果这台库只服务一个业务把*.*换成具体的库名更稳妥比如ORDER_DB.*权限最小化原则在数据库这层很重要。默认情况下mysqld只监听127.0.0.1外部主机连不上。编辑/etc/my.cnf在[mysqld]段里加上[mysqld] bind-address 0.0.0.0 mysqlx OFF这里的mysqlx应该设成OFFMySQL 8默认开了33060端口的X Protocol业务不用它的话关掉能少暴露一个端口。改完重启systemctl restart mysqld然后先本地确认监听ss -lntp | grep 3306输出里应该看到0.0.0.0:3306。放通防火墙firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload云服务器的话还要检查安全组规则。之后用另一台机器试连mysql -h目标IP -uappuser -p如果这步通了远程访问就搞定了。整个远程连接排错的优先级是防火墙/安全组 - bind-address - 账号授权 - 认证插件按这个顺序查基本不会走弯路。4.3 设置开机自启动并用systemd管理MySQL 8的rpm包自带systemd单元文件注册开机自启就一行systemctl enable mysqld systemctl is-enabled mysqld日常服务管理统一走systemdsystemctl start mysqld systemctl stop mysqld systemctl restart mysqld systemctl status mysqld日志方面MySQL 8默认把错误日志写到/var/log/mysqld.log。长时间运行后这个文件会变大我建议在/etc/logrotate.d/mysql里配置日志轮转。一个简单的策略是每天轮转、保留7份、压缩归档。这样磁盘空间不会被日志消耗掉。4.4 顺手调整的字符集与内存参数MySQL 8默认字符集是utf8mb4其实不用改。但如果你用的是旧业务的连接串或者历史库是latin1最好在my.cnf里显式声明[mysqld] character-set-server utf8mb4 collation-server utf8mb4_general_ci [client] default-character-set utf8mb4内存方面如果你目标机器是2核4G这种小规格默认的innodb_buffer_pool_size虽然只有128M左右但加上连接线程、排序缓冲等整体内存占用还是会偏大。可以根据机器规格给innodb_buffer_pool_size一个合理的值比如4G内存的机器给512M8G内存的机器给1G左右。改完重启生效。我还会顺手把performance_schema的开关看一眼不需要它但又想省内存的话可以加一行performance_schema OFF不过要注意关掉performance_schema会丢失一部分性能诊断能力生产环境建议保持开启。5. 常见问题排查与避坑实录5.1 依赖缺失libaio、perl、ncurses报错离线安装最大的敌人就是依赖缺失。最常见的报错是error: Failed dependencies: libaio.so.1()(64bit) is needed by mysql-community-server-8.0.xx-1.el8.x86_64这说明你少带了libaio。同理还有libncurses.so.6、perl(Data::Dumper)这些。解决办法跟前面说的一样回到有网机器上yumdownloader下载对应依赖再传进内网补装。这里有个细节如果你是在有网机器上离线下载了全部rpm但到了内网还是报缺依赖先检查一下你是不是把el8的包装到了Rocky Linux 9上面。版本错配在离线环境里特别容易发生因为没有人拦着你rpm不会主动提醒你系统版本不对只有到了运行阶段才会各种诡异报错。所以下载包之前用cat /etc/redhat-release确认清楚。5.2 初始化失败或数据目录权限问题mysqld --initialize出现[ERROR] Failed to create directory /var/lib/mysql是典型的数据目录权限问题修复mkdir -p /var/lib/mysql chown mysql:mysql /var/lib/mysql chmod 750 /var/lib/mysql还有一种很隐蔽的情况/var/lib/mysql目录里已经有了旧数据文件比如之前装过别的版本初始化会拒绝执行或者启动时报[ERROR] Aborting。这时候先备份旧目录再清掉或者指定一个新的datadir路径。我习惯把数据目录放到单独的数据盘上比如/data/mysql这样重装系统数据还在而且不会跟系统盘抢空间。用了自定义datadir的话my.cnf里要写清楚[mysqld] datadir /data/mysql初始化之前确保这个目录的属主是mysqlmkdir -p /data/mysql chown mysql:mysql /data/mysql另外别忘了日志文件本身也可能出问题。如果/var/log/mysqld.log不存在有些版本启动会报错直接touch一个并把属主改成mysql就可以。5.3 远程连不上防火墙、bind-address、认证插件远程连接失败我帮人排查过很多次按顺序来本机先连mysql -uroot -p -h127.0.0.1本机不通问题在mysqld本身查日志。查监听ss -lntp | grep 3306如果没有0.0.0.0:3306说明bind-address没配好或者没重启。查防火墙firewall-cmd --list-ports没有3306就放通。查授权确认业务账号是user%不是userlocalhost。查认证插件如果是很老的客户端连不上报Authentication plugin caching_sha2_password cannot be loaded需要把账号改回mysql_native_passwordALTER USER appuser% IDENTIFIED WITH mysql_native_password BY AppUserPass123!;这个做法适合旧版客户端兼容场景但新项目就不要降级了caching_sha2_password的安全性更高官方默认就是它。还有一个经常被忽略的是selinux。把selinux开着但没放通mysqld的网络访问外部连接会一直卡在拒绝状态。放通方式setsebool -P mysqld_connect_any 1或者干脆针对3306端口配置semanage规则。排查的时候用setenforce 0先临时关掉做测试确认是它的问题再定向放通。5.4 离线环境下的升级与日常维护离线装完不等于一劳永逸。MySQL小版本升级的原理跟安装一模一样带着新版本的rpm包进来按common、libs、client、server的顺序rpm -Uvh然后重启服务。8.0.16之后的版本重启后会自动执行升级检查你基本不用操心。日常维护我总结几个建议都是实战里踩过的备份最朴素可靠的备份就是冷备数据目录tar -czf mysql_datadir_$(date %F).tar.gz /var/lib/mysql。如果你的数据量大可以用mysqldump逻辑备份或者上XtraBackup物理备份但离线环境里我更推荐保持数据目录的冷备定期mysqldump双保险。监控最便宜的监控是定时脚本看磁盘和端口磁盘撑满对数据库是致命打击。binlog如果不保留太多可以设置自动过期[mysqld] binlog_expire_logs_seconds 604800这样binlog只保留7天一定程度上避免磁盘被日志撑爆。变更纪律离线环境运维手段少任何变更前先备份任何rpm包升级前先看依赖。不要因为内网环境就放松警惕内网库出问题往往比公网库更难救。我在实际项目中还发现一个经验把整个rpm目录和一份详细的安装手册放在同一块U盘里贴好标签归档。每次去现场部署或者别人接手的时候拿起来就能用。这种看似不起眼的习惯能省下大量后期排查时间。说实话MySQL 8在RockyLinux 8上的离线安装难度不在操作本身而在于准备工作的细致程度。我第一次给别人做离线部署的时候就是因为在有网机器上少拉了一个libaio到了现场rpm安装直接中断又没法上网最后是借了另一台机器重新打包才完成的。从那次以后我每次都会在下完包之后用sha256校验、把依赖清单打印出来、顺手再收集几个常用工具rpm比如vim、lrzsz、curl避免到了现场连传文件工具都没有的尴尬。如果你也在准备离线的MySQL部署我的建议是先花半小时把rpm包和依赖收齐、校验再进场。前期准备做得越充分现场就越顺畅。这个流程同样适用于其他需要离线安装的rpm软件一次掌握处处能用。