必须显式指定-dcmake_system_processor=aarch64等关键参数,安装libatomic,禁用bundled openssl和libedit,并修复libtinfo.so版本及/var/run/mysqld权限问题,否则编译失败或启动崩溃。

直接编译安装 MySQL 在华为鲲鹏(Kunpeng)或飞腾(Phytium)这类 ARM64 服务器上,不能照搬 x86_64 的 cmake 参数和依赖配置——默认参数会触发架构误判、链接失败或运行时崩溃。必须显式锁定 aarch64 目标,并绕过几个 ARM 特有陷阱。
确认系统架构与基础工具链
鲲鹏/飞腾服务器虽属 ARM64,但部分国产发行版(如 EulerOS、Kylin V10、OpenAnolis)仍可能默认启用旧版 gcc 或缺失关键头文件。先验证:
-
uname -m必须输出aarch64(不是armv7l或armv8l) -
gcc --version≥ 10.2;低于此版本在__int128和__atomic内建函数上会编译失败 -
ldd --version对应的 glibc ≥ 2.28(飞腾某些定制内核需 ≥ 2.32) - 必须安装
libatomic:鲲鹏常见报错undefined reference to '__atomic_store_16'就源于此,执行sudo yum install libatomic或sudo apt install libatomic1
cmake 配置必须加的关键参数
ARM64 下 cmake 若不强制指定目标平台,会 fallback 到 generic 架构,导致生成非原生指令或链接错误。以下参数缺一不可:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
-
-DCMAKE_SYSTEM_PROCESSOR=aarch64:这是核心,否则CMAKE_SYSTEM_PROCESSOR可能为generic,引发后续优化失效 -
-DWITH_SSL=system:禁用bundledOpenSSL/BoringSSL,后者对 ARM64 的 AEAD 指令适配不全,易在 handshake 阶段 segfault -
-DWITH_LIBEDIT=OFF:ARM 平台下libedit静态链接常因 symbol 版本冲突失败,且 MySQL CLI 不依赖它也能工作 -
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost:国产系统中 Boost 常缺失或版本错位,让 cmake 自动下载可规避兼容问题 - 避免
-DENABLE_DTRACE=ON:ARM64 上 dtrace 支持不完整,开启后 configure 阶段即报错
编译与启动阶段的典型报错修复
即使 cmake 成功,make 后启动仍可能卡住或崩溃,常见于动态链接与权限场景:
-
mysqld: error while loading shared libraries: libtinfo.so.5: cannot open shared object file:国产系统(如 Kylin V10 SP1)已升级到libtinfo.so.6,但 MySQL 二进制仍硬编码 v5。不用软链,改用:patchelf --replace-needed libtinfo.so.5 libtinfo.so.6 /usr/local/mysql/bin/mysqld - 启动日志停在
Starting MySQL database server:检查pid-file路径(如/var/run/mysqld/mysqld.pid)所属目录是否为 tmpfs 且mysql用户无写权限。飞腾云主机常挂载/var/run为tmpfs mode=0755,需提前执行:sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld -
Table 'mysql.plugin' doesn't exist:说明初始化未完成或 datadir 权限错误。确保mysqld --initialize命令中--user=mysql与实际运行用户一致,且datadir所有者为mysql:mysql,而非仅 root
鲲鹏/飞腾特有性能调优点
ARM64 多核调度与内存一致性模型不同于 x86,MySQL 默认参数在高并发下易出现锁争用或刷盘延迟:
-
innodb_buffer_pool_instances建议设为 CPU socket 数 × 2(鲲鹏 920 通常为 2–4,飞腾 D2000 为 2),避免单实例锁瓶颈 -
innodb_flush_method强烈建议用o_direct(而非fsync),ARM 存储栈对 direct I/O 优化更充分 - 禁用
numa_interleave:鲲鹏 BIOS 中若开启 NUMA balancing,MySQL 进程可能跨节点分配内存,导致延迟抖动;启动前加numactl --interleave=all或在 systemd service 文件中加ExecStart=/usr/bin/numactl --interleave=all /usr/local/mysql/bin/mysqld ... -
innodb_log_file_size不宜过大(如 > 512MB):ARM 平台 ext4/xfs 日志重放路径较慢,大日志文件重启恢复时间显著拉长
ARM 上编译 MySQL 最容易被忽略的是:cmake 阶段不显式声明 aarch64 就等于没开始;而启动失败八成出在 libtinfo 版本或 /var/run 权限上,不是配置文件写错了。










