arm64编译mysql 8.0必须显式指定-dcmake_system_processor=aarch64、禁用-dwith_libedit=off和-dwith_ssl=system,匹配glibc≥2.28、gcc≥10.2、cmake≥3.19,并修复libtinfo.so.6链接及ulimit限制。

直接编译安装 MySQL 8.0 在 ARM64 上不是“能跑就行”,而是必须显式约束工具链、禁用 x86 特有优化、匹配 glibc 版本,否则 mysqld 启动时大概率卡在 libtinfo.so.6: cannot open shared object file 或直接段错误。
确认系统真实环境:aarch64 + glibc ≥ 2.28 是硬门槛
别信 /etc/os-release 里的 “ARM support” 字样,只看两条命令输出:
-
uname -m必须返回aarch64(armv7l或armv8l不支持官方二进制或源码安全编译) -
ldd --version输出的 glibc 版本必须 ≥2.28;麒麟 V10 SP3、OpenEuler 22.03 LTS、Ubuntu 22.04+ 通常满足,但 CentOS Stream 8 默认是 2.27,升级 glibc 风险高,建议换系统或改用官方 aarch64 tar.xz 包
cmake 配置必须显式指定 ARM 工具链和禁用组件
默认 cmake 会探测 host 环境,可能误用 x86 指令集或启用 ARM 不稳定模块。关键参数不能省:
- 强制目标架构:
-DCMAKE_SYSTEM_PROCESSOR=aarch64(不加此参数,CMAKE_SYSTEM_PROCESSOR可能为generic,导致生成非法指令) - 禁用 libedit:
-DWITH_LIBEDIT=OFF(ARM 平台下其静态链接易触发undefined reference to 'rl_bind_key') - SSL 使用系统库:
-DWITH_SSL=system(避免 bundled BoringSSL 在 ARM 上原子操作内建函数缺失) - Boost 路径明确指定:
-DWITH_BOOST=/path/to/boost(MySQL 8.0.23+ 不再自带 Boost,漏配直接cmake报错) - 跳过测试套件编译:
-DENABLE_DOWNLOADS=OFF(防止构建时自动拉取 x86-only 的 test suite 依赖)
gcc 和 cmake 版本有隐性兼容要求
ARM64 编译 MySQL 8.0 对工具链版本敏感,低版本会静默生成崩溃二进制:
- gcc 必须 ≥
10.2:低于此版本缺少完整__int128支持,mysqld在事务回滚或大整数计算时 SIGSEGV - cmake 必须 ≥
3.19:旧版对aarch64的CMAKE_SYSTEM_NAME推导不准,find_package(Threads)失败 - 验证方式:
gcc -dumpversion和cmake --version;若系统自带版本不足,用scl enable devtoolset-10 bash(CentOS/RHEL)或从源码编译 cmake 3.25+
启动前必须修复动态库链接和文件句柄限制
即使编译成功,mysqld 在 ARM64 上仍常因运行时环境失败:
- 检查缺失库:
ldd /usr/local/mysql/bin/mysqld | grep "not found";常见缺失是libtinfo.so.6或libncurses.so.6,对应安装ncurses-compat-libs(麒麟/统信)或libncurses5(Ubuntu) - ARM 并发压力下默认
ulimit -n(1024)不够,mysqld会报Too many open files;必须在 systemd service 文件中加LimitNOFILE=65535,并确保/etc/security/limits.conf中mysql用户行生效 - 首次初始化用
mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data,不要用--initialize-insecure(ARM 上密码插件加载顺序异常易导致 root 登录拒绝)
最易被忽略的是:编译产物未做 strip 会导致 ARM64 上内存映射异常,mysqld 启动后几秒内无日志退出;生产环境务必执行 strip /usr/local/mysql/bin/mysqld 再启动。











