段错误本质是内存访问越界,主因是mysql二进制包硬编码依赖libncurses.so.5、libssl.so.10等旧版库,而麒麟v10 arm仅提供libncurses.so.6.1和libssl.so.1.1,版本不匹配导致符号解析失败或abi不兼容,进而跳转非法地址崩溃;残留mariadb库或误装x86_64包会加剧该问题。

段错误(Segmentation Fault)本质是内存访问越界
这不是MySQL代码本身有bug,而是它尝试调用某个函数时,动态链接器找不到对应的符号,或者加载的库版本不兼容,导致跳转到非法地址。ARM版麒麟V10上最常见的是libncurses.so.5、libssl.so.10这类老名字的库根本不存在,但MySQL二进制包编译时硬编码了这些名字——程序一启动就崩在ldd解析阶段之后、main执行之前。
为什么麒麟V10装MySQL容易触发段错误
- MySQL 5.7/8.x 官方二进制包默认链接
libncurses.so.5和libtinfo.so.5,但麒麟V10只带libncurses.so.6.1和libtinfo.so.6 - MySQL 8.0.27+ 链接
libssl.so.10,而麒麟V10提供的是libssl.so.1.1,名字不匹配导致symbol lookup error,表现就是段错误 - 残留的
mariadb-libs包会覆盖或干扰MySQL自己的库文件,mysqld实际加载的是MariaDB的so,ABI不兼容直接崩溃 - 用x86_64包往aarch64麒麟系统上硬装,
uname -m输出aarch64却装了x86_64 RPM,报cannot execute binary file——这其实也是段错误的一种底层表现
怎么验证是不是段错误由库缺失引起
别急着重装,先跑两行命令:
ldd /usr/sbin/mysqld | grep "not found" —— 看有没有标红的缺失库
mysqld --version 2>&1 | head -n 5 —— 如果直接segfault,说明连版本都打不出来,基本锁定是libncurses或libssl问题
常见报错片段:error while loading shared libraries: libncurses.so.5: cannot open shared object file 或 symbol lookup error: undefined symbol: OPENSSL_init_ssl
软链不是万能解法,得看目标库是否真兼容
创建/usr/lib64/libncurses.so.5 → /usr/lib64/libncurses.so.6.1能过加载关,但不代表函数ABI完全一致。MySQL 5.7对ncurses 5.9有强依赖,麒麟V10自带的ncurses 6.1虽然后向兼容大部分接口,但个别内部结构偏移变了,mysqld --initialize仍可能段错误。
更稳妥的做法:
- 确认
find /usr/lib64 -name "libncurses.so.5*"真没结果再建软链 - 优先尝试安装
ncurses-compat-libs(麒麟源里可能叫ncurses5-compat),比软链安全 - 处理
libssl.so.10时,不要软链到libssl.so.1.1——应使用compat-openssl10包,或从CentOS 7的openssl-libsRPM里提取libssl.so.10手动放过去
段错误背后往往是多个库叠加失效,单修一个可能没用。清完MariaDB、核对架构、修复ncurses、再补openssl,四步缺一不可。











