简介:用于ARM64架构Linux系统的MySQL 5.7.44数据库安装包,适配麒麟v10等国产化环境,为开发者与运维人员提供免编译部署方案,解决ARM平台下数据库安装繁琐、旧版本安全漏洞的问题。ARM架构低功耗、高性能的特点,使该版本在移动应用、物联网及小型服务器场景中尤为实用,同时修复了旧版漏洞并带来性能提升。压缩包共包含2000个文件,其中876个测试文件、604个inc头文件、234个opt选项文件构成主体,还有so动态库、sql脚本、cnf配置等配套内容,整体约519MB,解压后即可部署。已有1893人下载学习。包内完整包含MySQL服务端二进制、客户端连接库、默认配置模板以及大量测试用例和SQL脚本,既可直接用于ARM64服务器或嵌入式设备的生产环境,也可作为安全加固与功能验证的参考,帮助使用者快速掌握该版本在国产系统上的部署与维护要点。 前阵子在一台基于鲲鹏处理器的 ARM 平台上部署 MySQL 5.7.44,顺手把mysql-5.7.44-linux-aarch64.tar.gz这个包从下载到跑起来完整走了一遍。本来以为和 x86 一样解压就能用,结果还是踩了几个小坑,查资料又发现网上写 ARM 架构 MySQL 安装的文章很少,而且很多都是老版本或者一笔带过。这篇就基于我的实际过程,把 ARM 架构下用官方 aarch64 二进制包安装 MySQL 5.7.44 的完整思路、步骤和排错记录整理出来。
这套流程适用于国产化服务器(鲲鹏、飞腾)、树莓派 4B/5、RK3588 等一切aarch64架构的设备,适合需要在 ARM 上跑 MySQL 5.7 的运维、嵌入式工程师和后端开发参考。我用的是 CentOS 7(aarch64 版)作为演示系统,其他发行版操作大同小异。
1. 为什么选 5.7.44 的 aarch64 二进制包
1.1 这个包解决的核心需求
MySQL 5.7 是当前生产环境里存量最大的版本之一,很多老旧业务系统只兼容 5.7 的语法和特性,直接迁到 8.0 往往要改一大片代码。而 Oracle 官方提供的 MySQL 5.7 在 ARM 平台上的支持方式,主要就是mysql-5.7.44-linux-aarch64.tar.gz这个二进制包,它针对 aarch64 架构预编译好了,解压后通过初始化数据目录就能直接跑,不需要自己用源码交叉编译。
MySQL 官方在 5.7 系列里从 5.7.28 左右开始提供 aarch64 的预编译二进制包,5.7.44 是 5.7 系列的最后一个维护版本,修复了大量安全漏洞(包括一堆 CVE),所以在 ARM 上部署 5.7,强烈建议直接用 5.7.44 而不是老版本。
1.2 为什么不选 yum 安装或 Docker
很多人在 ARM 上装 MySQL 第一反应是yum install mysql-server。这个方案在 CentOS 7 上可行,但有两个问题:默认源里的 MySQL 版本通常五花八门(有的甚至是 MariaDB),而且版本老旧,安全补丁跟不上;另外你无法灵活控制安装目录、数据目录、配置参数,对生产环境的规范化管理不友好。
有人会说用 Docker 跑 MySQL 镜像多省事。确实,如果环境允许容器化,docker run -d --name mysql5.7 -e MYSQL_ROOT_PASSWORD=xxx mysql:5.7一行命令就搞定了。但很多 ARM 服务器所在的网络环境无法访问公网镜像仓库,或者出于安全合规要求不让用容器,只能裸装二进制。还有一些嵌入式和信创场景,系统本身裁剪得很干净,yum 源都没有,更别说 Docker 了。
所以mysql-5.7.44-linux-aarch64.tar.gz这种官方二进制包成了最通用、最可控的安装方式。它不依赖任何包管理器,一个 tar 包到处可用,这也是我选择它的核心理由。
2. 环境评估与安装前准备
2.1 确认平台真的是 aarch64
开始之前先做一件事:确认目标机器的架构。别看 CPU 型号觉得"应该是 ARM",一定要用命令验证。
uname -m # 输出 aarch64 表示 64 位 ARM 架构 # 输出 armv7l/armv6l 表示 32 位,需要用另外的 arm 包(Oracle 也提供 32 位包)再顺便看一下操作系统版本和 glibc 版本:
cat /etc/redhat-release # CentOS Linux release 7.9.2009 (AltArch) ldd --version | head -n1 # ldd (GNU libc) 2.17为什么看 glibc?因为 MySQL 的 tar.gz 包虽然说是"通用二进制",但它动态链接了系统的 glibc,如果你的系统 glibc 版本太低,可能起不来。MySQL 5.7.44 官方要求 glibc 2.12 以上(对应 CentOS 6 以上),CentOS 7 的 2.17 完全满足。如果是国产化系统(如麒麟、统信 UOS),一般是基于 CentOS 7 或 Ubuntu 的源码构建的,glibc 版本也基本够用。
2.2 补齐运行时依赖库
这是最容易踩坑的一步。ARM 架构的 CentOS 7 默认安装往往缺少 MySQL 运行所需的几个动态库,不加装的话,初始化时会报error while loading shared libraries: libaio.so.1: cannot open shared object file之类的错误。
# 先检查缺什么 ldd /tmp/mysql-5.7.44-linux-aarch64/bin/mysqld | grep "not found" # 通常缺这三个 libnuma.so.1 libaio.so.1 libncurses.so.5补装方法:
yum install -y libaio libaio-devel numactl-libs ncurses-libs如果你的环境连 yum 源都没有(纯离线环境),需要去 CentOS 7 aarch64 的 rpm 包里找这几个库,拷贝到/usr/lib64/下。这里有个小技巧:用rpm -ivh --nodeps强制安装 rpm 包,不需要处理依赖关系,因为 MySQL 只是需要这几个 .so 文件存在而已。
注意:libncurses.so.5 在较新的系统上可能变成了 libncurses.so.6,直接把 .so.6 软链接成 .so.5 通常也能跑,但生产环境建议还是装真正的 .so.5,避免奇怪的显示问题。
2.3 创建专用账号与规划目录
绝对不建议用 root 直接跑 mysqld,安全风险太大。创建专门的 mysql 用户:
groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql目录规划上,我习惯把软件目录和数据目录分开,这样后续备份、重装都方便:
# 软件目录:/usr/local/mysql # 数据目录:/data/mysql # 日志目录:/data/mysql/logs mkdir -p /data/mysql/logs chown -R mysql:mysql /data/mysql3. 安装五部曲实战
3.1 解压与目录落位
先把安装包传到目标机器,比如放在/opt/下,然后解压到/usr/local/并把目录名规范化为mysql:
cd /opt tar -xzf mysql-5.7.44-linux-aarch64.tar.gz -C /usr/local/ cd /usr/local mv mysql-5.7.44-linux-aarch64 mysql chown -R mysql:mysql /usr/local/mysql解压之后看一下目录结构,确认bin/mysqld存在且是 aarch64 的 ELF 文件:
file /usr/local/mysql/bin/mysqld # ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked看到ARM aarch64就说明包架构没错。这里多说一句:曾有朋友在树莓派上不小心下载了 x86_64 的包,解压后 file 一看是x86-64,然后各种折腾,浪费了半天时间。架构一定要先确认。
3.2 编写最小可用 my.cnf
MySQL 5.7 对配置文件不敏感,但如果完全用自己的默认值,datadir会落在/var/lib/mysql,不太符合我的习惯,而且后续管理容易乱。所以我一般直接写一份最简单的 my.cnf,放在/etc/my.cnf:
[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock port=3306 pid-file=/data/mysql/mysqld.pid log-error=/data/mysql/logs/mysqld.log character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] socket=/tmp/mysql.sock default-character-set=utf8mb4这里几个参数说明一下:basedir是 MySQL 程序目录,datadir是数据目录,这两个是核心;socket指定本地连接用的套接字文件位置,客户端连接时如果 socket 路径不一致会报Can't connect through socket;character-set-server设为 utf8mb4 是为了支持完整的 Unicode(比如表情符号),这个在 5.7 上尤其重要。
如果你的机器内存小于 2GB,建议在[mysqld]下面追加这两行,否则 MySQL 5.7 默认的innodb_buffer_pool_size偏大会导致内存不够被 OOM Killer 杀掉:
innodb_buffer_pool_size=256M innodb_log_file_size=64M3.3 初始化数据目录
MySQL 5.7 使用mysqld --initialize来初始化数据目录,不像 5.6 那样用mysql_install_db脚本了(实际上 5.7 里也保留了 mysql_install_db,但官方已不建议用)。
初始化分两种:--initialize会生成随机 root 密码,--initialize-insecure会生成空密码的 root 账号。第一次安装我建议用--initialize-insecure,省去从日志里翻密码的麻烦,启动后自己再改密码:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql执行完看一眼数据目录是否生成:
ls -l /data/mysql/ # 应该能看到 auto.cnf、ibdata1、ib_logfile0、mysql/、performance_schema/ 等还有一个方法验证初始化日志有没有报错:
tail -n 20 /data/mysql/logs/mysqld.log常见报错之一是:
[ERROR] Could not create file /data/mysql/ib_logfile0这种情况 99% 是目录权限问题,检查一下chown -R mysql:mysql /data/mysql是否执行了,不要只看父目录权限。
3.4 启动服务与登录验证
初始化完成之后,先不要急着配 systemd,直接用命令行启动测试,这样错误信息能直接看到(systemd 会吞日志,排查起来麻烦一些):
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql &等两三秒,然后用 mysql 客户端登录:
/usr/local/mysql/bin/mysql -uroot --socket=/tmp/mysql.sock如果配置过程没问题,这里会直接进入 MySQL 命令行,mysql>提示符出现,说明服务正常。
如果客户端提示找不到
mysql.sock,先确认进程有没有起来:ps -ef | grep mysqld。再看 my.cnf 里 socket 路径和客户端连接用的 socket 路径是否一致。我见过最蠢的坑是把 socket 写在/var/lib/mysql/mysql.sock,然后客户端连/tmp/mysql.sock,自然连不上。
3.5 设置开机自启
命令行手动启动只是临时的,生产环境要配置为服务并开机自启。这里我用 systemd 管理,创建服务文件/etc/systemd/system/mysqld.service:
[Unit] Description=MySQL Server 5.7.44 After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target然后重载并启动:
systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld注意:如果之前手动启动过 mysqld,需要先杀掉那个进程,否则 systemd 起时会因为端口占用(或者 mysqld.sock 已经存在)报错。这个坑我踩过不止一次,每次都是启动失败后看日志才发现是旧的 mysqld 还没退干净。
4. 初始化安全配置与远程访问
4.1 root 密码重置
由于初始化用了--initialize-insecure,root 密码是空的,现在进入 MySQL 把它改掉:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword_2024'; FLUSH PRIVILEGES;MySQL 5.7 的密码校验机制默认开启了validate_password_policy,密码太弱会被拒绝。如果想设置简单密码(比如测试环境),可以先临时关掉这个插件,改完密码再开:
SET GLOBAL validate_password_policy = LOW;不过个人建议生产环境还是认真设一个强密码,别偷懒。
4.2 开通远程连接
MySQL 默认的 root 账号只允许 localhost 连接,远程访问需要显式授权。先创建专用的远程账号(不建议直接开放 root):
CREATE USER 'app'@'%' IDENTIFIED BY 'AppPassw0rd_2024'; GRANT ALL PRIVILEGES ON *.* TO 'app'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;同时检查防火墙,确保 3306 端口开放:
firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload如果系统没开 firewalld,而是用 iptables,对应放行规则自己加一行即可。
4.3 生产环境常用加固建议
MySQL 5.7.44 安装完、能连上,这只是第一步。实际部署时我还会做三件事:
第一,禁用 DNS 反向解析。在 my.cnf 里加一行skip-name-resolve,否则客户端连接时 MySQL 会尝试反查域名,内网环境没有 DNS 的情况下会导致连接非常慢甚至超时。
第二,绑定监听地址。如果这个 MySQL 只给本机应用用,bind-address=127.0.0.1会安全很多。如果需要局域网访问,再考虑注释掉这行或改成内网 IP。
第三,定期备份。写个简单的 crontab 任务,每天mysqldump一次全量备份到/data/backup,保留 7 天。5.7 这个版本不是云原生那种自动备份的方案,全靠运维自觉:
0 2 * * * /usr/local/mysql/bin/mysqldump -uapp -p'AppPassw0rd_2024' --all-databases --single-transaction | gzip > /data/backup/mysql_$(date +\%F).sql.gz注意 mysqldump 的定时任务密码不要明文写在命令行里,配合
--defaults-extra-file=/etc/mysql_backup.cnf把密码放在权限 600 的文件里更稳妥。
5. 常见问题与排查速查表
5.1 启动时报错 error while loading shared libraries
这是 ARM 环境最典型的坑,原因就是缺依赖库(前面 2.2 节提过)。典型的报错是:
/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory解决办法就是补齐libaio.so.1、libnuma.so.1、libncurses.so.5这三个库。如果系统里有对应的高版本 .so,可以尝试做个软链;如果完全没有,就得找离线的 rpm 包强制安装。
一个非常实用的验证方法:每次装完之后,执行ldd mysqld | grep "not found"检查是否全部链接成功,性能调优的前提是整个二进制能正常加载。
5.2 初始化时权限报错或目录生成失败
--initialize时报Permission denied,几乎都是因为数据目录归属不对,或者 SELinux 拦截。先执行chown -R mysql:mysql /data/mysql,还不行就查 SELinux:
getenforce # Enforcing 就说明 SELinux 开着CentOS 7 下最省事的做法是把 MySQL 数据目录加进 SELinux 白名单,或者直接对数据目录设置chcon -R -t mysqld_db_t /data/mysql。如果不想折腾 SELinux,临时setenforce 0可以快速验证是不是 SELinux 的问题,但生产环境不建议长期关闭。
5.3 客户端连接报 2002 Can't connect through socket
这个报错前面提过,核心原因是 socket 路径不一致。一个常见的使用场景是:mysqld 在/tmp/mysql.sock创建 socket,但 PHP 的 PDO 默认连/var/lib/mysql/mysql.sock,两边对不上。解决办法要么统一 socket 路径(推荐统一在/tmp),要么连接时显式指定:
mysql -uroot -p -S /tmp/mysql.sockPHP、Python 等语言连接时,DSN 里同样要写清楚 socket 路径。
5.4 内存不足导致 mysqld 被 OOM Kill
在小型 ARM 设备(树莓派 4B 8GB 之类的其实还好,1GB 内存的设备就危险)上,MySQL 5.7 默认配置偏吃资源。现象是服务跑着跑着突然消失了,查看dmesg能看到/usr/local/mysql/bin/mysqld被 OOM Killer 干掉。
解决办法在 3.2 节提过,限制innodb_buffer_pool_size和innodb_log_file_size。另外建议加一个 swap 文件(ARM 小机器上很有用):
fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile5.5 常见问题速查表
| 症状 | 可能原因 | 解决办法 |
|---|---|---|
| 启动报 libaio.so.1 not found | 缺少依赖库 | 安装 libaio |
| 启动报 libncurses.so.5 not found | 缺少依赖库 | 安装 ncurses-libs 或软链 .so.6 |
| 初始化失败 Permission denied | 目录权限不对 | 确认 mysql 用户对 datadir 有写权限 |
| systemd 启动失败但手动能启动 | 旧进程残留 | pkill mysqld后重启服务 |
| Can't connect through socket | socket 路径不一致 | 统一 my.cnf 和客户端的 socket 路径 |
| 远程连接超时 | DNS 反解析慢 | 加skip-name-resolve |
| 服务自动退出 | 内存不足被 OOM | 调小 buffer pool、加 swap |
6. 结尾的几点经验
这次在 ARM 上装 MySQL 5.7.44 整体不算复杂,但只要卡在一个依赖库或 socket 问题上,就够折腾半天。回顾整个过程,我最大的体会是:ARM 环境下安装软件,第一件事永远是确认架构和依赖,而不是直接执行安装命令。uname -m、ldd、file这三个命令能帮你避开绝大多数低级错误。
另外分享一个小建议:把mysql-5.7.44-linux-aarch64.tar.gz这个包下载到本地后,建议顺手做一次 SHA256 校验,对照 MySQL 官网给出的校验值,确保下载过程没有损坏或不被篡改。校验命令很简单:
sha256sum mysql-5.7.44-linux-aarch64.tar.gz最后,如果你是在树莓派上玩,或者只是测试环境,其实 Docker 方式会更轻松;但如果你跟我一样遇到的是国产化服务器、内网离线环境,那这篇手动部署的流程应该能帮你少走不少弯路。希望这份踩坑记录对你有用。
本文还有配套的精品资源,点击获取