资讯中心

麒麟系统离线静默部署MySQL 5.7.43:从依赖打包到一键安装

📅 2026/8/16 7:34:26
麒麟系统离线静默部署MySQL 5.7.43:从依赖打包到一键安装
1. 项目背景与核心挑战最近接手了一个项目需要在几十台国产麒麟系统服务器上部署一套内部管理系统数据库选型是MySQL 5.7.43。这个任务听起来简单但实际执行时遇到了几个非常典型的“国产化环境”难题第一所有服务器都处于严格的内网环境无法连接互联网进行在线安装或下载依赖包第二出于批量部署和自动化集成的需求安装过程必须是静默的不能有交互式配置界面第三目标系统是银河麒麟V10具体版本是4.19.90-24.4.v2101.ky10.x86_64一个基于Linux内核但有着自己软件生态的发行版直接使用CentOS或Ubuntu的通用方法很可能水土不服。如果你也面临类似场景——在无外网、需批量部署的麒麟系统上安装特定版本的MySQL那么这篇从踩坑到填坑的完整记录或许能帮你省下大量摸索时间。整个过程的核心就是解决“离线”和“静默”这两个关键词带来的连锁反应如何获取所有依赖包、如何绕过图形化安装向导、以及如何适配麒麟系统的特定环境。我最终采用的方案是通过一台同架构、同版本的有网“跳板机”预先下载好所有安装包制作成完整的离线安装仓库再通过编写静默应答文件来实现一键部署。下面我就把整个操作链路、遇到的坑以及验证有效的解决方案拆解清楚。2. 环境研判与准备工作为什么不能直接“yum install”在动手之前我们必须先理解麒麟V10ky10的软件源特性。它通常兼容CentOS 8或Anolis OS的部分生态但直接使用CentOS 7的MySQL 5.7 RPM包可能会因为glibc、openssl等核心库版本不匹配而失败。我们的目标是MySQL 5.7.43这个版本在Oracle官方或主流社区仓库中可能不是默认版本因此“离线安装”的第一步其实是“在线准备”。2.1 搭建离线仓库的“跳板机”选择与配置你需要找一台能够连接互联网、且操作系统和架构与目标内网机器完全一致的服务器作为跳板机。这一点至关重要。架构一致都是x86_64避免了二进制兼容性问题系统版本一致同样是ky10.x86_64则保证了基础依赖库如glibc、openssl、ncurses的版本完全匹配。我是在一台测试环境的麒麟V10虚拟机上操作的。首先在跳板机上我们需要安装yum-utils和createrepo这两个工具它们能帮助我们下载RPM包和创建本地仓库元数据。# 在跳板机上执行 sudo yum install -y yum-utils createrepo接下来为了一次性下载MySQL及其所有依赖我们需要在跳板机上临时添加包含MySQL 5.7.43的软件源。麒麟系统默认的源里可能没有这个精确版本。一个可靠的方法是添加MySQL官方的Yum仓库。去MySQL官网下载对应版本的mysql57-community-release包但更直接的方法是如果我们已经有一个MySQL 5.7.43的RPM包比如从其他渠道获得的基础包mysql-community-server-5.7.43-1.el7.x86_64.rpm可以用它来“诱捕”所有依赖。这里我采用了一个更通用的方法使用yumdownloader。我们先在跳板机上配置一个能访问到MySQL 5.7.43的在线Yum源例如Remi仓库或从其他兼容系统拷贝过来的repo文件然后执行下载。假设我们已经有了一个临时的mysql57.repo文件。# 创建一个目录存放所有下载的包 mkdir -p /opt/mysql-offline-packages cd /opt/mysql-offline-packages # 使用yumdownloader下载指定软件包及其所有依赖 # 这里以mysql-community-server为核心它会自动拉取client, common, libs等 sudo yumdownloader --resolve --destdir/opt/mysql-offline-packages mysql-community-server-5.7.43--resolve参数是关键它会解析并下载所有依赖的RPM包。执行后/opt/mysql-offline-packages目录下会有一堆.rpm文件。注意实际操作中你可能会发现无法直接下载到5.7.43这个精确版本。这时可以尝试下载mysql-community-server-5.7让yum选择该大版本下的最新版可能就是5.7.43或者从其他已经安装此版本的系统中通过rpm -qa | grep mysql找出完整的包名和版本再针对性下载。2.2 创建本地Yum仓库所有包下载完毕后我们需要让它们变成一个可以被yum或dnf命令识别的本地仓库。# 仍在/opt/mysql-offline-packages目录下 sudo createrepo .这个命令会在当前目录生成一个repodata文件夹里面包含了仓库的元数据。至此离线安装包仓库就制作完成了。接下来你需要将这个/opt/mysql-offline-packages目录完整地打包传输到内网的目标服务器上。可以使用tar、scp通过中转机或U盘拷贝。# 在跳板机上打包 tar -czf mysql-offline-repo.tar.gz -C /opt mysql-offline-packages3. 目标服务器离线部署实战现在我们转移到内网的目标麒麟服务器上。假设你已经把mysql-offline-repo.tar.gz上传到了/tmp目录。3.1 部署本地仓库文件首先解压并移动仓库文件到合适的位置通常选择/etc/yum.repos.d/来配置本地源但更规范的做法是放在/opt或/var下然后创建一个新的repo文件指向它。# 解压离线包 sudo tar -xzf /tmp/mysql-offline-repo.tar.gz -C /opt # 创建本地仓库配置文件 sudo vi /etc/yum.repos.d/local-mysql.repo在local-mysql.repo文件中写入以下内容[local-mysql-5.7] nameLocal MySQL 5.7.43 Repository baseurlfile:///opt/mysql-offline-packages enabled1 gpgcheck0这里gpgcheck0表示跳过GPG签名检查因为本地包通常没有签名。在生产环境中如果包来源可信可以保持为0以简化流程如果注重安全需要预先导入GPG密钥。保存后清除yum缓存并验证仓库是否生效sudo yum clean all sudo yum makecache sudo yum repolist enabled | grep local-mysql如果能看到local-mysql-5.7仓库及其包数量说明本地仓库配置成功。3.2 执行静默安装与关键参数预设静默安装的核心是让安装过程自动回答所有交互式问题。对于通过RPM包安装的MySQL其初始化配置如设置root密码、删除匿名用户等通常是在安装后通过mysql_secure_installation脚本交互完成的。要实现完全静默我们需要在安装RPM包之前就预设好这些配置。MySQL 5.7社区版在安装时不会像一些软件那样直接读取一个应答文件。它的“静默”需要分两步走静默安装RPM包无任何交互。静默完成初始化配置。第一步安装RPM包。这步本身是静默的。sudo yum install -y mysql-community-server-y参数自动确认安装。这条命令会从我们刚配置好的本地仓库中安装mysql-community-server及其所有依赖。第二步静默初始化。这是关键。MySQL 5.7在首次启动服务前数据目录是空的。启动mysqld服务时如果发现数据目录为空它会自动执行初始化在日志中生成一个临时root密码。但我们可以通过一个配置文件来预设root密码避免使用随机密码。创建一个MySQL的配置文件/etc/my.cnf.d/init.cnf确保不与现有配置冲突在[mysqld]段落后添加[mysqld] # 跳过密码强度验证插件方便预设简单密码仅用于初始化生产环境应移除 validate_passwordOFF # 设置默认身份认证插件为mysql_native_password兼容性更好 default_authentication_pluginmysql_native_password然后在服务启动前我们使用mysqld --initialize命令进行初始化并指定root密码。但更常见的静默做法是先让系统生成随机密码再用脚本自动修改它。这里介绍一种利用expect脚本或mysqladmin的方式但前提是服务已启动。一个更直接、完全无需交互的方法是在初始化后立即用一个SQL脚本修改密码。但初始化过程本身会生成一个.mysql_secret文件或把密码打印到日志里。为了真正静默我们可以这样做启动MySQL服务它会自动初始化并生成随机密码到日志中。用grep从日志文件中提取这个随机密码。用提取的密码连接MySQL并执行修改root密码的SQL。我们可以把这几步写成一个Shell脚本。但需要注意的是在麒麟系统上MySQL的日志路径可能是/var/log/mysqld.log。下面是一个示例脚本silent_init_mysql.sh#!/bin/bash # 启动mysqld服务 sudo systemctl start mysqld # 等待服务完全启动 sleep 10 # 从日志中提取临时root密码注意麒麟系统可能日志格式略有不同 TEMP_PASSWORD$(sudo grep temporary password /var/log/mysqld.log | awk {print $NF}) # 使用临时密码登录并立即修改root密码为‘NewPassword123!’请务必更改 mysql -uroot -p${TEMP_PASSWORD} --connect-expired-password EOF ALTER USER rootlocalhost IDENTIFIED BY NewPassword123!; FLUSH PRIVILEGES; EOF # 可选运行mysql_secure_installation的等效命令实现安全加固 mysql -uroot -pNewPassword123! EOF DELETE FROM mysql.user WHERE User; DELETE FROM mysql.user WHERE Userroot AND Host NOT IN (localhost, 127.0.0.1, ::1); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Dbtest OR Dbtest\\_%; FLUSH PRIVILEGES; EOF echo “MySQL 5.7.43 静默安装与初始化完成。”重要安全提示上述脚本中的密码NewPassword123!仅为示例。在实际生产环境中必须使用高强度密码并且建议通过外部加密的方式传入密码而不是明文写在脚本里。可以将密码写入一个临时文件设置严格的权限如600脚本读取后立即删除。给脚本执行权限并运行chmod x silent_init_mysql.sh sudo ./silent_init_mysql.sh4. 避坑指南麒麟系统特有问题与解决方案在实际操作中我遇到了几个麒麟系统上特有的问题这里集中总结一下。4.1 依赖包冲突与缺失库文件即使使用了同版本跳板机下载的依赖包在目标机上安装时仍可能报错常见的有libcrypto.so.10或libssl.so.10找不到这是因为MySQL 5.7依赖的OpenSSL版本与麒麟系统自带的可能不一致。麒麟V10可能自带的是OpenSSL 1.1.1而MySQL 5.7 RPM包可能依赖1.0.2。解决方案在下载离线包时确保跳板机系统已安装与目标机完全一致的OpenSSL版本。或者从MySQL官网下载基于el7对应RHEL/CentOS 7的RPM包其OpenSSL依赖版本较低可能需要在离线包中额外包含这些兼容库的RPM并手动强制安装rpm -ivh --nodeps需谨慎使用。与系统自带mariadb-libs冲突麒麟系统可能预装了MariaDB的客户端库。在安装MySQL前需要先移除它。sudo yum remove -y mariadb-libs但在离线环境下yum remove可能会因为依赖关系而失败。如果遇到可以尝试使用rpm -e --nodeps mariadb-libs强制移除但要清楚这可能会影响其他依赖它的软件通常很少。4.2 服务管理命令与SELinux麒麟系统使用systemctl管理服务与主流Linux发行版一致。安装完成后需要设置开机自启sudo systemctl enable mysqld有时启动服务会失败查看状态systemctl status mysqld发现是权限问题。这很可能与SELinux有关。麒麟系统默认可能开启SELinux。对于内部环境如果安全策略允许可以临时将其设置为宽容模式以测试是否是SELinux导致的sudo setenforce 0如果问题解决则需要为MySQL的数据目录和日志目录添加正确的SELinux文件上下文或者永久关闭SELinux不推荐用于生产。添加上下文命令示例sudo semanage fcontext -a -t mysqld_db_t /var/lib/mysql(/.*)? sudo restorecon -Rv /var/lib/mysql4.3 防火墙与远程访问配置安装完成后默认只允许本地localhost连接。如果需要远程访问需进行两步操作在MySQL中授权远程用户。mysql -uroot -p -- 创建一个允许从任何主机连接的root用户极度不推荐生产环境使用 -- CREATE USER root% IDENTIFIED BY YourStrongPassword!; -- GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; -- 更安全的做法是创建专用用户并限制IP CREATE USER app_user192.168.1.% IDENTIFIED BY AppUserPassword!; GRANT SELECT, INSERT, UPDATE, DELETE ON your_database.* TO app_user192.168.1.%; FLUSH PRIVILEGES;配置麒麟系统防火墙开放3306端口。麒麟V10可能使用firewalld。sudo firewall-cmd --permanent --add-port3306/tcp sudo firewall-cmd --reload如果系统使用的是iptables则需要相应的iptables命令。5. 安装验证与后续配置建议完成上述所有步骤后必须进行验证。5.1 基础功能验证服务状态检查sudo systemctl status mysqld确保状态为active (running)。登录测试mysql -uroot -pYourNewPassword能成功进入MySQL命令行即表示安装成功。版本确认SELECT VERSION();输出应为5.7.43。5.2 性能与安全基线配置静默安装只是第一步要让MySQL在生产环境稳定运行还需要调整一些关键参数。建议创建一个自定义配置文件/etc/my.cnf.d/custom.cnf。以下是一些针对中等负载的初始建议配置[mysqld] # 基础设置 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineINNODB # 连接与缓冲区 max_connections500 connect_timeout10 wait_timeout600 interactive_timeout600 # InnoDB配置 innodb_buffer_pool_size 1G # 根据物理内存调整通常为内存的50%-70% innodb_log_file_size 256M innodb_flush_log_at_trx_commit 2 # 平衡性能与持久性1为最安全但最慢 innodb_flush_method O_DIRECT # 日志 slow_query_logON slow_query_log_file/var/log/mysql/slow-query.log long_query_time2 log-error/var/log/mysql/error.log # 安全相关 skip_name_resolveON # 禁用DNS反向解析提升连接速度 local_infileOFF # 禁止LOAD DATA LOCAL INFILE提升安全修改配置后重启MySQL服务使配置生效sudo systemctl restart mysqld5.3 制作可复用的离线安装包如果你需要频繁在多台麒麟服务器上部署可以将整个流程脚本化并制作一个包含所有RPM包、配置文件和安装脚本的完整离线安装包。这个包应该包含packages/所有RPM依赖包。scripts/安装脚本如deploy.sh、静默初始化脚本。configs/预定义的my.cnf配置文件、local-mysql.repo文件。README.md简明部署文档。部署时只需解压该包运行一个主安装脚本即可。这真正实现了“一键离线静默安装”。