KingbaseES 缺少库文件问题
在工作中大家经常会遇到找不到某个so 的问题,这类可能是so文件缺失,或者是由于LD_LIBRARY_PATH 环境变量设置不当的原因。
1、库文件
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。两者对比:
动态库(.so) |
静态库(.a) |
|
编译时 |
不连接到目标代码 |
连接到目标代码 |
运行时 |
动态加载 |
不再需要(已经在目标代码内) |
2、常见问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [kingbase @dbhost03 lib]$ ksql ksql: error while loading shared libraries: libpq.so. 5 : cannot open shared object file: No such file or directory [kingbase @dbhost03 lib]$ ldd /opt/Kingbase/ES/V8/Server/bin/ksql linux-vdso.so. 1 => ( 0x00007ffe7d2be000 ) libpq.so. 5 => not found --库缺失,或指向非kingbase的库 libssl.so. 10 => /opt/Kingbase/ES/V8/Server/lib/libssl.so. 10 ( 0x00007fc24de15000 ) libcrypto.so. 10 => /opt/Kingbase/ES/V8/Server/lib/libcrypto.so. 10 ( 0x00007fc24d9b2000 ) libz.so. 1 => /lib64/libz.so. 1 ( 0x00007fc24d79c000 ) libreadline.so. 5 => /opt/Kingbase/ES/V8/Server/lib/libreadline.so. 5 ( 0x0000003c2bc00000 ) libtermcap.so. 2 => /opt/Kingbase/ES/V8/Server/lib/libtermcap.so. 2 ( 0x0000003c2d400000 ) librt.so. 1 => /lib64/librt.so. 1 ( 0x00007fc24d594000 ) libcrypt.so. 1 => /lib64/libcrypt.so. 1 ( 0x00007fc24d35d000 ) libdl.so. 2 => /lib64/libdl.so. 2 ( 0x00007fc24d159000 ) libm.so. 6 => /lib64/libm.so. 6 ( 0x00007fc24ce57000 ) libc.so. 6 => /lib64/libc.so. 6 ( 0x00007fc24ca89000 ) libgssapi_krb5.so. 2 => /lib64/libgssapi_krb5.so. 2 ( 0x00007fc24c83c000 ) libkrb5.so. 3 => /lib64/libkrb5.so. 3 ( 0x00007fc24c553000 ) libcom_err.so. 2 => /lib64/libcom_err.so. 2 ( 0x00007fc24c34f000 ) libk5crypto.so. 3 => /lib64/libk5crypto.so. 3 ( 0x00007fc24c11c000 ) libpthread.so. 0 => /lib64/libpthread.so. 0 ( 0x00007fc24bf00000 ) libfreebl3.so => /lib64/libfreebl3.so ( 0x00007fc24bcfd000 ) /lib64/ld-linux-x86- 64 .so. 2 ( 0x00007fc24e087000 ) libkrb5support.so. 0 => /lib64/libkrb5support.so. 0 ( 0x00007fc24baed000 ) libkeyutils.so. 1 => /lib64/libkeyutils.so. 1 ( 0x00007fc24b8e9000 ) libresolv.so. 2 => /lib64/libresolv.so. 2 ( 0x00007fc24b6d0000 ) libselinux.so. 1 => /lib64/libselinux.so. 1 ( 0x00007fc24b4a9000 ) libpcre.so. 1 => /lib64/libpcre.so. 1 ( 0x00007fc24b247000 ) |
以上的例子是由于so文件无法找到或缺失导致
3、KingbaseES 如何找 so 文件?
KingbaseES 在编译的时候,使用参数 -rpath 参数告诉编译器,在编译生成可执行文件的时候,记住库的位置,这样在运行的时候不需要再设置这个动态库的位置。但实际当中,还是经常会遇到找不到so文件的问题,还是需要设置 LD_LIBRARY_PATH 环境变量。
LD_LIBRARY_PATH: 动态库的查找路径
方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是退出当前终端后就失效
方法二: 修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile
- 在其中添加例如export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
- source .bashrc (Source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录)
方法三:这个没有修改LD_LIBRARY_PATH,但是效果是一样的实现动态库的查找,
- /etc/ld.so.conf下面加一行,如:/usr/local/mysql/lib
- 保存后执行 ldconfig 生效。ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
4、问题解决思路
- 如果执行命令,如 ksql,报“error while loading shared libraries” ,可以先执行:ldd path/ksql ,确认丢失的库文件名。
- 先到 Server/lib 路径下寻找,如果有对应的库文件,那可能是 LD_LIBRARY_PATH 环境变量问题,需要设置该环境变量。
- 如果Server/lib 路径下没有,再找 /lib64 , /lib 目录。注意:即使 /lib64 或 /lib 目录下有同样的库文件名,也未必可用,因为这些文件可能是PG的。
5、实际例子
例子一:动态库版本不兼容
如以下例子,在initdb时,提示libstdc++ 版本不兼容。
确认kingbase所链接的库的位置:
验证操作系统 libstdc++.so.6 文件,确认确实不包含kingbase程序所需要的 CXXABI_1.3.8 版本。
问题原因分析:这种问题通常是由于软件在编译时,libc版本较高,而用户现场的版本较低,导致版本不兼容的情况。需要用户现场升级操作系统版本。
例子二:错误设置LD_LIBRARY_PATH
ksql 连接数据库时,报错如下:
从这个错误信息看,ksql 去连接5432端口,而5432 端口是PostgreSQL默认运行的端口,怀疑用户使用了错误lib库文件。
果然,ksql 使用了/lib64 下的libpq文件,而这个文件是操作系统安装时带入的PostgreSQL文件。修改LD_LIBRARY_PATH环境变量,指向/opt/kb86/ES/V8/Server/lib 目录。
确认已链接到正确的libpq文件。验证ksql 连接正常:
6、总结
对于数据库可执行程序启动时,缺少动态库的问题,一般可以按照以下步骤解决:
- 首先通过ldd命令查看可执行程序需要加载的动态库。
- 检查LD_LIBRARY_PATH变量配置是否正确。
- 通过find命令查找缺失的so动态库文件。
- 建立查找到的动态库文件到数据库系统lib目录下的软链接。
- 重新启动应用程序。
- 如果不能找到缺失的动态库,需要安装相应的软件包。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!