aarch64平台MySQL 5.7.32安装全攻略:从文件名到稳定运行
2026/9/1 3:47:39 网站建设 项目流程

简介:这是专为64位ARM架构(AArch64/ARM64)编译的MySQL 5.7.32 Linux安装包,面向需要在树莓派4、ARM服务器等设备上部署数据库的开发者与运维人员,解决通用Linux包无法在arm平台直接运行的问题。安装包内含14882个文件,除MySQL核心二进制外,还包括大量test/result测试用例与结果、opt/inc等配置与头文件、cnf配置文件、so动态库、data/frm数据库文件,以及mysql_install_db、mysql_secure_installation等管理工具,压缩包整体约510MB,目录结构贴近官方发行版,解压后即可获得可运行的MySQL二进制环境和完整测试集。目前已有1416人学习下载。基于该安装包,读者可快速完成arm平台上的MySQL环境搭建、初始化和安全配置,也可通过附带工具与测试用例进行功能验证和性能调优,充分发挥ARM设备的性能潜力。 拿到mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz这个文件名的时候,很多人第一反应是:一个安装包的名字为什么能长成这样?实际上这个文件名已经把需要确认的信息全部剧透了——版本是 5.7.32,系统平台是 Linux,依赖的 glibc 是 2.28,CPU 架构是 aarch64,打包格式是 tar.gz。我在 aarch64 服务器上装 MySQL 的次数两只手数不过来,每次看到这类包名反而觉得安心,因为通过这些信息可以提前判断当前机器能不能直接跑、还需要准备什么依赖、装完该怎么配。这篇文章就把这个包名拆开讲清楚,然后带你把整个安装流程完整跑一遍,包括环境检查、目录规划、配置初始化、服务启动以及我踩过的几个典型坑。

1. 文件名里的信息量:为什么每个字段都值得较真

1.1 版本号 5.7.32 到底意味着什么

MySQL 的版本号由三部分构成:主版本号、副版本号、补丁版本号。5.7.32 属于 5.7 系列,这个系列从 2015 年发布之后持续维护了很多年,是很多生产环境至今仍在使用的版本。5.7 相比更早的 5.5/5.6,最大的变化在于默认存储引擎是 InnoDB,JSON 类型正式支持,性能监控表 Performance Schema 大幅增强,还引入了更安全默认配置、sql_mode 默认开启 ONLY_FULL_GROUP_BY 等机制。

为什么 5.7.32 这个版本至今还有人专门去找?一方面是因为很多老系统的官方源(比如某些 Linux 发行版自带的仓库)只带 5.5/5.7 的老版本,另一方面是 5.7 的稳定性和兼容性经过了大量生产环境验证。如果你现在接触到一个业务系统要求“MySQL 5.7.32 且跑在 aarch64 上”,大概率是适配新硬件平台、迁移业务系统,或者复现一套基于固定版本的测试环境。这类场景不建议直接跳到 8.0,因为行为差异确实不少,比如密码认证插件、字符集默认值、授权方式都有变动。

1.2 glibc 版本决定系统最低门槛

glibc 是 GNU C Library,是 Linux 系统中几乎所有用户态程序运行的基础动态链接库。程序在编译时链接了某个版本的 glibc,运行时就需要系统提供不低于这个版本的 glibc。这里的关键在于 glibc 是向后兼容的:高版本系统可以运行低版本编译的程序,反过来则不行。用一个生活化的类比,glibc 版本像翻译标准——高版本的翻译看得懂老文档,老翻译看不懂新规范。

glibc-2.28这个标记表示编译这个 MySQL 包时用的是 glibc 2.28 的工具链。这意味着目标系统的 glibc 版本必须大于等于 2.28,否则启动时直接报 “GLIBC_2.28 not found”。这也就是为什么网上有不少人拿到新包后在 CentOS 7(自带 glibc 2.17)上提示依赖缺失、根本无法运行的原因。遇到这种情况不需要慌张,解决思路有两条:要么给系统升 glibc(风险非常高,我下面会专门讲),要么下载一个基于更低 glibc 编译的 MySQL 版本。这里有一个实操建议:如果装了系统之后发现 glibc 过低,手动升级 glibc 是运维中最容易翻车的操作之一,因为 glibc 是几乎所有命令和服务的运行基础,升级失败甚至可能导致系统直接无法启动。生产环境中务必谨慎,最好优先考虑匹配系统版本的安装包。

