不建议在ARM国产系统(如银河麒麟V10、龙蜥ARM)上源码编译MySQL 8.0,生产环境应优先使用官方二进制包或RPM Bundle;源码编译易因glibc版本、CMake版本、依赖包名差异、ARM指令集适配等问题导致启动失败、段错误或执行格式错误。

mysqld 启动失败、Segmentation fault、cannot execute binary file——这些不是配置问题,是编译环节就埋下的雷。ARM 国产系统(如银河麒麟 V10、龙蜥 ARM)上**不建议直接源码编译 MySQL 8.0**,除非你明确需要定制存储引擎或调试内核行为;生产环境应优先用二进制包或 RPM Bundle,编译安装极易因 glibc、CMake 版本、依赖库路径、ARM 指令集微调等细节翻车。
为什么 cmake && make 在国产 ARM 上大概率失败
MySQL 官方不提供 ARM 源码编译的完整支持矩阵,国产系统又常存在以下硬约束:
-
glibc版本杂(麒麟 V10 多为 2.17,但部分升级版升到 2.28),而 MySQL 8.0 源码默认链接系统glibc,混用会触发cannot execute binary file: Exec format error - CMake 最低要求 3.14.5,但麒麟 V10 默认
cmake常为 3.10 或更低,cmake ..直接报错 unrecognized syntax - 编译依赖项如
libedit、libtirpc、openssl-devel在国产源中包名不一致(如麒麟用libopenssl-devel,龙蜥用openssl11-devel),cmake阶段检测失败却不提示具体缺哪个 -
make -j$(nproc)在 4 核 ARM 小内存机器上易 OOM,cc1plus进程被 kill,日志只显示 “internal compiler error”
mysqld 编译后无法启动的典型症状
即使 make install 成功,运行 mysqld --version 或 mysqld --initialize 仍可能崩溃,常见表现:
-
Segmentation fault (core dumped)—— 大概率是mariadb-libs未清干净,或libmysqlclient.so被系统旧版本劫持 -
error while loading shared libraries: libnuma.so.1: cannot open shared object file——numactl-libs已装但路径未加入/etc/ld.so.conf.d/mysql.conf,且未执行ldconfig -
Failed to find valid data directory—— 编译时未指定-DCMAKE_INSTALL_PREFIX,导致basedir和datadir路径混乱,mysqld找不到share/english/errmsg.sys
若坚持源码编译,必须锁定这 4 个参数
跳过任何一项,mysqld 都可能在初始化或连接阶段静默退出:
- 显式指定安装前缀:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql,避免默认装到/usr/local下引发权限和路径歧义 - 强制使用静态链接关键库:
-DWITH_SSL=system -DWITH_NUMA=OFF -DWITH_LIBEDIT=OFF,规避 ARM 上libedit补丁缺失问题 - 关闭非必要组件减少依赖面:
-DWITHOUT_SERVER=OFF -DWITH_UNIT_TESTS=OFF -DENABLE_DOWNLOADS=OFF - 设置正确架构标识:
-DDEFAULT_COMPILER_OPTIONS=ON -DCMAKE_SYSTEM_PROCESSOR=aarch64,否则 CMake 可能误判为 x86_64
比编译更关键:启动前必须做的三件事
编译只是第一步,真正让 mysqld 活下来靠的是这三步落地:
- 卸载所有
mariadb-*包:rpm -qa | grep -i mariadb | xargs -r rpm -e --nodeps,然后find /usr -name "libmysqlclient.so*" 2>/dev/null | xargs -r rm -f - 创建专用用户并限定 shell:
useradd -r -g mysql -s /bin/false mysql,不能复用 root 或普通用户,否则mysqld --initialize会拒绝写入datadir - 初始化时强制绑定配置文件:
mysqld --initialize --defaults-file=/etc/my.cnf --user=mysql,漏掉--defaults-file会导致它读不到datadir设置,直接在当前目录建一堆临时文件
ldd 输出里一个 not found,可能来自内核头文件版本、sysroot 路径、甚至 GCC 的 --with-arch 默认值。真要上线,宁可多花半小时验证二进制包,也不要赌一次 make -j4 能过。


















