ARM架构编译MySQL 8.0需满足aarch64+glibc≥2.28硬门槛,必须启用-DWITH_ARM64=ON、禁用x86特性、精准匹配Boost 1.75.0+,并确保libtinfo.so.6等依赖存在及权限、配置路径正确。

在ARM架构Linux上源码编译MySQL 8.0,不是“能编译成功”就等于部署完成——cmake配置漏掉ARM专属选项、Boost版本不匹配、或glibc低于2.28,都会导致mysqld启动后立即Segmentation fault或卡死在libtinfo.so.6加载阶段。
确认系统真实环境:aarch64 + glibc ≥ 2.28 是硬门槛
别信/etc/os-release里写的“Kylin V10”或“UOS”,直接跑命令看底层:
-
uname -m必须输出aarch64;若为armv7l或armv8l,官方源码不支持,别往下试 -
ldd --version输出的glibc版本必须≥2.28;麒麟V10 SP3、OpenEuler 22.03 LTS SP3之后多数满足,但SP1常见glibc 2.17,此时必须换二进制包,源码编译会失败在链接阶段 -
cat /proc/cpuinfo | grep -i "model name"确认是华为鲲鹏、飞腾FT-2000+或海光HYGON等主流ARM64芯片,避免小众SoC缺少crypto扩展导致SSL初始化失败
cmake配置必须显式启用ARMv8优化与禁用x86特性
MySQL 8.0源码默认按x86优化,ARM平台不加约束会导致生成非法指令。关键cmake参数不能少:
- 强制指定架构:
-DWITH_ARM64=ON(非可选,否则编译器仍走x86路径) - 关闭不兼容特性:
-DENABLED_LOCAL_INFILE=OFF -DWITH_SSL=system(国产系统自带openssl版本杂乱,用system比bundled更稳) - Boost必须精准匹配:
-DBOOST_ROOT=/path/to/boost_1_75_0 -DWITH_BOOST=/path/to/boost_1_75_0;MySQL 8.0.33+要求Boost ≥ 1.75.0,用1.70.0会报undefined reference to boost::filesystem:: - 跳过测试套件节省时间:
-DENABLE_DOWNLOADS=OFF -DINSTALL_TESTDICT=OFF(测试依赖大量网络和磁盘IO,在ARM板上极易超时)
编译与安装过程中的三个易崩溃点
即使make跑完,后续仍可能失败。这些步骤出错不会报错,但运行mysqld时必崩:
-
make install后,检查/usr/local/mysql/lib下是否存在libtinfo.so.6和libncurses.so.6;ARM系统常只装libncurses.so.5,需手动软链或装ncurses-compat-libs包 - 初始化前必须
chown -R mysql:mysql /usr/local/mysql且chown -R mysql:mysql /data/mysql;ARM板常因SELinux或自定义安全策略,导致mysqld --initialize写ibdata1时被拒绝 -
mysqld启动命令必须带--defaults-file=/etc/my.cnf;ARM二进制部署不读/etc/my.cnf.d/,漏掉这个参数,datadir和socket全按默认值走,mysql -S连不上
启动失败时优先查这三行日志
不要一上来就重装,先看/var/log/mysqld.log最末尾:
- 出现
cannot execute binary file→ 说明你编译的是x86目标码,cmake没加-DWITH_ARM64=ON或交叉编译环境设错 - 卡在
Starting MySQL daemon with databases from /data/mysql后无响应→ 检查/data/mysql目录权限是否为mysql:mysql且750,ARM板上chmod有时不生效,需setfacl -m u:mysql:rwx /data/mysql - 报
libssl.so.3: cannot open shared object file→ 国产系统openssl 3.x路径不在LD_LIBRARY_PATH,执行echo "/usr/lib64" >> /etc/ld.so.conf.d/mysql.conf && ldconfig
ARM源码编译MySQL 8.0,最难的不是编译本身,而是把所有隐性依赖路径、权限边界和init脚本行为全部对齐——尤其是当系统用的是定制init而非systemd时,mysqld_safe的进程守护逻辑会彻底失效,必须改用systemd单元文件手动写死User=mysql和LimitNOFILE=65535。