1.3 aarch64 与 tar.gz 的解读

aarch64是 ARM 64 位架构的标准名字,常见于 ARMv8 以上的处理器。国内常见的鲲鹏、飞腾、以及很多服务器级的 ARM 芯片都属于这个架构。之所以在文件名里显式标出,是因为 MySQL 官方对不同架构发布不同的二进制包,x86_64 的包没法直接在 aarch64 上跑(底层指令集不一样)。如果你的uname -m输出是aarch64,那这个包就是正主;如果输出是armv7l(32 位 ARM)或者x86_64,那就得重新找对应版本。

tar.gz 是 Linux 下最通用的源码/二进制打包格式,实际过程是先通过 tar 打包,再用 gzip 压缩。解压命令对应tar -xf(新版 tar 能自动识别压缩格式),为了保险也可以写成tar -zxvf显式指定。这个格式本身是纯文本的打包结果,解压后即可看到完整的目录结构。

2. 动手前必做的三件事:架构确认、依赖检查、方案选型

2.1 快速确认目标机器架构

安装之前,先花十秒钟确认机器架构和当前系统的 glibc 版本,避免装到一半才发现不匹配。我最常用的三条命令如下,每一条都有不同的用途:

# 查看 CPU 架构 uname -m # 查看 glibc 版本,输出第一行最后一个字段 ldd --version # 查看操作系统发行版 cat /etc/os-release

如果uname -m输出aarch64,说明架构匹配,可以直接用这个包。ldd --version的完整输出类似ldd (GNU libc) 2.31,只要数字大于等于 2.28 就满足要求。cat /etc/os-release可以帮你判断当前系统是哪个发行版,这决定了后面用 yum 还是 apt 安装依赖包。

这里补充一个容易被忽略的细节:有些嵌入式设备或边缘网关看起来是 Linux,但内核和系统裁剪得很厉害,连 glibc 都不完整。遇到这种设备,不要试图用通用 Linux 的 MySQL 二进制包,要么用交叉编译方案,要么改用容器。最简单粗暴的判断方式就是执行ldd --version,如果命令本身都跑不出来,说明系统基础库不全,后续几乎没有可能直接跑起来。

2.2 确认 glibc 版本与依赖库的边界

glibc 版本只是第一道门槛,实际启动 mysqld 时还会检查其他动态库。最常见的是libaio,MySQL 的 InnoDB 引擎在 Linux 上需要用到异步 I/O 接口 libaio。没有安装的话,启动时报错信息相当直白:“error while loading shared libraries: libaio.so.1: cannot open shared object file”。在 Debian/Ubuntu 上用apt-get install -y libaio1,在 CentOS/RHEL 上用yum install -y libaio或者dnf install -y libaio就能解决。

另外,如果系统开启了 AppArmor(Ubuntu 默认开启)或 SELinux(CentOS/RHEL 默认开启),需要注意安全策略是否限制了 mysqld 对数据目录的读写。有时候数据目录权限明明配好了,服务依然报错,查到最后发现是 SELinux policy 拒绝了。临时放行的命令是setenforce 0(仅限测试环境),生产环境建议用semanage fcontext把数据目录加进白名单,而不是粗暴关闭。

2.3 二进制包安装 vs Docker 安装怎么选

在 aarch64 服务器上部署 MySQL,其实有两种主流路径:直接使用官方二进制包(也就是这篇文章的主角),或者用 Docker 镜像。需要说明的是,考虑到容器镜像的分发方式,Docker 部署对 glibc 版本的敏感度相对更低,但宿主机上的内核、以及容器运行环境本身也具备一定要求。二进制的安装方式更贴近传统运维习惯,便于理解 MySQL 底层的运行机制、日志和目录结构,也更容易做定制化调优。如果只是本地开发、快速起服务,Docker 确实是省事的选择:docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=xxx mysql:5.7一条命令就完成。

