mysql 5.7查找libtinfo.so.5是因为其二进制包编译时硬依赖该soname,而现代系统仅提供libtinfo.so.6等高版本;动态链接器严格按soname匹配,不自动降级或升级查找,故需通过创建符号链接或安装ncurses-compat-libs包来提供兼容接口。

为什么MySQL 5.7会找 libtinfo.so.5 而不是系统已有的 libtinfo.so.6
MySQL 5.7 是较老的二进制包,编译时链接的是 libtinfo.so.5(属于 ncurses 5.x 时代),而现代发行版(Ubuntu 20.04+、Rocky Linux 9、openEuler 22.03、CentOS 8+)默认只带 libtinfo.so.6 或 libncurses.so.6。动态链接器严格按 soname 匹配,libtinfo.so.5 缺失就直接报错,不会自动降级或升級查找。
先确认系统里有没有能用的替代库
别急着下载或硬拷贝,先查本地有没有高版本可复用:
- 运行
find /usr -name "libtinfo.so*" 2>/dev/null或find /lib* -name "libtinfo.so*" 2>/dev/null - 如果没结果,再查
libncurses.so*:find /usr -name "libncurses.so*" 2>/dev/null - 常见可替代路径包括:
/usr/lib64/libtinfo.so.6.1、/lib/x86_64-linux-gnu/libtinfo.so.6、/usr/lib64/libncurses.so.6.3
只要找到任意一个 .so.x(x ≥ 6),基本就能软链解决;找不到才考虑装兼容包或手动放库。
创建软链接是最直接的修复方式
软链接必须指向**绝对路径**,且放在动态链接器能扫描到的目录(如 /usr/lib64、/lib64、/usr/lib/x86_64-linux-gnu),否则 ldconfig 不生效。
- 假设你找到
/usr/lib64/libtinfo.so.6.1,执行:sudo ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5 - 若只有
/usr/lib64/libncurses.so.6.3,也可试:sudo ln -s /usr/lib64/libncurses.so.6.3 /usr/lib64/libtinfo.so.5(部分旧 MySQL 实际调用的是 ncurses 的 tinfo 兼容层) - 创建后务必运行:
sudo ldconfig,否则新链接不被识别
验证是否生效:ldd /usr/local/mysql/bin/mysql | grep tinfo 应该显示 libtinfo.so.5 => /usr/lib64/libtinfo.so.5(路径匹配你刚建的链接)。
某些系统推荐优先安装 ncurses-compat-libs 而非软链
比如 Rocky Linux 9、CentOS 8+、AlmaLinux 等,官方提供了 ncurses-compat-libs 包,它原生提供 libtinfo.so.5 和 libncurses.so.5,比手动软链更稳妥:
- RHEL/CentOS/Rocky/Alma:
sudo dnf install -y ncurses-compat-libs - openEuler:
sudo dnf install -y compat-ncurses - Ubuntu/Debian 没有对应包,只能软链或从 pkgs.org 下载
libtinfo5deb 包手动安装
注意:软链虽快,但系统升级后若高版本库被删或路径变更,MySQL 可能再次崩溃;ncurses-compat-libs 由发行版维护,更新时会同步处理兼容性。
真正麻烦的不是找不到 libtinfo.so.5,而是有些环境里它和 libncurses.so.5 需要同时存在,且两者 soname 版本必须对得上——这时候单建一个链接往往不够,得一起处理,或者干脆换用 MySQL 8.0+ 二进制包(已适配 ncurses 6)。











