
简介这份压缩包是面向64位ARM架构AArch64/ARM64的MySQL 5.7.32稳定版主要用于树莓派单板计算机、ARM架构服务器等设备上的数据库部署由于官方很少提供对应的aarch64预编译版本常见的x86二进制包无法在ARM处理器上运行glibc版本差异也会引发启动异常这份专门编译的安装压缩包正好解决了这类跨平台兼容性问题。压缩包约510MB内含近1.5万个文件除mysqld服务端、数据库初始化程序等核心可执行文件外还包含动态链接库、头文件、配置模板以及大量test和result测试用例覆盖功能、回归与故障场景整体形成一套结构完整、目录清晰的MySQL安装目录树。目前已有1416人学习下载适合希望在ARM平台上快速搭建数据库的运维人员与开发者。包内自带的mysql_secure_installation脚本可收紧root远程访问并清理匿名用户mysqldump与mysqlcheck工具便于数据备份和一致性检查多样的cnf配置模板还能根据内存资源调整innodb_buffer_pool_size等关键参数。binlog示例与测试套件则帮助理解事务日志、复制、多版本并发控制等机制遇到异常时可对照官方预期行为排障借助这个现成的aarch64二进制包可省去源码交叉编译的复杂流程显著降低部署门槛和时间成本无论是用于生产环境的快速上线还是用于学习MySQL在ARM平台上的部署与排错实践都能直接受益。 前阵子在一台ARM64架构的Linux服务器上部署MySQL从官网下载了mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz这个包。文件名看起来很长但里面每个字段都是有用信息版本号、系统类型、glibc依赖、CPU架构。很多人在这上面吃过亏——拿着x86_64的包在ARM机器上装或者系统glibc版本不够启动时一脸懵。这篇文章我把从零到正常跑通的全过程写出来包括每个关键步骤背后的原因以及我实际踩过、排查了半天的坑。适合在国产化服务器、ARM云主机、树莓派和RK3588这类开发板上装MySQL的同学参考。1. 先拆解文件名这串字符决定了“能不能装上”1.1 每个字段都有含义mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz这个文件名可以拆成四部分理解mysql-5.7.32MySQL版本号。5.7.32是2020年10月发布的版本属于5.7系列中比较稳健的一个版本。5.7系列虽然官方已停止更新但在生产环境里的存量仍然很大很多遗留业务系统、内部管理系统都跑在它上面。linux面向Linux操作系统和Windows、macOS的安装包区分开。glibc-2.28这是容易被忽略但非常重要的字段。它表示这个二进制包编译时链接的glibcGNU C Library最低版本是2.28。也就是说目标机器的glibc版本必须不低于2.28否则程序在运行时找不到对应的符号直接报version GLIBC_2.28 not found之类的错误。aarch64CPU架构对应ARMv8-A及以上的64位指令集。在Linux里uname -m的输出通常就是aarch64。Debian系发行版有时叫它arm64但官方MySQL命名的习惯是aarch64。1.2 这个包适合什么场景MySQL官方针对Linux提供了好几种分发形式RPM包、Deb包、源码包以及这种通用的tar.gz二进制包。tar.gz包最大的好处是不依赖特定发行版的包管理器RHEL系、Debian系、国产化发行版都适用解压就能用。适合选这个包的场景基本是这几类ARM架构的云服务器比如部分云厂商提供的aarch64实例。国产化替代环境常见芯片包括鲲鹏920、飞腾FT-2000、麒麟等系统多为麒麟V10、统信UOS。嵌入式或边缘计算设备比如RK3588、树莓派4B/5这类能跑完整Linux的板子。想在容器外裸机部署、又不愿被包管理器绑定死的时候。如果机器是x86_64架构这个包是不能用的必须下载x86_64版本。这个我在后面会专门讲怎么确认。2. 安装前最要紧的两项检查CPU架构和glibc版本2.1 先在机器上确认 uname -m拿到服务器第一件事不是急着解压而是确认架构是不是真的匹配。用一条命令就能看uname -m输出是aarch64说明架构没问题输出是x86_64说明这是Intel/AMD架构的机器得去下载对应的x86_64版本。另外可以用lscpu看更详细的信息lscpu | grep Architecture输出Architecture: aarch64即确认。这个检查看似简单但真的很重要。我见过有人把x86_64的包传到ARM服务器上解压没问题一执行mysqld --initialize就报bash: ./bin/mysqld: cannot execute binary file: Exec format error这种报错就是在告诉你二进制格式和CPU架构不匹配。不用怀疑直接换成对应架构的包就行。2.2 查glibc版本比想象中更重要架构匹配之后还要确认glibc版本。这个包编译时要求glibc 2.28所以目标机器上glibc必须达标。查看命令getconf GNU_LIBC_VERSION输出类似glibc 2.28或glibc 2.31只要不低于2.28就可以。也可以这样ldd --version | head -n1为什么这一步要单独强调因为很多ARM开发板默认系统的glibc版本是2.27甚至更低。比如树莓派官方系统很老版本基于Debian 10buster时glibc是2.28勉强能用但有些精简的嵌入式系统只有2.27这时候用这个包就会启动失败。2.3 版本不够时的备选方案如果检查完发现glibc版本不满足我的建议是先不要硬碰硬去升级或降级glibc。glibc是Linux系统最底层的C运行库几乎所有用户态程序都依赖它。手动编译升级glibc风险极高——一旦中途出错系统里大部分命令ls、cat、bash都可能无法运行基本等于把系统搞瘫。网上那种“把高版本glibc替换成低版本”的做法更是危险强烈不建议在生产环境尝试。合理的做法是选一个匹配当前glibc版本的MySQL版本。比如系统glibc是2.27或2.26可以找MySQL 5.7系列的早期版本或者换成源码编译方式。另一个选择是用Dockerdocker run -d --name mysql57 \ -e MYSQL_ROOT_PASSWORDyourpassword \ -p 3306:3306 \ mysql:5.7.32Docker方式绕过了宿主机的glibc版本问题因为镜像自带了完整的运行环境。之前VSCode Remote SSH连接ARM Linux开发板时报过“远程主机不符合 glibc 和 libstdc 先决条件”本质也是同一类问题——远程端运行环境的glibc版本太低。解决思路一样要么升级系统要么换匹配的组件版本。3. 解压、建用户、定目录三步把“家”先安好3.1 创建mysqld专用系统用户MySQL建议以专用用户运行这是安全基线也是mysqld初始化时的强制要求。直接拿root跑会报错[ERROR] Fatal error: Please read Security section of the manual to find out how to run mysqld as root!创建用户和用户组groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql-r表示创建系统用户-s /sbin/nologin表示不允许该用户登录shell这是最佳实践避免因账号被暴破直接拿到shell。3.2 解压到 /usr/local 并做软链把安装包放到服务器上之后解压到/usr/localtar -zxvf mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz -C /usr/local cd /usr/local解压后会得到目录mysql-5.7.32-linux-glibc-2.28-aarch64名字太长而且以后升级版本时路径会跟着变不利于维护。建议做一个软链ln -s mysql-5.7.32-linux-glibc-2.28-aarch64 mysql这样以后所有操作都指向/usr/local/mysql升级时只需要替换软链指向不需要改配置文件和脚本。3.3 数据目录单独放别和安装目录混在一起安装目录basedir和数据目录datadir要分开这是运维的基本常识。原因有三数据目录独立后升级MySQL时只需要替换安装目录数据完全不受影响。系统盘如果被写满不会拖垮数据库。以后做备份、做快照直接针对数据目录操作权限控制也更清晰。我一般放在/data/mysqlmkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysqlchmod 750而不是777是为了防止其他用户读写数据目录。这一步经常被忽略后面初始化时就会出现权限不足的报错。解压出来的安装目录也要确认属主chown -R mysql:mysql /usr/local/mysql注意这里如果已经把/usr/local/mysql做了软链那么chown -R会顺着软链作用到真实目录没问题。4. 写一份能跑起来的 my.cnf参数先不用多关键是路径4.1 最小可运行配置模板很多教程会在my.cnf里堆一大堆参数对新手并不友好。我建议先写一份最小的可运行配置跑通之后再按需加参数。[client] port 3306 socket /tmp/mysql.sock [mysqld] user mysql basedir /usr/local/mysql datadir /data/mysql port 3306 socket /tmp/mysql.sock pid-file /data/mysql/mysql.pid log-error /data/mysql/mysql.err character-set-server utf8mb4 collation-server utf8mb4_general_ci skip-external-locking explicit_defaults_for_timestamp true这里每个参数都有用user mysql指定mysqld以mysql用户启动配合systemd使用。basedir、datadir程序目录和数据目录必须和实际路径一致。socket本地连接的Unix套接字路径客户端工具默认会找这里。pid-file进程PID文件位置systemd需要依据它判断进程状态。log-error错误日志路径初始化临时密码也在这里。character-set-server utf8mb4MySQL 5.7默认字符集是latin1不设置的话建表时中文容易乱码建议默认就配utf8mb4。explicit_defaults_for_timestamp true避免TIMESTAMP字段在5.7升级后的行为差异导致报错。配置文件的位置可以放在/etc/my.cnfMySQL启动时会自动读取这个路径。4.2 路径权限与socket/pid文件的关系配置里的路径MySQL启动时都会尝试写入。常见问题是/tmp/mysql.sock所在目录任何用户都能写但需要注意SELinux限制。pid-file和log-error都放在/data/mysql这个目录属主必须已经改成mysql。socket和pid-file的路径最好不要用相对路径MySQL对相对路径的解析容易出问题。如果启动时报Cant create/write to file /data/mysql/mysql.pid先检查目录属主再检查SELinuxls -ld /data/mysql chown -R mysql:mysql /data/mysql4.3 字符集、时区在初始化前就想清楚字符集和时区这类全局性配置最好在初始化前定下来。如果等数据写入后再改字符集代价会非常麻烦。MySQL 5.7 支持在[mysqld]下直接设置[mysqld] character-set-server utf8mb4 collation-server utf8mb4_general_ci default-time-zone 08:00注意时区参数在同步类场景里特别重要。如果业务分布式部署建议统一用08:00而不是系统时区避免各节点时区漂移导致时间不一致。如果业务有跨时区需求也可以保持默认让应用层自行处理。5. 初始化数据库第一次看到随机密码别慌5.1 --initialize 与 --initialize-insecure 的区别MySQL 5.7 之后data目录不再由安装脚本自动初始化必须手动执行。这一步会在数据目录下创建mysql系统库、系统表以及root账号。cd /usr/local/mysql bin/mysqld --defaults-file/etc/my.cnf --initialize --usermysql--initialize会为root生成一个随机临时密码这个密码写在错误日志里。好处是安全坏处是很多人一时找不到密码在哪。如果只是本地开发环境可以考虑--initialize-insecure它会生成一个空密码的root账号bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure --usermysql两种方式初始化完成后/data/mysql下会生成一堆文件包括mysql系统库的目录、ibdata1、ib_logfile0等。如果看到这些文件说明初始化成功了。5.2 从错误日志里找临时密码使用--initialize方式初始化后临时密码在错误日志里grep temporary password /data/mysql/mysql.err输出类似[Note] A temporary password is generated for rootlocalhost: kL#8xPq!z2aAkL#8xPq!z2aA就是临时密码。注意临时密码里可能包含特殊字符复制时不要漏字符。如果日志里没有这行可能是初始化时日志路径没配对或者初始化失败。先确认命令执行时没有报错再看/data/mysql目录下是否生成了mysql.err文件。5.3 初始化失败的常见原因报错对照表初始化失败是新手最容易卡住的地方我整理了几个最常见的报错和对应的解决思路报错信息原因解决办法--initialize specified but data directory exists and is not emptydatadir目录非空清空/data/mysql下的文件确保目录为空再重试Cant create/write to file /data/mysql/mysql.pid目录权限不足chown -R mysql:mysql /data/mysqlerror while loading shared libraries: libaio.so.1缺少libaio依赖库yum install -y libaio或apt install -y libaio1version GLIBC_2.28 not foundglibc版本低于要求升级系统或换更老版本的MySQL初始化只做一次不需要重复执行。如果中途失败并清除了datadir重新初始化前一定确认目录属主。6. 用 systemd 管理以后不用每次手动敲 mysqld_safe6.1 编写 mysql.service 单元文件很多人习惯直接用mysqld_safe 启动但这只适合临时验证。生产环境建议用systemd管理这样能实现开机自启、崩溃自动拉起、日志统一管理。创建服务文件/etc/systemd/system/mysql.service[Unit] DescriptionMySQL Server 5.7.32 Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile/data/mysql/mysql.pid ExecStart/usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s QUIT $MAINPID PrivateTmpfalse [Install] WantedBymulti-user.target这里的关键点是Typeforkingmysqld_safe会fork出mysqld子进程服务类型必须选forkingsystemd靠PIDFile确认主进程。PIDFile必须和my.cnf里的pid-file一致。ExecStart用了mysqld_safe它会负责守护mysqld进程崩溃时能自动重启。6.2 启动、开机自启与状态检查编写完成后按顺序执行systemctl daemon-reload systemctl enable mysql systemctl start mysql systemctl status mysqlenable会添加开机自启start启动服务。status输出里有Active: active (running)表示启动成功。如果启动失败先用journalctl -u mysql查看systemd日志再结合/data/mysql/mysql.err排查。不要反复盲目systemctl start先搞清楚原因。停止服务systemctl stop mysql这一套配好之后MySQL就和其他系统服务一样走正常的启动、停止、重启流程了运维起来省心很多。7. 登录、改密、放远程上线前最后一步7.1 用临时密码登录并立即改密初始化完成后登录/usr/local/mysql/bin/mysql -uroot -p输入临时密码后进入MySQL客户端。此时会提示密码已过期必须立刻修改ALTER USER rootlocalhost IDENTIFIED BY NewStrongPass!123;MySQL 5.7 默认安装了密码强度插件新密码必须同时包含大小写字母、数字和特殊字符长度至少8位。如果只是测试环境不想被规则束缚可以临时降低校验级别SET GLOBAL validate_password_policy LOW;但不建议生产环境这么做。密码复杂度是防暴破的第一道防线。7.2 创建业务账号而不是开放root另一个常见误区是直接用root去连业务或者把root账号的host改成%允许任意主机登录。这两种做法都不可取。正确做法是创建独立的业务账号CREATE USER app% IDENTIFIED BY AppPass!123; GRANT ALL PRIVILEGES ON appdb.* TO app%; FLUSH PRIVILEGES;app账号只授appdb库的权限即使被攻破影响范围也有限。%表示允许任意主机连接如果业务IP固定最好换成具体IP例如app192.168.1.10。7.3 防火墙与端口确认远程连接不上时先确认端口是否监听ss -lntp | grep 3306如果看到LISTEN正常再看防火墙。CentOS/麒麟等使用firewalld的系统firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload使用iptables或其他防火墙的按对应命令放行3306。现在很多云服务器还有安全组也要在控制台放行。8. 我在ARM机器上踩过的坑都是日志级别的问题8.1 libaio.so.1 缺失初始化时报mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory这个坑在精简系统上特别常见因为MySQL官方二进制包依赖libaio动态库而最小化安装的系统默认没有装。解决办法# CentOS / RHEL / 麒麟 yum install -y libaio # Debian / Ubuntu apt install -y libaio18.2 glibc版本不足的报错长什么样如果机器的glibc版本低于2.28执行mysqld时会看到类似bin/mysqld: /lib64/libc.so.6: version GLIBC_2.28 not found这个问题的处理思路在2.3已经说过不要轻易动glibc优先换匹配的MySQL版本。根据我的经验遇到这类问题用Docker跑MySQL是成本最低的方案。8.3 国产化平台安装时的额外注意点在麒麟V10、统信UOS这类系统上安装总体流程和RHEL系一致但有几个细节确认系统是aarch64版本。部分国产化设备还会跑32位系统这时候需要安装32位兼容库。系统可能默认没有配置软件源安装libaio依赖时需要用安装光盘或导出的本地源。如果遇到SELinux导致的问题可以先getenforce查看状态确认是SELinux拦截后再决定是否调整策略不要一上来就盲目关闭。国产化系统上我的实测经验是glibc版本通常都能满足2.28以上麒麟V10 SP1、UOS 20都是glibc 2.28但个别厂商的定制系统版本很旧安装前务必先检查。8.4 ldd 检查 not found 一网打尽不管遇到什么样的动态库缺失直接看依赖关系是最快的ldd /usr/local/mysql/bin/mysqld | grep not found这条命令会一次性列出所有未找到的动态库。缺什么就装什么比一条条试错快得多。另外还有个小技巧libncurses.so.5缺失在某些精简系统上会出现RHEL系可以装ncurses-libsDebian系可以装libncurses5。如果装新版本库依然报缺libncurses.so.5多半是系统提供的兼容包没装全Google搜索“当前发行版 libncurses5”能找到对应的包名。我在实际部署中最喜欢用ldd | grep not found这条命令做一次性体检避免启动时被各种缺失库轮番恶心。MySQL 5.7.32 在 aarch64 Linux 上的安装其实不复杂关键是把架构、glibc版本、目录权限这几个前置条件一次确认到位。我把这套步骤反复在几台不同品牌的ARM服务器上验证过按照“检查环境 - 解压建目录 - 写配置 - 初始化 - systemd托管 - 安全设置”的顺序走下来基本不会出大问题。最后再分享一个实用习惯每次操作前把mysql.err文件清空或备份一下这样排查问题时不会混入历史报错定位效率会高很多。本文还有配套的精品资源点击获取