简介:面向ARM64架构的MySQL 5.7.44 Linux安装包,专为64位ARM处理器环境打造,适用于国产麒麟v10及同类Linux系统。ARM架构凭借低功耗、高性能优势,在移动应用、物联网设备及小型服务器领域广泛使用,而aarch64作为64位指令集,支持更大内存空间与更复杂业务负载。该版本在修复既有安全漏洞的基础上,同步带来性能改进与安全增强,可满足资源受限及国产化替代场景下的数据库部署需求。压缩包共包含2000个文件,其中test测试用例占比最高,用于数据库功能与回归验证;inc和opt文件分别辅助编译配置与运行参数调优;h头文件、so动态库、sql脚本及cnf配置文件共同构成完整的运行与初始化体系,整体体积约519.16MB,目录结构清晰,便于按需检索与快速解压。目前已有1924人学习下载,适合系统管理员、数据库管理员及嵌入式开发者使用。解压后可直接获得mysqld服务端二进制、libmysqlclient客户端动态库、默认配置文件及配套示例脚本,免去源码编译的繁琐步骤,帮助用户快速完成环境初始化、参数调优与日常运维,尤其为国产化替代场景提供稳定可靠的数据库基础组件。
1. ARM 架构上的 MySQL 5.7.44:为什么我最终放弃编译,改用官方 aarch64 二进制包
年前接了一个某公司内部系统的数据库迁移需求,客户侧新采购了一批 ARM 架构服务器——用的是国产芯片,系统是银河麒麟。原计划是把现有 MySQL 5.7.23 逻辑迁移过去,结果发现新机器上根本没有现成的 MySQL 二进制包。当时我第一反应是源码编译,但折腾了两天后放弃了:ARM 设备上编译 MySQL 5.7 实在太痛苦,依赖库版本、编译参数、内存限制,每一步都是一堆玄学坑。后来查资料发现 MySQL 官方其实提供了 mysql-5.7.44-linux-aarch64.tar.gz 这个现成的 ARM 版本二进制包——这是 5.7 系列的最后一个版本,官方明确支持 aarch64 架构。替换思路瞬间清晰:把原来 MySQL 5.7 的数据目录原样迁过去,配套使用官方 aarch64 包,绕开了从源码编译的各种不可控因素。
这篇笔记就是完整的落地过程:从确认服务器架构、选择合适的下载源,到解压初始化、配置 systemd 管理服务,再到性能参数调优和排错技巧。适合两类读者:一类是刚接触国产化替代,需要在 ARM + 麒麟/UOS 上装 MySQL 5.7 的同行;另一类是已经装了但遇到启动失败、性能异常、字符集问题,想知道怎么排查的人。我尽量把每一步的选型理由和参数逻辑讲清楚,不写空话,直接给能抄的作业。
2. 确认硬件架构与下载合适的 MySQL 5.7.44 aarch64 包
2.1 先确认你的机器是不是真的 aarch64
很多人在 ARM 服务器上装 MySQL 翻车,第一步就死在架构识别上。常见误区是看到uname -m输出arm64或aarch64就以为是同一回事——它们在大多数情况下等价,但有些早期 ARM 设备输出的是armv7l,这类 32 位环境跑不了官方的 aarch64 包。我在某实验室的一台测试机上就见过这种情况,系统是 ARM 架构但内核是 32 位的,直接解压官方包然后执行mysqld --initialize会报cannot execute binary file。
安装前的第一件事,跑三条命令确认环境:
uname -m # 查看 CPU 架构,期望输出 aarch64 cat /etc/os-release # 查看发行版信息,确认 glibc 版本 getconf GNU_LIBC_VERSION # 查看 glibc 版本号,5.7.44 官方包要求 glibc 2.17 以上如果uname -m输出aarch64,说明是 64 位 ARM,可以用官方包;如果输出armv7l或armv6l,别折腾了,建议用发行版自带的 MySQL/MariaDB,或者换一台 64 位机器。
glibc 版本也很关键。官方 aarch64 包是在特定 glibc 版本下编译的,太老的系统(比如 CentOS 7 早期的 ARM 版本)可能缺少符号导致mysqld启动即崩溃。我遇到过一台系统 glibc 只有 2.12 的旧版 CentOS,启动时报relocation error: symbol not found,最后是升级系统组件解决的。
2.2 下载渠道对比:官方源 vs 镜像源
确认架构没问题后,就是下载mysql-5.7.44-linux-aarch64.tar.gz。MySQL 官方下载页有 aarch64 版本,但国内网络环境直连官方源速度不稳定,尤其是几十 MB 的包可能下到一半断掉。我一般优先用腾讯、阿里或华为的镜像源,速度稳定且支持断点续传。
这里要提醒一个很多人忽略的点:一定要下载文件名中带linux-aarch64的包。MySQL 官方对不同架构提供了不同的二进制包,x86_64 的包在 ARM 上解压后mysqld直接无法执行。不要下载那种只写着linux-glibc2.12的通用包——那通常是 x86_64 架构的,ARM 上用不了。
下载与校验的完整命令:
# 从镜像站下载(以某常用镜像站为例,实际地址以你可用源为准) wget -c https://mirrors.某镜像站.com/mysql/MySQL-5.7/mysql-5.7.44-linux-aarch64.tar.gz # 校验 MD5,确保下载完整 md5sum mysql-5.7.44-linux-aarch64.tar.gz # 对比官方给出的 MD5 值,不一致就重新下载 # 解压到 /usr/local 目录 tar -xzf mysql-5.7.44-linux-aarch64.tar.gz -C /usr/local/ # 创建软链接,后续升级时只需切换链接指向 ln -s /usr/local/mysql-5.7.44-linux-aarch64 /usr/local/mysql这里我用的是wget -c支持断点续传,大文件下载中断时不用从头开始。解压后创建软链是血泪经验:第一次直接用了完整目录名,后来升级版本时一堆脚本里的路径全要改,后悔药不好吃。用软链指向具体版本目录,升级时只需要改一个链接。
2.3 检查依赖库:libaio 和 ncurses 是硬依赖
解压完成别急着初始化,先检查依赖库。MySQL 5.7 官方包运行需要 libaio 库,麒麟和 UOS 系统默认没装。缺少 libaio 的表现很典型:初始化时报错error while loading shared libraries: libaio.so.1。
# 检查依赖库是否齐全 ldd /usr/local/mysql/bin/mysqld | grep 'not found' # 执行后看到 "libaio.so.1 => not found" 就需要安装 # 麒麟/UOS 等基于 Debian 的 ARM 系统 apt-get install -y libaio1 libncurses5 # CentOS/其他基于 RPM 的 ARM 系统 yum install -y libaio ncurses-libs检查依赖后先用ldd确认所有库都找到了再继续,这一步能省掉后面大量排错时间。
另外注意一个细节:MySQL 5.7 的初始化程序mysqld --initialize对/tmp目录有写入要求,某些安全加固过的系统/tmp是noexec挂载的,会导致临时文件无法执行。如果后续初始化报权限或执行错误,检查一下挂载参数。
3. 解压与目录规划:创建 mysql 用户、数据目录与 my.cnf 配置
3.1 目录规划的两种常见布局
MySQL 安装到/usr/local/mysql后,数据目录、日志目录、临时目录和 socket 文件的布局直接影响后续运维的复杂度。我在生产环境偏爱的布局如下,供参考:
- 安装目录:
/usr/local/mysql(软链) - 数据目录:
/data/mysql/data(独占一块数据盘,避免和系统盘抢 I/O) - 日志目录:
/data/mysql/logs(binlog、慢查询、错误日志分开) - socket 和 pid 文件:
/data/mysql/run
这样做的好处是:系统盘坏掉不会直接影响数据,备份恢复时只需要备份/data/mysql整个目录。很多初次部署的人习惯把数据目录放在/usr/local/mysql/data,系统盘满了数据库直接宕机,磁盘空间又很难清理,这属于基础规划失误。
3.2 创建用户、目录与基础配置
创建专用的 mysql 系统用户并完成目录授权。安全加固要求 MySQL 进程不能以 root 身份运行,这也是官方初始化脚本的默认检查项。
# 创建 mysql 系统用户,禁止登录 useradd -r -s /sbin/nologin mysql # 创建数据目录和日志目录 mkdir -p /data/mysql/data mkdir -p /data/mysql/logs mkdir -p /data/mysql/run # 目录归属 mysql 用户 chown -R mysql:mysql /data/mysql # 安装目录中的文件不需要 chown,但确保关键文件可读 chown -R mysql:mysql /usr/local/mysqluseradd -r创建的是系统账户,UID 低于 1000,-s /sbin/nologin禁止该用户登录 shell,符合最小权限原则。目录归属必须正确,否则初始化时mysqld无法在数据目录创建文件。
接下来是核心的my.cnf配置文件。5.7 对配置文件的读取路径有固定顺序,我用/etc/my.cnf作为统一入口:
[client] port = 3306 socket = /data/mysql/run/mysql.sock [mysqld] user = mysql port = 3306 basedir = /usr/local/mysql datadir = /data/mysql/data socket = /data/mysql/run/mysql.sock pid-file = /data/mysql/run/mysqld.pid log-error = /data/mysql/logs/error.log character-set-server = utf8mb4 collation-server = utf8mb4_general_ci skip-character-set-client-handshake # 二进制日志(做 PITR 恢复必需) server-id = 1 log-bin = /data/mysql/logs/mysql-bin binlog_format = ROW # InnoDB 缓冲池,设为物理内存的 50%-70% innodb_buffer_pool_size = 4096M innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # 连接数 max_connections = 500 # 表名大小写不敏感(Linux 默认敏感,部分业务代码依赖不敏感) lower_case_table_names = 0 # 默认存储引擎 default-storage-engine = InnoDB解释几个关键参数。character-set-server = utf8mb4直接解决中文乱码问题,这是 5.7 时代最重要的基础配置,用utf8mb4而不是utf8,因为utf8在 MySQL 里最多存 3 字节,部分生僻字和 emoji 会报错。lower_case_table_names = 0在 Linux 下是默认值,表名区分大小写,如果业务是从 Windows 迁移来的,程序里写死了小写表名,就需要改为 1,但一定要在初始化前定好,这个参数是不能动态修改的,改完必须重建表。
innodb_flush_log_at_trx_commit = 1表示每次事务提交都刷盘,数据安全性最高,但磁盘 I/O 压力大。如果业务对性能要求极高且能接受丢失最后一秒数据,可以改为 2。
3.3 初始化数据目录:mysqld --initialize 的完整参数
5.7 版本用mysqld --initialize代替了旧版的mysql_install_db,这一步会创建系统表、数据字典和默认的 root 账号。注意 5.7 初始化后 root 账号默认密码不是空,而是一段随机密码,输出在错误日志里,很多新手在这里就卡住了。
# 创建数据目录后执行初始化(必须用 mysql 用户) /usr/local/mysql/bin/mysqld --initialize \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/mysql/data \ --log-error=/data/mysql/logs/error.log # 初始化完成后查看错误日志获取临时 root 密码 grep 'temporary password' /data/mysql/logs/error.log # 输出示例:"A temporary password is generated for root@localhost: 例如 xxxxxxxx"初始化过程中--user=mysql表示以 mysql 用户身份运行初始化进程,--datadir必须和my.cnf中保持一致,不一致会报错。如果日志里出现[ERROR] Failed to initialize,逐行看错误信息,多数情况是目录权限、缺少依赖或配置文件参数错误。
5.7 初始化的一个重要细节:--initialize会生成一个随机 root 密码,同时 root 账号只能通过localhost连接,远程连接需要后续手动授权。如果使用--initialize-insecure,会生成空密码 root 账号,仅适合本地开发环境,生产环境不推荐。
3.4 启动前的验证:直接前台启动看日志
首次启动我建议直接前台执行mysqld,不用 systemd,这样能看到完整输出,排查问题更直接。运行几秒后用Ctrl+C停掉,确认无报错后再配置 systemd 服务。
# 前台启动验证(确认无报错后 Ctrl+C 停止) /usr/local/mysql/bin/mysqld \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/mysql/data # 看到 "ready for connections" 即代表启动成功 # 版本 5.7.44 的启动日志末尾通常会有 "mysqld: ready for connections"4. 配置 systemd 服务:开机自启与安全管理
4.1 编写 systemd unit 文件
生产环境必须用 systemd 管理 MySQL 进程,方便开机自启、崩溃自动拉起依赖管理。手动nohup启动的方式在重启后不会自动恢复,能不用就不用。
创建/etc/systemd/system/mysqld.service文件:
[Unit] Description=MySQL 5.7.44 Server After=network.target After=syslog.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld \ --basedir=/usr/local/mysql \ --datadir=/data/mysql/data \ --pid-file=/data/mysql/run/mysqld.pid Restart=on-failure RestartSec=5s LimitNOFILE=65535 [Install] WantedBy=multi-user.targetType=simple表示 systemd 认为ExecStart启动的进程就是主进程。Restart=on-failure在进程异常退出时自动拉起,RestartSec=5s是重启间隔。LimitNOFILE=65535很重要,MySQL 需要大量文件描述符,默认的 1024 限制会导致高并发下出现 "Too many open files" 错误。
配置文件写好后需要重载 systemd 并启用服务:
systemctl daemon-reload # 重载 systemd,识别新的 unit 文件 systemctl enable mysqld # 设置开机自启 systemctl start mysqld # 启动服务 systemctl status mysqld # 查看状态,确认 active (running)4.2 首次登录与密码修改
前面初始化生成了临时密码,第一次登录后必须立即修改密码,否则后续任何权限操作都无法进行。5.7 默认有密码复杂度插件校验,密码至少要 8 位且包含大小写字母和数字。
# 使用临时密码登录 mysql -uroot -p # 登录后立即修改 root 密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;这里踩过一个坑:如果在ALTER USER之前先执行了其他语句,有些操作可能因临时密码过期直接报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement。所以第一步必须是改密码,不用犹豫。
4.3 远程连接授权:区分内网与公网场景
如果业务系统在其他服务器上,需要授权 root 或单独账号允许远程连接。最安全的做法是创建专用的应用账号,而不是开放 root 远程登录,因为 root 远程连接被暴力破解的风险极高。
# 创建应用账号,仅允许内网网段访问 CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'10.0.0.%'; FLUSH PRIVILEGES; # 如果确定必须开放 root 远程(不建议) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '强密码' WITH GRANT OPTION; FLUSH PRIVILEGES;内网网段授权比%通配符安全得多。生产环境我从不开放root@'%',有远程管理需求时至少也要用跳板机加 SSH 隧道,这是安全性底线。
4.4 常见 systemd 启动失败场景
systemd 启动失败时,先看状态输出和日志,不要直接怀疑配置文件。我遇到过几次典型情况:
ExecStart中的路径写错了,注意mysqld和mysql不是同一个二进制文件,mysql是客户端,mysqld才是服务端。- 数据目录权限错了,启动时
mysqld无法在/data/mysql/run创建 pid 文件,要确认chown是否生效。 - 端口被占用,之前手动启动的进程没杀干净,用
ss -lntp | grep 3306检查。
解决方法就是用 journalctl 日志定位:
journalctl -u mysqld -n 50 --no-pager5. 部署避坑:我总结的 5 个最常见问题与排查路径
5.1 初始化报错libaio.so.1: cannot open shared object file
- 现象:执行
mysqld --initialize直接报错,提示找不到 libaio.so.1。 - 原因:系统缺少 libaio 运行库,这在使用最小化安装的 Linux 发行版上几乎必然出现,麒麟和 UOS 默认也不带。
- 解决:按照第 2 章的命令安装 libaio1。如果用的是 RPM 系系统,如银河麒麟高级版,用 yum 安装 libaio。安装后重新执行
ldd /usr/local/mysql/bin/mysqld,确认没有not found的库再继续。
5.2 初始化成功但启动报[ERROR] Can't find error-message file
- 现象:初始化阶段一切正常,但启动时错误日志提示找不到
errmsg.sys文件。 - 原因:
basedir配置指向了错误路径,或者安装路径中包含非 ASCII 字符。MySQL 会去basedir/share目录下寻找错误消息文件。 - 解决:确认
/usr/local/mysql/share目录存在并包含errmsg.sys,同时检查my.cnf中的basedir是否指向软链的实际路径。如果用了软链/usr/local/mysql,确保软链目标正确,输入ls -ld /usr/local/mysql查看是否指向mysql-5.7.44-linux-aarch64目录。
5.3 高并发下报错Too many open files
- 现象:业务高峰时 MySQL 频繁报错
Too many open files,连接数并不高但文件句柄耗尽。 - 原因:systemd 默认对进程的文件描述符限制是 1024。MySQL 每个连接需要若干个文件描述符,同时表缓存、日志文件也都要占用,当并发连接超过 300 时极易触发这个限制。
- 解决:在 systemd unit 文件中添加
LimitNOFILE=65535,并执行systemctl daemon-reload重启服务。通过cat /proc/$(pgrep mysqld)/limits验证生效情况。
5.4 中文乱码与字符集不统一
- 现象:程序写入中文后查询显示乱码,或者在建表时指定
DEFAULT CHARSET=utf8后 emoji 插入报错。 - 原因:MySQL 的
utf8字符集最多只支持 3 字节编码,而 utf8mb4 才是完整的 4 字节 UTF-8 编码。5.7 默认字符集是latin1,如果建库时没有指定,应用写入中文存进去就是乱码。 - 解决:在
my.cnf中设置character-set-server = utf8mb4和collation-server = utf8mb4_general_ci,同时把已有的库表字符集转换:ALTER DATABASE xxx CHARACTER SET utf8mb4; ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;。
5.5 初始化后 root 密码失效,提示Access denied
- 现象:用临时密码登录后执行任何语句都报权限不足,或者密码已修改但重启后无法登录。
- 原因:一种情况是临时密码在日志中复制时带了空格;另一种情况是在修改密码前执行了其他 SQL 导致认证状态异常;还有可能是
skip-grant-tables被错误写入my.cnf。 - 解决:重新查看错误日志确认临时密码,登录后立刻
ALTER USER ... IDENTIFIED BY,不要执行任何其他操作。如果 root 完全无法登录,用--skip-grant-tables进入恢复模式,重置密码后正常启动。
6. 部署后的性能验证与调优:从 sysbench 压测到三个关键参数实战
服务跑起来只是第一步,上线前的性能验证必须做,不然到业务高峰期再调参就狼狈了。这里分享一套我常用的压测和调优流程,以及最终落在 my.cnf 里的关键参数。
系统吞吐量的核心调优关注点是 InnoDB 缓冲池和刷盘策略。以一台 16GB 内存的某国产 ARM 服务器为例,实测发现默认配置下innodb_buffer_pool_size只有 128M,TPS 上不去,磁盘 I/O 成为瓶颈。调到 8G 后 TPS 直接翻倍。对于 5.7.44 版本的 aarch64 包,我习惯的参数组合如下:
innodb_buffer_pool_size = 内存的 60%-70%,这是 InnoDB 缓存表数据和索引的内存区域,默认值太小。innodb_log_file_size = 256M,redo log 太小会导致频繁刷盘,高并发写入时系统卡顿明显。innodb_flush_log_at_trx_commit = 2(如果业务能容忍崩溃时丢失 1 秒以内的事务)。需要数据绝对安全就保持等于 1,性能可以接受就设 2。max_connections = 500(具体看业务预估连接数,同时注意每个连接约占用数 MB 内存,开太大反而容易内存不足)。
压测工具用 sysbench。安装好后按下面步骤跑一轮基准,我一般取 5 次中的中位数,避免系统波动干扰判断:
# 准备测试数据,单表 100 万行 sysbench /usr/local/share/sysbench/oltp_read_write.lua \ --mysql-host=127.0.0.1 \ --mysql-user=root \ --mysql-password=你的密码 \ --mysql-db=test \ --tables=10 \ --table-size=1000000 \ prepare # 执行 5 分钟压测,16 线程并发 sysbench /usr/local/share/sysbench/oltp_read_write.lua \ --mysql-host=127.0.0.1 \ --mysql-user=root \ --mysql-password=你的密码 \ --mysql-db=test \ --tables=10 \ --threads=16 \ --time=300 \ run压测跑完后重点看两个指标:transactions/sec和95th percentile延迟。如果 TPS 低于预期且磁盘 I/O 利用率在 80% 以上,优先调innodb_buffer_pool_size和innodb_log_file_size。如果 CPU 占用到 90% 以上但 TPS 上不去,可能是索引缺失或 SQL 写得有问题,常见做法是开启慢查询日志定位:slow_query_log = 1,long_query_time = 2。
生产环境上线后还要注意 binlog 的保存周期:expire_logs_days = 7,防止 binlog 无限增长占满磁盘。备份方面至少每天一次全量,加上 binlog 做时间点恢复。5.7.44 的mysqldump在 ARM 上跑起来没问题,但大批量导出时小心内存占用,必要时在凌晨低峰执行。
我的习惯是每次压测后把my.cnf的变更记录到单独的变更日志里,标注日期、原因、变更前后的参数,方便后面回滚。有句话说得好:MySQL 配置调优不是玄学,每次改动都要能解释为什么——改完用 sysbench 复测,数据比感觉可靠。
这次从 x86 换到 ARM 的迁移过程,耗时最长的是前期环境准备和排错,真正切换数据只花了不到半天。如果你也卡在 ARM 上装 MySQL 5.7,按上面这个流程走,从下载 aarch64 包到压测通过,一个工作日基本能搞定。希望帮到你。
本文还有配套的精品资源,点击获取