简介:本资源为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): Can't connect to local MySQL server through socket '/tmp/mysql.sock'卡住超过两小时的人。
2. 下载、校验与解压:为什么不能跳过 SHA256 校验,也不能直接tar -xzf
2.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和aarch64) - SHA256 值为
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或/home:MySQL 启动时会检查basedir下share/english/errmsg.sys是否可读,而某些国产系统 SELinux 策略对非标准路径有额外限制,导致mysqld --initialize报Failed to open file
参数说明:
tar -xzf:x=extract, z=gzip, f=file —— 三者缺一不可-C指定目标目录,必须是绝对路径,且目标目录需提前mkdir -p并赋权ln -sf中的-s创建软链,-f强制覆盖旧链(升级时必备)
3. 初始化与首次启动:为什么mysqld --initialize必须指定--user且不能漏掉--datadir
3.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分区通常挂载自独立 SSD,IO 性能更稳
3.2 初始化命令必须带这 5 个参数,少一个就失败
sudo /usr/local/mysql/bin/mysqld \ --initialize \ --user=mysql \ --datadir=/data/mysql \ --log-error=/var/log/mysql/error.log \ --socket=/var/lib/mysql/mysql.sock \ --pid-file=/var/run/mysqld/mysqld.pid参数说明:
--user=mysql:强制以 mysql 用户运行,否则初始化生成的 root 密码无效(root@localhost 密码为空)--datadir=/data/mysql:必须与上步创建的目录一致,且该目录必须为空(否则报Directory not empty)--log-error:指定错误日志路径,国产系统中/var/log通常有 logrotate 策略,便于日志管理--socket:显式指定 sock 文件路径,避免后续mysql -u root -p连接时找不到 socket(这是error 2002最常见原因)--pid-file:PID 文件路径需提前创建父目录/var/run/mysqld并赋权chown mysql:mysql /var/run/mysqld
执行后,终端会输出类似:
A temporary password is generated for root@localhost: 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 'root'@'localhost' 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-port=3306/tcp而非直接开放。
方式三:免密登录(仅限初始化调试)
# 创建 ~/.my.cnf cat > ~/.my.cnf << 'EOF' [client] user=root password=wYt!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 ignored)
4.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 User='root' AND Host!='localhost'; -- 删除 test 数据库 DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; -- 刷新权限 FLUSH PRIVILEGES;血泪经验:某金融客户因跳过
DELETE FROM mysql.user WHERE User='';,导致应用连接时随机匹配到空用户,出现Access denied for user ''@'%'错误,排查耗时 2 天。
4.3 创建应用用户并授权(国产系统必须显式指定 host)
-- 创建应用用户(不能用 '%',国产防火墙策略常拦截 % 匹配) CREATE USER 'appuser'@'10.10.10.%' IDENTIFIED BY 'AppPass456!'; -- 授权(生产环境禁止 GRANT ALL) GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'10.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/mysqld
5.2 现象:mysql -u root -p报ERROR 2002 (HY000): Can't 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: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
原因:datadir目录非空,或存在残留的ibdata1文件
解决:
- 彻底清空
datadir:sudo rm -rf /data/mysql/* - 检查是否有隐藏文件:
sudo ls -la /data/mysql/ - 确保
mysql用户对目录有rwx权限:sudo -u mysql touch /data/mysql/test && sudo rm /data/mysql/test
5.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 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 注意:修改后必须
FLUSH PRIVILEGES;,且重启客户端连接
5.5 现象:执行CREATE TABLE ... ENGINE=InnoDB报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_DSYNC
6. 进阶技巧:用 systemd 管理服务 + 自动化健康检查脚本
6.1 编写符合国产系统规范的 systemd unit 文件
创建/usr/lib/systemd/system/mysqld.service(注意路径,非/etc/systemd/system/):
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target Wants=network.target [Service] Type=notify User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf Restart=on-failure RestartSec=10 OOMScoreAdjust=-800 LimitNOFILE=65536 LimitCORE=infinity Environment="MYSQLD_OPTS=--defaults-file=/etc/my.cnf" [Install] WantedBy=multi-user.target逻辑说明:
Type=notify:MySQL 8.0 支持 systemd notify 协议,比simple更精准判断服务状态OOMScoreAdjust=-800:降低 OOM killer 优先级,防止内存不足时被误杀(国产 ARM 服务器内存常紧张)LimitNOFILE=65536:显式设置文件描述符上限,避免连接数超限(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" USER="root" PASS="YourStrongPass123!" # 生产环境建议从 /etc/mysql/health.pass 读取 DB="mysql" # 检查进程是否存在 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 *) QUERY="SELECT 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 2>&1; 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赋予执行权限并加入 crontab:
sudo 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插件被移除,靠备份快速回滚;另一次是误删root@localhost用户,用备份 SQL 5 分钟恢复。国产信创环境里,没有后悔药,只有备份。
希望帮到你。
本文还有配套的精品资源,点击获取