必须在目标arm服务器上源码编译mysql 8.0,需先确认aarch64架构和glibc版本,显式指定cmake参数(如-dcmake_system_processor=aarch64、-march=armv8-a+crypto),禁用x86特性,手动安装高版本cmake/gcc/boost/ssl,并严格隔离初始化路径与权限。

内网ARM服务器上编译部署MySQL 8.0,不是“能不能”,而是“必须绕开rpm、必须自己控依赖、必须显式指定ARM优化参数”。官方二进制包在国产麒麟等内网系统上常因glibc或init兼容性失败,而源码编译虽耗时但可控性强——尤其当你无法联网yum、不能用Docker、又需要多实例或定制安全策略时。
确认aarch64架构和glibc版本是否匹配编译目标
编译前不验证环境,90%会在cmake阶段报错或生成不可执行的二进制。重点查两件事:
-
uname -m必须输出aarch64,否则所有ARMv8指令集优化(如-march=armv8-a+crypto)都无效 -
ldd --version决定你该选哪个Boost和OpenSSL版本:麒麟V10 SP1常见glibc 2.17,龙蜥8/统信UOS新版本多为glibc 2.28;MySQL 8.0.33+要求glibc ≥ 2.17,但若你用glibc 2.28编译却部署到2.17系统,运行时会直接报cannot execute binary file: Exec format error - 别信
/etc/os-release里的PRETTY_NAME="Kylin Linux Advanced Server V10"——它不反映glibc真实版本,只查ldd --version
安装编译依赖时避开ARM平台特有坑
ARM服务器(如鲲鹏920、飞腾D2000)缺的不是基础工具,而是带ARM适配的高版本构建链。常见翻车点:
- 默认
yum install cmake装的是3.10以下版本,MySQL 8.0.26+强制要求CMake ≥ 3.14.5;必须手动编译安装cmake-3.19.7或更高,并确保cmake --version能正确输出 -
gcc版本必须≥ 8.3(MySQL 8.0.33起),国产系统自带GCC常为7.3;需启用devtoolset-9或直接编译GCC 11.2,且要改/usr/bin/gcc软链接,否则cmake ..仍调用旧版 -
boost不能用系统包管理器装(麒麟V10的boost-program-options版本太低),必须下载对应MySQL版本的mysql-boost-8.0.xx.tar.gz,解压后用-DWITH_BOOST=/path/to/boost指向它 -
openssl-devel必须≥ 1.1.1,否则mysqld启动时SSL握手失败;若系统源无满足版本,得从源码编译OpenSSL 1.1.1w并指定-DWITH_SSL=/usr/local/ssl
cmake配置必须加ARM专属参数
不加这些,编译出来的mysqld可能跑不满CPU性能,甚至在某些ARM芯片上触发非法指令异常:
- 强制启用ARMv8-A加密扩展:
-DENABLED_LOCAL_INFILE=ON -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=OFF - 指定CPU微架构优化(对鲲鹏920有效):
-DCMAKE_C_FLAGS="-march=armv8-a+crypto -mtune=thunderx2t99" -DCMAKE_CXX_FLAGS="-march=armv8-a+crypto -mtune=thunderx2t99" - 禁用x86专用特性(避免链接时报错):
-DENABLE_DOWNLOADS=OFF -DWITH_EDITLINE=system - 关键路径必须显式声明:
-DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci - 最后检查:运行
cmake ..后,终端应输出-- MySQL 8.0.xx且无WARNING:关于SSL/Boost/CRYPTO的缺失提示
初始化和启动时权限与路径必须严格隔离
内网ARM服务器常以最小化安装,SELinux可能关闭但systemd单元或文件权限仍会卡住启动:
-
mysqld --initialize --user=mysql必须在/usr/local/mysql目录下执行,且data目录属主必须是mysql:mysql,不能是root;否则日志里只有mysqld: Can't create/write to file '/usr/local/mysql/data/aria_log_control' - 不要依赖
systemctl start mysqld——麒麟V10默认用sysvinit,需手写/etc/init.d/mysqld脚本,或创建/etc/systemd/system/mysqld.service并确保Type=simple+ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf -
/etc/my.cnf里socket路径建议设为/tmp/mysql.sock而非/var/run/mysqld/mysqld.sock,避免run目录权限继承问题 - 首次启动后立即执行
mysql -u root -p --socket=/tmp/mysql.sock,用临时密码登录,立刻执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPass123!';,否则后续连接会因密码策略拒绝空密码
最易被忽略的是:编译生成的mysqld二进制文件本身带有glibc符号版本绑定,一旦拷贝到另一台glibc小版本不同的ARM机器上,连ldd ./bin/mysqld | grep libc都会显示not found——这不是配置问题,是ABI硬伤。务必在目标机器上编译,或至少用相同glibc版本的交叉编译环境。











