麒麟系统离线静默安装MySQL 5.7.43全攻略

📅 2026/8/16 8:50:33
麒麟系统离线静默安装MySQL 5.7.43全攻略
1. 项目概述与核心需求解析最近在给一个部署在国产麒麟系统上的内部业务系统做数据库升级客户现场环境是严格的内网隔离服务器连不上外网系统版本是银河麒麟V10具体是4.19.90-24.4.v2101.ky10.x86_64。需求很明确要在完全离线的状态下静默安装MySQL 5.7.43。所谓“静默安装”就是不需要交互式地敲一堆配置最好一条命令或者一个脚本就能搞定这对于批量部署或者自动化运维来说太重要了。这个需求听起来简单但在国产化环境和离线场景下踩的坑一个都不会少。麒麟系统虽然基于Linux但它的软件源、库依赖和常见的CentOS、Ubuntu还是有些区别直接照搬网上的教程大概率会报各种依赖错误。而且MySQL 5.7.43这个版本也不算太新官方提供的通用二进制包或RPM包在麒麟系统上可能会因为glibc等基础库版本问题而无法运行。所以整个方案的核心思路就变成了如何在离线环境下为特定的麒麟系统版本准备一个完整、兼容的MySQL安装包集合并通过静默方式一键部署。这不仅仅是执行rpm -ivh或者make install那么简单。你需要提前解决所有依赖规划好数据目录、配置文件、服务管理以及安全初始化确保安装完后服务能正常启动并且符合基本的运维规范。接下来我就把这次从准备到落地的完整过程包括遇到的坑和解决方案详细拆解一遍。2. 离线安装方案设计与选型面对离线安装通常有几种路径编译安装、使用二进制包、或者制作离线RPM包。我们需要根据麒麟系统的特点做出选择。2.1 方案对比与决策编译安装源码安装优点最灵活可以针对当前系统的glibc、gcc版本进行编译理论上兼容性最好。缺点过程极其繁琐。首先需要离线环境下的完整编译工具链gcc, cmake, make等其次需要解决MySQL源码编译依赖的大量开发库如ncurses-devel,openssl-devel等。在离线环境下收集这些依赖本身就是个巨大工程且编译耗时很长不适合快速部署。结论除非对性能或特性有极端定制化需求否则在离线静默部署场景下首先排除。使用官方二进制TAR包Generic Linux优点MySQL官方提供了预编译好的mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz这类包解压即用相对简单。缺点这个“Generic”是针对大多数Linux发行版的。麒麟系统虽然也是Linux但其底层库文件可能与二进制包编译时所依赖的版本存在细微差异直接使用可能导致运行时链接错误。此外二进制包不包含系统服务文件需要手动编写systemd或SysVinit脚本静默安装的自动化程度打折扣。使用RPM包或制作离线YUM仓库优点RPM包能自动处理依赖关系虽然离线时仍需手动解决并且可以标准化地安装服务、配置文件到指定位置非常适合静默安装和系统化管理。缺点MySQL官方不直接提供针对麒麟Kylin系统的RPM包。常用的mysql-community-server包是针对Red Hat/CentOS/Fedora的在麒麟上安装可能会因为依赖包命名、版本冲突而失败。结论这是我们最终选择的方案。原因在于我们可以在一台联网的、相同版本ky10.x86_64的麒麟系统上利用系统自带的YUM/DNF工具模拟在线安装过程将所有下载的RPM包及其依赖包完整地抓取下来形成一个离线包集合。然后在目标离线机上使用rpm或yum localinstall命令进行安装。这样既利用了RPM的管理优势又通过“下载-搬运”的方式解决了依赖问题。2.2 最终技术路线基于以上分析我们确定的路线是“在线环境下载依赖包 离线环境静默安装”。 具体步骤分为准备阶段和执行阶段准备阶段联网环境找一台与目标机器系统版本完全一致的麒麟系统虚拟机亦可配置好MySQL的官方YUM源然后通过yum命令的--downloadonly参数将mysql-community-server-5.7.43及其所有依赖的RPM包下载到本地目录。执行阶段离线环境将准备好的RPM包目录拷贝到目标离线服务器。使用rpm -ivh命令按顺序安装基础包和依赖包或使用yum localinstall让yum处理本地包的依赖关系。最后通过预置的配置文件和服务脚本静默初始化并启动MySQL服务。这个方案的关键在于“准备阶段”的完整性和“执行阶段”的脚本化。下面我们就进入实操环节。3. 离线安装包准备实操这一步是整个项目的基础务必保证准备环境的纯净和一致性。3.1 准备联网环境我使用了一台虚拟机安装了与目标生产机完全相同的银河麒麟V10系统4.19.90-24.4.v2101.ky10.x86_64。确保该系统可以访问互联网。首先我们需要添加MySQL 5.7的官方YUM仓库。因为麒麟系统默认的源里可能没有MySQL或者版本不对。# 1. 安装MySQL官方的YUM仓库配置包 # 我们需要先下载这个rpm包可以从官网或镜像站获取 # 这里以清华镜像为例假设联网机可访问 wget https://repo.mysql.com//mysql57-community-release-el7.rpm # 2. 安装这个仓库包 sudo rpm -ivh mysql57-community-release-el7.rpm注意el7代表针对RHEL/CentOS 7麒麟V10的内核和用户态与CentOS 7兼容性较好所以选择这个版本。如果安装失败可能需要先安装yum-utils等工具。安装成功后/etc/yum.repos.d/目录下会多出mysql-community.repo等文件。我们可以编辑这个文件确保只启用我们需要的5.7版本仓库禁用8.0版本防止下载错包。sudo sed -i s/enabled1/enabled0/g /etc/yum.repos.d/mysql-community.repo sudo sed -i /\[mysql57-community\]/,/^\[/ s/enabled0/enabled1/ /etc/yum.repos.d/mysql-community.repo3.2 下载所有RPM包及依赖这是核心步骤使用yum的--downloadonly插件。# 1. 首先安装yum-utils它提供了yumdownloader等工具 sudo yum install -y yum-utils # 2. 创建一个目录用于存放所有下载的包 mkdir -p /opt/mysql-offline-packages-5.7.43 # 3. 使用yum下载指定版本5.7.43的mysql-community-server及其所有依赖但不安装 # 指定版本号的格式很重要 sudo yum install --downloadonly --downloaddir/opt/mysql-offline-packages-5.7.43 mysql-community-server-5.7.43执行这个命令后yum会解析mysql-community-server-5.7.43这个包的所有依赖包括mysql-community-client,mysql-community-libs,mysql-community-common等并将这些RPM包全部下载到/opt/mysql-offline-packages-5.7.43目录下。关键检查点进入目录使用ls -l *.rpm | wc -l查看下载的包数量通常会有20-30个左右。使用rpm -qpi *.rpm | grep -E \Name|Version|Release\可以快速查看所有包的名称和版本确认核心包server, client, libs, common都在且版本是5.7.43。特别留意是否有numactl-libs、libaio这样的系统级依赖包。麒麟系统可能默认已安装但版本未必符合要求。我们下载的依赖包里应该包含了它们。3.3 处理潜在依赖冲突有时候MySQL仓库的包可能会与麒麟系统自带的包如mariadb-libs冲突。在准备机上我们可以提前解决这个问题避免把问题带到离线环境。# 在准备机上可以先移除可能冲突的包如果存在 sudo yum remove mariadb-libs -y # 注意这只是为了顺利下载依赖因为我们是--downloadonly不会真的安装。如果准备机有其他用途操作需谨慎。下载完成后将整个/opt/mysql-offline-packages-5.7.43目录打包。tar -czf mysql-5.7.43-kylin-v10-offline.tar.gz -C /opt mysql-offline-packages-5.7.43现在这个tar.gz文件就是我们宝贵的“离线安装包”包含了在麒麟V10上安装MySQL 5.7.43所需的一切RPM文件。4. 目标服务器离线静默安装将打包好的mysql-5.7.43-kylin-v10-offline.tar.gz上传到目标离线服务器。假设我们放在/tmp目录下。4.1 环境预检查与清理在安装前对目标服务器进行清理确保没有残留的MySQL或MariaDB。# 1. 检查并停止已有的MySQL/MariaDB服务 sudo systemctl stop mysqld 2/dev/null sudo systemctl stop mariadb 2/dev/null # 2. 查找并卸载旧版本MySQL相关包 sudo rpm -qa | grep -i mysql | xargs sudo rpm -e --nodeps 2/dev/null # 同样处理可能的MariaDB残留 sudo rpm -qa | grep -i mariadb | xargs sudo rpm -e --nodeps 2/dev/null # 3. 删除旧的数据目录和配置文件谨慎操作确认是全新安装或无需旧数据 sudo rm -rf /var/lib/mysql sudo rm -f /etc/my.cnf /etc/my.cnf.rpmsave4.2 解压与安装RPM包# 1. 解压离线包到合适目录例如/opt sudo tar -xzf /tmp/mysql-5.7.43-kylin-v10-offline.tar.gz -C /opt # 2. 进入包目录 cd /opt/mysql-offline-packages-5.7.43 # 3. 安装所有RPM包。这里有两种方式 # 方式一使用rpm命令手动安装需处理依赖顺序不推荐 # 方式二使用yum localinstall让其自动解决本地包的依赖关系推荐 sudo yum localinstall *.rpm -y --disablerepo*yum localinstall *.rpm -y --disablerepo*这条命令是关键。--disablerepo*表示禁用所有远程仓库强制yum只从当前目录的本地RPM包中解析依赖并进行安装。yum会自己计算安装顺序比手动rpm -ivh一个个装要可靠得多。安装过程如果没有报错会看到一系列“Installing/Installed”提示。最后可以使用rpm -qa | grep mysql-community来验证安装结果。4.3 静默初始化与配置MySQL 5.7安装后数据目录是空的需要初始化。在线安装通常会通过systemctl start mysqld触发一个首次启动的初始化脚本并生成临时密码。但在静默安装脚本中我们需要更可控的方式。MySQL 5.7提供了mysqld --initialize或mysqld --initialize-insecure来进行初始化。--initialize为root用户生成一个随机密码并记录在日志文件通常是/var/log/mysqld.log中。--initialize-insecure初始化但不设置root密码密码为空不安全仅用于测试或后续脚本自动设置。为了静默化我们选择--initialize-insecure然后在初始化后立即用脚本修改密码。# 1. 确保mysql用户和组存在并授权数据目录 sudo groupadd mysql 2/dev/null sudo useradd -r -g mysql -s /bin/false mysql 2/dev/null sudo chown -R mysql:mysql /var/lib/mysql # 2. 使用--initialize-insecure初始化数据库 sudo mysqld --initialize-insecure --usermysql --datadir/var/lib/mysql重要提示--initialize或--initialize-insecure在整个MySQL实例生命周期中只能执行一次。如果/var/lib/mysql目录已存在数据文件执行会失败。这就是为什么之前要清理环境。初始化完成后启动MySQL服务。sudo systemctl start mysqld sudo systemctl enable mysqld # 设置开机自启4.4 自动化安全设置与密码修改服务启动后因为使用了--initialize-insecureroot用户密码为空。我们需要立即修改它并执行一些基本的安全设置。我们可以将这些操作写成一个SQL脚本通过mysql命令行在无密码状态下执行。创建一个脚本文件/tmp/init_mysql.sql-- 设置root用户密码请替换‘YourStrongPassword123!‘为实际强密码 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword123!; -- 删除匿名用户 DELETE FROM mysql.user WHERE User; -- 删除测试数据库 DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Dbtest OR Dbtest\\_%; -- 刷新权限 FLUSH PRIVILEGES;然后在Shell脚本中执行# 使用空密码连接并执行SQL脚本 mysql -u root --skip-password /tmp/init_mysql.sql # 验证新密码是否生效 mysql -u root -pYourStrongPassword123! -e SELECT VERSION();如果最后一条命令成功输出了MySQL版本号5.7.43那么恭喜你静默安装、初始化、密码设置全部成功。5. 集成与一键安装脚本为了真正实现“一键部署”我们可以将上述所有步骤整合到一个Shell脚本中。这个脚本应该包含错误处理、日志记录和状态检查。下面是一个简化版的示例脚本install_mysql_5.7.43_offline.sh#!/bin/bash # 描述用于银河麒麟V10系统离线静默安装MySQL 5.7.43 # 用法将离线包mysql-5.7.43-kylin-v10-offline.tar.gz与此脚本放在同一目录然后 sudo ./install_mysql_5.7.43_offline.sh set -e # 遇到错误立即退出 LOG_FILE/var/log/mysql_offline_install.log OFFLINE_PKG_NAMEmysql-5.7.43-kylin-v10-offline.tar.gz ROOT_PASSWORDYourStrongPassword123! # 请务必在安装前修改此处密码 exec 1 (tee -a $LOG_FILE) 21 # 同时输出到屏幕和日志文件 echo “$(date): 开始MySQL 5.7.43离线安装流程...” # 检查是否root执行 if [[ $EUID -ne 0 ]]; then echo “错误此脚本必须使用root权限运行。” exit 1 fi # 检查离线包是否存在 if [[ ! -f “./${OFFLINE_PKG_NAME}” ]]; then echo “错误未找到离线安装包 ${OFFLINE_PKG_NAME}请将其放置于当前目录。” exit 1 fi echo “1. 清理旧MySQL环境...” systemctl stop mysqld 2/dev/null || true systemctl stop mariadb 2/dev/null || true rpm -qa | grep -i mysql | xargs rpm -e --nodeps 2/dev/null || true rpm -qa | grep -i mariadb | xargs rpm -e --nodeps 2/dev/null || true rm -rf /var/lib/mysql rm -f /etc/my.cnf /etc/my.cnf.rpmsave echo “2. 解压离线安装包...” tar -xzf “./${OFFLINE_PKG_NAME}” -C /opt echo “3. 安装RPM包...” cd /opt/mysql-offline-packages-5.7.43 if yum localinstall *.rpm -y --disablerepo*; then echo “RPM包安装成功。” else echo “RPM包安装失败请检查日志。” exit 1 fi echo “4. 准备数据目录和用户...” groupadd mysql 2/dev/null || true useradd -r -g mysql -s /bin/false mysql 2/dev/null || true chown -R mysql:mysql /var/lib/mysql echo “5. 初始化数据库无密码模式...” if mysqld --initialize-insecure --usermysql --datadir/var/lib/mysql; then echo “数据库初始化成功。” else echo “数据库初始化失败可能已初始化过请检查/var/lib/mysql目录。” exit 1 fi echo “6. 启动MySQL服务并设置开机自启...” systemctl start mysqld systemctl enable mysqld echo “7. 设置root密码及安全配置...” cat /tmp/init_mysql.sql EOF ALTER USER rootlocalhost IDENTIFIED BY ${ROOT_PASSWORD}; DELETE FROM mysql.user WHERE User; DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Dbtest OR Dbtest\\_%; FLUSH PRIVILEGES; EOF mysql -u root --skip-password /tmp/init_mysql.sql rm -f /tmp/init_mysql.sql echo “8. 验证安装...” if mysql -u root -p“${ROOT_PASSWORD}” -e “SELECT VERSION();” /dev/null; then echo “$(date): MySQL 5.7.43 离线静默安装成功完成” echo “Root密码已设置为脚本中定义的密码请妥善保管。” else echo “安装验证失败请检查MySQL服务状态和日志。” exit 1 fi使用前请务必修改脚本中的ROOT_PASSWORD变量。确保离线包与脚本在同一目录。赋予脚本执行权限chmod x install_mysql_5.7.43_offline.sh。使用root权限运行sudo ./install_mysql_5.7.43_offline.sh。6. 常见问题与排查技巧实录在实际操作中即使按照步骤来也可能遇到各种问题。这里记录几个典型问题及其解决方法。6.1 依赖包冲突或缺失问题现象执行yum localinstall *.rpm时报错Error: Package: XXXX requires YYYY, but none of the providers can be installed或Error: Package: XXXX conflicts with YYYY。排查与解决确认系统版本再次核对uname -r和cat /etc/os-release确保准备机和目标机版本完全一致。检查离线包完整性在准备机上可以尝试用yum localinstall模拟安装一次看是否成功。如果准备机都失败说明下载的包集合本身就有问题可能需要手动补充缺失的依赖包。可以使用repoquery --requires --resolve mysql-community-server-5.7.43需要安装yum-utils在准备机上查询完整的依赖树然后逐个下载。手动安装基础依赖有些底层依赖如libaio、numactl-libs可能麒麟系统自带但版本不匹配。可以尝试先卸载系统自带的旧版本谨慎再安装我们离线包里的版本。或者从麒麟系统官方ISO镜像或软件源中找到对应版本的RPM包加入我们的离线包目录。6.2 初始化失败问题现象执行mysqld --initialize-insecure时失败提示[ERROR] --initialize specified but the data directory has files in it. Aborting.。原因与解决数据目录/var/lib/mysql非空。这通常是因为旧MySQL数据未清理干净或者之前初始化失败残留了文件。务必确保这是一个全新的安装或者你已备份并清空了数据目录。使用rm -rf /var/lib/mysql/*极度谨慎后再试。6.3 服务启动失败问题现象systemctl start mysqld失败使用systemctl status mysqld -l或journalctl -xe查看详细错误。常见原因SELinux/AppArmor国产系统可能默认开启了安全模块。可以尝试临时禁用SELinuxsetenforce 0并修改/etc/selinux/config中SELINUXpermissive然后重启。但生产环境建议根据审计要求配置正确的安全上下文。权限问题/var/lib/mysql目录的属主必须是mysql:mysql。用ls -ld /var/lib/mysql检查。配置文件错误检查/etc/my.cnf或/etc/my.cnf.d/下的配置文件是否有语法错误。最简单的排查方法是注释掉所有自定义配置用默认配置启动试试。端口占用默认3306端口可能被其他程序占用。使用netstat -tlnp | grep 3306检查。6.4 安装后无法用新密码登录问题现象脚本执行完毕但用设置的密码连接MySQL被拒绝。排查步骤检查MySQL服务是否真的在运行systemctl is-active mysqld。查看MySQL错误日志默认在/var/log/mysqld.log看是否有启动报错或权限相关的错误。如果使用--initialize非insecure初始化root的随机密码在错误日志里。可以用grep temporary password /var/log/mysqld.log查找。如果确认密码正确但仍无法登录可以尝试“跳过权限表”启动MySQL来重置密码。这是一个应急方法systemctl stop mysqldmysqld_safe --skip-grant-tables 然后无密码登录mysql -u root执行UPDATE mysql.user SET authentication_stringPASSWORD(新密码) WHERE Userroot; FLUSH PRIVILEGES;注意MySQL 5.7的密码字段是authentication_string。最后重启正常服务。6.5 性能与配置调优建议安装完成后默认的my.cnf配置可能不适合生产环境。对于麒麟系统这类服务器建议至少调整以下参数编辑/etc/my.cnf在[mysqld]段下[mysqld] # 基础设置 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineINNODB # 内存相关根据服务器实际内存调整这里以8G内存为例 innodb_buffer_pool_size 4G # 通常设置为物理内存的50%-70% key_buffer_size 256M tmp_table_size 256M max_heap_table_size 256M # 连接相关 max_connections 500 thread_cache_size 50 table_open_cache 2000 # InnoDB日志 innodb_log_file_size 512M innodb_log_buffer_size 32M # 其他优化 innodb_flush_log_at_trx_commit 2 # 根据数据安全性要求调整2是性能和安全的折中 sync_binlog 1000修改配置后需要重启MySQL服务生效sudo systemctl restart mysqld。整个离线静默安装的过程核心在于准备阶段的完整性和执行阶段的自动化与健壮性。通过制作一个针对特定系统版本的完整离线RPM包集合并辅以完善的安装后配置脚本我们就能在严格的内网环境中快速、可靠地部署好MySQL数据库为上层应用提供一个稳固的数据服务基础。