但如果你的场景是生产环境、内网离线部署,或者需要深度定制 MySQL 的配置,那我还是推荐用官方二进制包。最核心的原因是,二进制包与系统深度融合,目录规划、参数文件和进程管理都完全掌握在运维手里,出了问题能快速排查,不像容器那样多一层隔离。另外,离线环境下分发一个 tar.gz 文件,远比导入一个 docker 镜像方便得多。

注意:如果是内网离线环境,需要提前准备好 libaio、libncurses 等依赖包,否则因为缺依赖导致 mysqld 无法启动,排查起来十分痛苦。

3. 完整安装实操:从 tar.gz 到能稳定运行的 MySQL

3.1 解压与目录规划

先把所有需要的文件放到一个临时目录,比如/opt/pkg,然后执行解压:

cd /opt/pkg tar -xf mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz

解压后会出现一个名为mysql-5.7.32-linux-glibc-2.28-aarch64的目录。为了方便管理,我习惯把它移动到标准位置/usr/local/mysql

mv mysql-5.7.32-linux-glibc-2.28-aarch64 /usr/local/mysql

这里有一个目录规划的心得:不要把数据目录放在/usr/local/mysql/data,生产环境建议单独规划一个数据目录,比如/data/mysql。原因很实际:系统盘一旦被日志或大文件写满,整个系统都会出问题;数据目录放在独立的挂载点(独立数据盘)上,既能隔离容量风险,也方便备份和迁移。如果条件允许,日志目录和数据目录再分开,比如 error log、binlog 都有自己的位置,这样排查问题的时候路径一目了然。

3.2 创建运行用户并准备目录权限

MySQL 服务绝不能用 root 运行。原因是纵深防御的基础原则:即使 MySQL 被攻击者拿到代码执行权限,也不能直接获得 root shell。官方提供的二进制包里自带安装脚本思路,也要求先创建 mysql 用户:

groupadd mysql useradd -r -g mysql -s /bin/false mysql

-r表示创建系统用户,-s /bin/false表示该用户不能登录 shell,进一步降低风险。接着创建数据目录和日志目录,并把属主改为 mysql 用户:

mkdir -p /data/mysql/logs chown -R mysql:mysql /data/mysql

注意这里不要漏了 logs 目录,否则后面配置慢查询日志、错误日志的时候,MySQL 会因为目录不存在而拒绝创建日志文件,进程直接异常退出。

3.3 编写 my.cnf 配置文件

MySQL 会依次读取多个位置的配置文件,常见路径包括/etc/my.cnf/etc/mysql/my.cnf$basedir/my.cnf等。为了统一管理,我通常把配置集中在/etc/my.cnf,里边的基础内容如下:

