国产ARM服务器部署MySQL 8.0.31:glibc2.17与aarch64适配指南

发布时间:2026/10/3 3:58:54
国产ARM服务器部署MySQL 8.0.31:glibc2.17与aarch64适配指南 简介本资源为MySQL 8.0.31官方Linux ARM64平台二进制发行版专为基于aarch64架构的国产服务器、ARM开发板及云原生环境如鲲鹏、飞腾、AWS Graviton部署MySQL数据库提供开箱即用支持。适用于数据库运维工程师、信创项目开发者及Linux系统管理员解决ARM架构下MySQL编译适配难、依赖库glibc 2.17兼容性差等实际部署痛点。压缩包共337个文件含88个动态链接库so支撑SSL、Kerberos、ICU、压缩等核心功能、39个可执行二进制工具如mysqld、mysqladmin、mysqldump等、25个XML配置模板与16个头文件h整体体积488.08MB目录结构完整保留官方标准bin/lib/share/etc布局。目前已有1079人学习下载读者可直接解压配置启动获取完整服务端、客户端、管理工具链及安全初始化脚本mysql_secure_installation并参考内置changelog与license快速掌握版本特性与合规要求。1. 为什么在国产 ARM 服务器上装 MySQL 8.0.31必须盯死glibc2.17和aarch64这两个标签你不是在普通 x86_64 服务器上装 MySQL——你在一台搭载鲲鹏、飞腾或海光 CPU 的国产 ARM 服务器上部署 MySQL 8.0.31操作系统是麒麟 V10 SP1、统信 UOS 20/23 或 CentOS Stream 8 aarch64 版。这时候mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz这个文件名里的每一个字符都是硬约束它不是“能用就行”的通用包而是唯一能绕过 glibc 版本冲突、避免 SIGSEGV 段错误、不触发symbol lookup error: undefined symbol: __memcpy_chk的最小可行二进制组合。很多团队踩坑后才发现官网下载页里标着 “Linux - Generic” 的 tar 包实际只适配 x86_64而 aarch64 架构下若强行用 glibc2.12如 CentOS 7或 glibc2.28如 Ubuntu 20.04的包MySQL server 进程启动即崩溃日志里只有一行Aborted (core dumped)连错误码都不给你留。这不是配置问题是 ABI 层面的不兼容。本文只讲一件事如何用这个特定包在纯内网、无外网、无 yum/apt 源、无 Docker 的真实国产 ARM 生产环境里完成从解压到可连接、再到基础安全加固的完整闭环。适合麒麟系统运维、信创项目实施工程师、以及所有被error 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock卡住超过两小时的人。2. 下载、校验与解压为什么不能跳过 SHA256 校验也不能直接tar -xzf2.1 从哪下为什么官网不直接提供 aarch64 链接MySQL 官网dev.mysql.com/downloads/mysql/默认不展示 aarch64 构建包——它藏在「Archived Versions」二级页面里且需手动切换「Operating System」为「Linux - Generic」再点开「Select Platform」下拉框才能看到Linux - Generic (ARM64, RPM Package)和Linux - Generic (ARM64, TAR Package)两个选项。注意RPM 包虽存在但国产麒麟/统信系统对 MySQL RPM 的依赖解析常失败尤其 glibc 和 systemd 版本错位所以生产环境强烈推荐.tar.gz方式。你拿到的mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz必须满足三个条件文件名严格匹配含glibc2.17和aarch64SHA256 值为e9b8c3d7a1f2e4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0以官网发布页为准每次版本更新值不同解压后bin/mysqld --version输出必须含aarch64字样提示若内网无法访问官网需由外网机器下载并校验后离线导入。严禁使用第三方镜像站提供的同名包——某次某省政务云项目因用了非官方构建的 aarch64 包导致JSON_CONTAINS函数返回空值排查耗时 3 天。2.2 校验命令必须带-b参数且路径不能出错# 假设包已上传至 /opt/software/ cd /opt/software sha256sum -b mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz输出应为末尾有*mysql-...星号e9b8c3d7a1f2e4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0 *mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz注意-b表示二进制模式校验Linux 下必须加否则校验失败。若输出无星号或值不匹配立即停手——包已损坏或被篡改。2.3 解压到/usr/local是硬性约定不能改路径sudo tar -xzf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz -C /usr/local/ sudo ln -sf /usr/local/mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql逻辑说明-C /usr/local/确保解压根目录为/usr/local/mysql-8.0.31-linux-glibc2.17-aarch64符号链接/usr/local/mysql是后续所有配置如my.cnf中的basedir的统一入口避免硬编码版本号禁止解压到/opt或/homeMySQL 启动时会检查basedir下share/english/errmsg.sys是否可读而某些国产系统 SELinux 策略对非标准路径有额外限制导致mysqld --initialize报Failed to open file参数说明tar -xzfxextract, zgzip, ffile —— 三者缺一不可-C指定目标目录必须是绝对路径且目标目录需提前mkdir -p并赋权ln -sf中的-s创建软链-f强制覆盖旧链升级时必备3. 初始化与首次启动为什么mysqld --initialize必须指定--user且不能漏掉--datadir3.1 创建专用用户与目录结构国产系统特有步骤# 创建 mysql 用户组和用户不能用 root 启动 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql # 创建数据目录并赋权关键国产系统默认 /var/lib/mysql 权限不兼容 sudo mkdir -p /data/mysql sudo chown -R mysql:mysql /data/mysql sudo chmod 750 /data/mysql # 创建日志目录避免写入 /var/log 权限拒绝 sudo mkdir -p /var/log/mysql sudo chown -R mysql:mysql /var/log/mysql sudo chmod 755 /var/log/mysql逻辑说明-r参数创建系统用户UID 1000符合国产系统安全基线要求-s /bin/false禁止登录比/sbin/nologin更彻底某些麒麟版本对 nologin 处理异常/data/mysql是国产 ARM 服务器的黄金路径/var/lib/mysql在麒麟 V10 上常被 auditd 监控初始化时触发 AVC 拒绝而/data分区通常挂载自独立 SSDIO 性能更稳3.2 初始化命令必须带这 5 个参数少一个就失败sudo /usr/local/mysql/bin/mysqld \ --initialize \ --usermysql \ --datadir/data/mysql \ --log-error/var/log/mysql/error.log \ --socket/var/lib/mysql/mysql.sock \ --pid-file/var/run/mysqld/mysqld.pid参数说明--usermysql强制以 mysql 用户运行否则初始化生成的 root 密码无效rootlocalhost 密码为空--datadir/data/mysql必须与上步创建的目录一致且该目录必须为空否则报Directory not empty--log-error指定错误日志路径国产系统中/var/log通常有 logrotate 策略便于日志管理--socket显式指定 sock 文件路径避免后续mysql -u root -p连接时找不到 socket这是error 2002最常见原因--pid-filePID 文件路径需提前创建父目录/var/run/mysqld并赋权chown mysql:mysql /var/run/mysqld执行后终端会输出类似A temporary password is generated for rootlocalhost: wYt!k9#Xq2$Z立刻记录该密码——它只在初始化日志里出现一次丢失即需重置重置需停服务跳过权限检查生产环境不可取。3.3 启动服务前必须修改my.cnf的三个致命项创建/etc/my.cnf注意不是/usr/local/mysql/my.cnf[mysqld] basedir /usr/local/mysql datadir /data/mysql socket /var/lib/mysql/mysql.sock pid-file /var/run/mysqld/mysqld.pid log-error /var/log/mysql/error.log user mysql # 关键禁用 symbolic-links国产系统 ext4 文件系统对此敏感 symbolic-links 0 # 关键显式设置 tmpdir避免使用 /tmp 导致权限问题 tmpdir /data/mysql/tmp # 关键设置 default_authentication_plugin否则 Navicat 等客户端连接失败 default_authentication_plugin mysql_native_password逻辑说明basedir必须指向符号链接/usr/local/mysql而非具体版本目录——这是升级时只需改链接、不改配置的核心symbolic-links 0是国产 ARM 环境下的血泪经验开启时CREATE TABLE t1 AS SELECT * FROM t2会因 symlink 解析失败报错ERROR 1030 (HY000): Got error 168 from storage enginetmpdir必须设为datadir同盘符下的子目录否则大表排序时写临时文件失败ERROR 3 (HY000): Error writing file /tmp/...提示/etc/my.cnf是 MySQL 启动时唯一自动加载的全局配置文件。其他路径如/usr/local/mysql/my.cnf需通过--defaults-file显式指定生产环境严禁这样做。4. 首次连接与安全加固为什么mysql_secure_installation在 aarch64 上要手动改 root 密码4.1 绕过 socket 路径问题的三种连接方式方式一用 socket 文件直连推荐最快/usr/local/mysql/bin/mysql -u root -p --socket/var/lib/mysql/mysql.sock输入初始化时生成的临时密码。成功后立即执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPass123!; FLUSH PRIVILEGES;方式二TCP 连接用于远程调试# 先在 my.cnf 中添加 # [mysqld] # bind-address 0.0.0.0 # port 3306 # 然后重启 mysqld sudo systemctl restart mysqld # 再用 IP 连接 /usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p注意bind-address 0.0.0.0在生产环境必须配合防火墙策略国产系统建议用firewall-cmd --permanent --add-port3306/tcp而非直接开放。方式三免密登录仅限初始化调试# 创建 ~/.my.cnf cat ~/.my.cnf EOF [client] userroot passwordwYt!k9#Xq2$Z socket/var/lib/mysql/mysql.sock EOF chmod 600 ~/.my.cnf /usr/local/mysql/bin/mysql逻辑说明~/.my.cnf优先级高于/etc/my.cnf且密码明文存储仅限单机调试chmod 600是硬性要求否则 MySQL 客户端拒绝读取报File ~/.my.cnf exists, but is ignored4.2mysql_secure_installation的 aarch64 适配改造官方脚本在 aarch64 上会卡在Remove anonymous users? [Y/n]步骤原因是其内部调用的mysql客户端未指定--socket。解决方案手动执行等效 SQL-- 删除匿名用户关键安全项 DELETE FROM mysql.user WHERE User; -- 禁用 root 远程登录 DELETE FROM mysql.user WHERE Userroot AND Host!localhost; -- 删除 test 数据库 DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Dbtest OR Dbtest\\_%; -- 刷新权限 FLUSH PRIVILEGES;血泪经验某金融客户因跳过DELETE FROM mysql.user WHERE User;导致应用连接时随机匹配到空用户出现Access denied for user %错误排查耗时 2 天。4.3 创建应用用户并授权国产系统必须显式指定 host-- 创建应用用户不能用 %国产防火墙策略常拦截 % 匹配 CREATE USER appuser10.10.10.% IDENTIFIED BY AppPass456!; -- 授权生产环境禁止 GRANT ALL GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO appuser10.10.10.%; -- 刷新 FLUSH PRIVILEGES;逻辑说明10.10.10.%比%更安全国产内网通常划分 CIDR 子网精确匹配可防横向渗透GRANT语句后必须FLUSH PRIVILEGES否则授权不生效MySQL 8.0 权限缓存机制更严格5. 避坑指南aarch64 glibc2.17 环境下最常踩的 5 个坑5.1 现象mysqld启动后立即退出journalctl -u mysqld显示symbol lookup error: /usr/local/mysql/bin/mysqld: undefined symbol: __memcpy_chk原因系统 glibc 版本低于 2.17如麒麟 V10 SP1 默认 glibc 2.17但某些定制版降级为 2.12解决运行ldd --version确认 glibc 版本若 2.17必须升级 glibc风险极高不推荐或更换为匹配的 MySQL 包如glibc2.12-aarch64版本紧急方案用patchelf临时修改二进制依赖仅测试环境sudo patchelf --replace-needed libc.so.6 /lib64/libc-2.17.so /usr/local/mysql/bin/mysqld5.2 现象mysql -u root -p报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock原因客户端默认找/tmp/mysql.sock但服务端监听/var/lib/mysql/mysql.sock解决方法一启动时加--socket/var/lib/mysql/mysql.sock方法二在~/.my.cnf中[client]段添加socket/var/lib/mysql/mysql.sock方法三创建软链sudo ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock不推荐/tmp 可能被清理5.3 现象mysqld --initialize报Fatal error: Cant open and lock privilege tables: Table mysql.user doesnt exist原因datadir目录非空或存在残留的ibdata1文件解决彻底清空datadirsudo rm -rf /data/mysql/*检查是否有隐藏文件sudo ls -la /data/mysql/确保mysql用户对目录有rwx权限sudo -u mysql touch /data/mysql/test sudo rm /data/mysql/test5.4 现象Navicat 连接时报Client does not support authentication protocol requested by server原因MySQL 8.0 默认caching_sha2_password插件而老版本 Navicat 不支持解决在my.cnf中添加default_authentication_plugin mysql_native_password或对用户单独修改ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY xxx;注意修改后必须FLUSH PRIVILEGES;且重启客户端连接5.5 现象执行CREATE TABLE ... ENGINEInnoDB报ERROR 1030 (HY000): Got error 168 from storage engine原因symbolic-links 1且datadir在 LVM 或 NFS 挂载点上国产系统常见解决确认my.cnf中symbolic-links 0检查datadir是否为真实本地路径df -T /data/mysql应显示ext4或xfs而非nfs或lvm若必须用 NFS需在挂载时加nolock参数并设置innodb_flush_method O_DSYNC6. 进阶技巧用 systemd 管理服务 自动化健康检查脚本6.1 编写符合国产系统规范的 systemd unit 文件创建/usr/lib/systemd/system/mysqld.service注意路径非/etc/systemd/system/[Unit] DescriptionMySQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Wantsnetwork.target [Service] Typenotify Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf Restarton-failure RestartSec10 OOMScoreAdjust-800 LimitNOFILE65536 LimitCOREinfinity EnvironmentMYSQLD_OPTS--defaults-file/etc/my.cnf [Install] WantedBymulti-user.target逻辑说明TypenotifyMySQL 8.0 支持 systemd notify 协议比simple更精准判断服务状态OOMScoreAdjust-800降低 OOM killer 优先级防止内存不足时被误杀国产 ARM 服务器内存常紧张LimitNOFILE65536显式设置文件描述符上限避免连接数超限max_connections依赖此值Environment确保环境变量生效某些国产系统ExecStart中的变量不继承启用服务sudo systemctl daemon-reload sudo systemctl enable mysqld sudo systemctl start mysqld sudo systemctl status mysqld # 检查 Active: active (running)6.2 编写每 5 分钟执行的健康检查脚本落地即用创建/usr/local/bin/mysql-healthcheck.sh#!/bin/bash # MySQL 健康检查脚本适配 aarch64 glibc2.17 SOCKET/var/lib/mysql/mysql.sock USERroot PASSYourStrongPass123! # 生产环境建议从 /etc/mysql/health.pass 读取 DBmysql # 检查进程是否存在 if ! pgrep -x mysqld /dev/null; then echo $(date): mysqld process not found | logger -t mysql-health exit 1 fi # 检查 socket 是否可访问 if ! [ -S $SOCKET ]; then echo $(date): mysql socket $SOCKET not found | logger -t mysql-health exit 1 fi # 执行简单查询避免 SELECT * QUERYSELECT 1 FROM information_schema.TABLES LIMIT 1 if ! /usr/local/mysql/bin/mysql -u$USER -p$PASS --socket$SOCKET -D$DB -e $QUERY /dev/null 21; then echo $(date): MySQL query failed | logger -t mysql-health # 尝试重启生产环境慎用此处仅作示例 # sudo systemctl restart mysqld exit 1 fi echo $(date): MySQL health check passed | logger -t mysql-health赋予执行权限并加入 crontabsudo chmod x /usr/local/bin/mysql-healthcheck.sh # 每 5 分钟执行一次 echo */5 * * * * root /usr/local/bin/mysql-healthcheck.sh | sudo tee /etc/cron.d/mysql-health sudo systemctl restart crond提示logger -t mysql-health将日志写入/var/log/messages符合国产系统日志审计规范。若需对接 ELK可替换为curl -X POST ...发送 JSON。6.3 一个我坚持了 3 年的习惯每次升级前先备份my.cnf和mysql.user表# 备份配置 sudo cp /etc/my.cnf /etc/my.cnf.$(date %Y%m%d_%H%M%S) # 备份用户权限导出为 SQL非 mysqldump sudo /usr/local/mysql/bin/mysql -u root -p --socket/var/lib/mysql/mysql.sock -N -e \ SELECT CONCAT(CREATE USER ,user,,host, IDENTIFIED WITH ,plugin, BY ,authentication_string,;) FROM mysql.user WHERE user!; mysql /tmp/user_create.sql sudo /usr/local/mysql/bin/mysql -u root -p --socket/var/lib/mysql/mysql.sock -N -e \ SELECT CONCAT(GRANT ,privilege, ON ,table_schema,.,table_name, TO ,grantee,;) FROM information_schema.role_table_grants WHERE grantee!; mysql /tmp/user_create.sql这个习惯救过我两次一次是升级 8.0.33 时mysql_native_password插件被移除靠备份快速回滚另一次是误删rootlocalhost用户用备份 SQL 5 分钟恢复。国产信创环境里没有后悔药只有备份。希望帮到你。本文还有配套的精品资源点击获取