三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

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

麒麟系统离线静默部署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”

在动手之前,我们必须先理解麒麟V10(ky10)的软件源特性。它通常兼容CentOS 8或Anolis OS的部分生态,但直接使用CentOS 7的MySQL 5.7 RPM包可能会因为glibc、openssl等核心库版本不匹配而失败。我们的目标是MySQL 5.7.43,这个版本在Oracle官方或主流社区仓库中可能不是默认版本,因此“离线安装”的第一步,其实是“在线准备”。

2.1 搭建离线仓库的“跳板机”选择与配置

你需要找一台能够连接互联网、且操作系统和架构与目标内网机器完全一致的服务器作为跳板机。这一点至关重要。架构一致(都是x86_64)避免了二进制兼容性问题,系统版本一致(同样是ky10.x86_64)则保证了基础依赖库(如glibcopensslncurses)的版本完全匹配。我是在一台测试环境的麒麟V10虚拟机上操作的。

首先,在跳板机上,我们需要安装yum-utilscreaterepo这两个工具,它们能帮助我们下载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仓库

所有包下载完毕后,我们需要让它们变成一个可以被yumdnf命令识别的本地仓库。

# 仍在/opt/mysql-offline-packages目录下 sudo createrepo .

这个命令会在当前目录生成一个repodata文件夹,里面包含了仓库的元数据。至此,离线安装包仓库就制作完成了。接下来,你需要将这个/opt/mysql-offline-packages目录完整地打包,传输到内网的目标服务器上。可以使用tarscp(通过中转机)或U盘拷贝。

# 在跳板机上打包 tar -czf mysql-offline-repo.tar.gz -C /opt mysql-offline-packages

3. 目标服务器离线部署实战

现在,我们转移到内网的目标麒麟服务器上。假设你已经把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] name=Local MySQL 5.7.43 Repository baseurl=file:///opt/mysql-offline-packages enabled=1 gpgcheck=0

这里gpgcheck=0表示跳过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社区版在安装时,不会像一些软件那样直接读取一个应答文件。它的“静默”需要分两步走:

  1. 静默安装RPM包(无任何交互)。
  2. 静默完成初始化配置。

第一步:安装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_password=OFF # 设置默认身份认证插件为mysql_native_password,兼容性更好 default_authentication_plugin=mysql_native_password

然后,在服务启动前,我们使用mysqld --initialize命令进行初始化,并指定root密码。但更常见的静默做法是,先让系统生成随机密码,再用脚本自动修改它。这里介绍一种利用expect脚本或mysqladmin的方式,但前提是服务已启动。

一个更直接、完全无需交互的方法是:在初始化后,立即用一个SQL脚本修改密码。但初始化过程本身会生成一个.mysql_secret文件或把密码打印到日志里。为了真正静默,我们可以这样做:

  1. 启动MySQL服务,它会自动初始化并生成随机密码到日志中。
  2. grep从日志文件中提取这个随机密码。
  3. 用提取的密码连接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 'root'@'localhost' IDENTIFIED BY 'NewPassword123!'; FLUSH PRIVILEGES; EOF # 可选:运行mysql_secure_installation的等效命令,实现安全加固 mysql -uroot -p'NewPassword123!' <<EOF DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; FLUSH PRIVILEGES; EOF echo “MySQL 5.7.43 静默安装与初始化完成。”

重要安全提示:上述脚本中的密码NewPassword123!仅为示例。在实际生产环境中,必须使用高强度密码,并且建议通过外部加密的方式传入密码,而不是明文写在脚本里。可以将密码写入一个临时文件,设置严格的权限(如600),脚本读取后立即删除。

给脚本执行权限并运行:

chmod +x silent_init_mysql.sh sudo ./silent_init_mysql.sh

4. 避坑指南:麒麟系统特有问题与解决方案

在实际操作中,我遇到了几个麒麟系统上特有的问题,这里集中总结一下。

4.1 依赖包冲突与缺失库文件

即使使用了同版本跳板机下载的依赖包,在目标机上安装时仍可能报错,常见的有:

  • libcrypto.so.10libssl.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/mysql

4.3 防火墙与远程访问配置

安装完成后,默认只允许本地(localhost)连接。如果需要远程访问,需进行两步操作:

  1. 在MySQL中授权远程用户。
    mysql -uroot -p -- 创建一个允许从任何主机连接的root用户(极度不推荐生产环境使用) -- CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword!'; -- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -- 更安全的做法是创建专用用户并限制IP CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppUserPassword!'; GRANT SELECT, INSERT, UPDATE, DELETE ON your_database.* TO 'app_user'@'192.168.1.%'; FLUSH PRIVILEGES;
  2. 配置麒麟系统防火墙,开放3306端口。麒麟V10可能使用firewalld
    sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload
    如果系统使用的是iptables,则需要相应的iptables命令。

5. 安装验证与后续配置建议

完成上述所有步骤后,必须进行验证。

5.1 基础功能验证

  1. 服务状态检查
    sudo systemctl status mysqld
    确保状态为active (running)
  2. 登录测试
    mysql -uroot -p'YourNewPassword'
    能成功进入MySQL命令行即表示安装成功。
  3. 版本确认
    SELECT VERSION();
    输出应为5.7.43

5.2 性能与安全基线配置

静默安装只是第一步,要让MySQL在生产环境稳定运行,还需要调整一些关键参数。建议创建一个自定义配置文件/etc/my.cnf.d/custom.cnf。以下是一些针对中等负载的初始建议配置:

[mysqld] # 基础设置 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=INNODB # 连接与缓冲区 max_connections=500 connect_timeout=10 wait_timeout=600 interactive_timeout=600 # 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_log=ON slow_query_log_file=/var/log/mysql/slow-query.log long_query_time=2 log-error=/var/log/mysql/error.log # 安全相关 skip_name_resolve=ON # 禁用DNS反向解析,提升连接速度 local_infile=OFF # 禁止LOAD DATA LOCAL INFILE,提升安全

修改配置后,重启MySQL服务使配置生效:

sudo systemctl restart mysqld

5.3 制作可复用的离线安装包

如果你需要频繁在多台麒麟服务器上部署,可以将整个流程脚本化,并制作一个包含所有RPM包、配置文件和安装脚本的完整离线安装包。这个包应该包含:

  1. packages/:所有RPM依赖包。
  2. scripts/:安装脚本(如deploy.sh)、静默初始化脚本。
  3. configs/:预定义的my.cnf配置文件、local-mysql.repo文件。
  4. README.md:简明部署文档。

部署时,只需解压该包,运行一个主安装脚本即可。这真正实现了“一键离线静默安装”。

← 返回列表