[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock pid-file=/data/mysql/mysql.pid log-error=/data/mysql/logs/error.log slow_query_log=1 slow_query_log_file=/data/mysql/logs/slow.log long_query_time=2 port=3306 server-id=1 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci default-storage-engine=InnoDB max_connections=500 innodb_buffer_pool_size=2G

几个参数逐个解释一下。basedirdatadir指定了二进制目录和数据目录,这是所有路径配置的核心。socket=/tmp/mysql.sock是本地客户端通过 Unix socket 连接的路径,很多报错都是因为客户端和服务端的 socket 路径不一致导致的。character-set-server=utf8mb4已经是现代应用的标配,utf8mb4 完整支持所有 Unicode 字符(包括 emoji 和生僻汉字),老的 utf8 字符集实际只能存 3 字节的编码,会丢字符。innodb_buffer_pool_size是 InnoDB 最重要的内存参数,建议设置为物理内存的 50% 到 70%,但如果是多实例部署需要按实例均分。

自检技巧:写完配置后,可以先用mysqld --defaults-file=/etc/my.cnf --verbose --help | grep -E '^datadir|^basedir'检查配置是否被正确读取,避免因为配置路径写错导致服务起不来。

3.4 初始化数据目录

MySQL 5.7 开始废弃了老的mysql_install_db工具,改用mysqld --initialize直接初始化数据目录。这一步会在 datadir 中创建 mysql 系统库、InnoDB 系统表空间、redo log 等基础文件。注意两条命令的区别:

# 方式一:生成随机 root 临时密码,输出到错误日志 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql # 方式二:生成空 root 密码,适合测试环境,初始化后立即设置密码 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql

生产环境推荐用方式一。初始化完成后,临时密码在 error log 里,直接搜索即可:

grep 'temporary password' /data/mysql/logs/error.log

如果采用空密码的方式,初始化后要做的第一件事就是登录并修改密码,这就引出了后面 3.6 的内容。

3.5 启动服务与设置开机自启

启动 MySQL 的方式有三种:mysqld_safemysql.server、systemd。MySQL 官方二进制包自带的support-files/mysql.server脚本本质上是调用了mysqld_safe守护进程,它会监控 mysqld 的运行状态并在崩溃时尝试自动拉起。这种方式在 SysVinit 的系统上很好用,但在现代 systemd 系统上,我更推荐自己写一个 systemd unit 文件,这样开机自启、失败重启、日志管理都交给 systemd 统一处理。

/etc/systemd/system/mysqld.service中写入:

[Unit] Description=MySQL Server After=network.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=65535 Restart=on-failure [Install] WantedBy=multi-user.target

然后执行:

systemctl daemon-reload systemctl start mysqld systemctl enable mysqld

LimitNOFILE必须设置,MySQL 高并发状态下会打开大量文件句柄,系统默认的 1024 很快就会被耗尽,表现为连接报错Too many open filesRestart=on-failure让 mysqld 意外退出时自动重启,减少单点故障对业务的影响。

3.6 首次登录、修改密码与安全加固

服务启动后,用临时密码登录(如果初始化时用的--initialize方式):

/usr/local/mysql/bin/mysql -uroot -p

登录后不要急着配置业务,先做三件安全基础工作。第一,修改 root 密码。5.7 版本的密码字段和旧版本不同,直接执行ALTER USER即可,语法如下:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword';

第二,删除默认的匿名用户。MySQL 初始化时默认可能有空用户名的匿名账号,这些账号虽然没有密码,却能在本机以任意用户名登录,必须清掉:

DELETE FROM mysql.user WHERE user=''; FLUSH PRIVILEGES;

第三,创建独立的业务账号,而不是让业务系统直连 root。业务账号尽量限定主机和库表范围:

CREATE USER 'app'@'192.168.%.%' IDENTIFIED BY 'AppPassword123'; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'192.168.%.%'; FLUSH PRIVILEGES;

这个做法的好处是:即使业务账号被破解,攻击者也无法访问其他库,更不能执行 DDL 操作。root 账号只保留在本地使用,禁止远程连接,这是最基本的数据库安全底线。

4. 安装过程中常见的坑与排查实录

这一节记录的是我在 aarch64 平台安装 MySQL 时实际遇到过的几个典型问题,每一个都曾经卡住过我不少时间。整理成速查表如下,方便直接对照检查:

故障现象根本原因解决方案
libaio.so.1: cannot open shared object file缺少 libaio 动态库yum install -y libaioapt install -y libaio1
libc.so.6: version GLIBC_2.28 not found系统 glibc 版本低于编译要求升级系统(非手动升级 glibc)或换用低 glibc 版本的 MySQL 包
Can't connect to local MySQL server through socket '/tmp/mysql.sock'MySQL 未启动或 socket 路径不一致检查进程是否存活,systemctl status mysqld,核对 my.cnf 中的 socket 路径
[ERROR] InnoDB: Operating system error number 13 in a file operation数据目录权限不足或 SELinux 拦截检查 datadir 属主,确认 SELinux 对数据目录的上下文配置
[ERROR] Could not open /data/mysql/logs/error.log日志目录不存在或没有写权限提前创建目录并chown mysql:mysql

4.1 libaio 缺失

这个错误我几乎每次在新环境安装都会遇到。症状是 mysqld 一启动就报错退出,看错误日志才能发现动态库缺失。解决办法很简单,根据系统发行版安装对应的包即可。这里有个容易踩的小坑:有些精简版的系统镜像连yum/apt的缓存源都没有更新,安装前先yum makecacheapt-get update,否则会报“找不到软件包”。

4.2 GLIBC_2.28 not found:不要手动升级 glibc

这是很多拿到新版本 MySQL 包的朋友最容易崩溃的错误。报错的意思是二进制包运行时依赖的 glibc 符号版本在系统当前 glibc 中不存在。遇到这个问题的第一反应千万不要是手动下载 glibc 源码去编译升级,这个操作一旦出错,系统可能连/bin/ls都跑不起来。

正确处理方式有两种。一是升级操作系统到内置 glibc 2.28 以上版本的系统——注意是升级操作系统,不是单独升 glibc。比如已有的 CentOS 7(glibc 2.17)可以迁移到较新的系统版本(如 CentOS 时代的较新版本,或改用基于更高 glibc 的现代发行版)。二是找一个基于更低 glibc 编译的 MySQL 包,比如官方历史上为 CentOS 7 提供的通用 Linux x86_64 包,或者基于 aarch64 的适配包。第三条路是干脆用 Docker 镜像,镜像内自带了合适的运行库,绕开宿主机 glibc 版本限制。总之,手动升级 glibc 是我个人强烈不建议的路径,风险远大于收益。

4.3 socket 连接失败的定位思路

本地客户端连 MySQL 时报Can't connect to local MySQL server through socket '/tmp/mysql.sock',第一反应应该是确认服务到底有没有在跑。ps aux | grep mysqld看一下进程,ss -lntp | grep 3306看一下端口监听状态。如果进程没跑,去看 error log 找退出的真正原因。如果进程在跑但 socket 路径不对,多半是客户端和服务端读取的 my.cnf 不一致,在 mysql 客户端连接时显式指定 socket 路径可以快速验证:mysql -S /tmp/mysql.sock -uroot -p

4.4 AppArmor / SELinux 导致的权限问题

这个问题比较隐蔽。Ubuntu 上 AppArmor 默认对 MySQL 的数据目录有约束策略,如果你把 datadir 自定义到了/data/mysql,AppArmor 的配置文件中没有这个路径,就会拒绝访问。CentOS/RHEL 系列的 SELinux 同理。排查手段是看 audit 日志,比如grep -i denied /var/log/audit/audit.log,如果确认是安全模块拦截,测试环境可以临时放行,生产环境还是建议把数据目录加进白名单或调整上下文。

4.5 初始化之后 mysql 命令键反了 / 登录报错

实际操作中还有一个容易忽略的问题:顺手把/usr/local/mysql/bin加入 PATH 的时候容易覆盖系统自带的 mysql 客户端版本。比如系统自带的是 MariaDB 客户端,或者另一个版本的 MySQL 客户端,登录时可能因为协议不兼容导致报错。建议在/etc/profile.d/mysql.sh中单独写一行:

export PATH=/usr/local/mysql/bin:$PATH

然后重新登录 shell 或者source一下。这样在终端里直接输入mysql就是新安装的客户端,避免版本错乱。

5. 安装完之后的日常运维小提醒

服务能跑起来只是第一步,几个细节值得在安装完成之后顺手做好。比如把/usr/local/mysql/bin加进 PATH,这样日常执行mysqlmysqldump不用写全路径。再比如定期检查 error log 的大小,MySQL 运行时间长了,error log 里会积累大量访问日志和告警信息,建议配置日志轮转。另外,如果业务量还在增长,后续要关注innodb_buffer_pool_sizemax_connections是否贴近瓶颈,aarch64 平台上的 MySQL 调优思路和 x86_64 基本一致,核心还是先看内存、磁盘 I/O 和慢查询日志。

根据我个人在 aarch64 服务器上的实操体会,这个包只要提前确认好 glibc 版本和数据目录权限,安装过程其实非常顺利。最后再分享一个小技巧:安装过程中每执行完一个关键步骤,都顺手用echo $?确认返回码为 0,尤其是在初始化数据目录和启动服务这两个节点。这个习惯让我避免过不少“假装成功、后面连环报错”的局面——比如初始化因为目录权限失败但提示不明显,后面启动服务时错误日志才暴露真正原因。写脚本自动化安装的话,这个习惯尤其重要。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询