KingbaseES 缺少库文件问题
在工作中大家经常会遇到找不到某个so 的问题,这类可能是so文件缺失,或者是由于LD_LIBRARY_PATH 环境变量设置不当的原因。
1、库文件
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。两者对比:
|
动态库(.so) |
静态库(.a) |
|
|
编译时 |
不连接到目标代码 |
连接到目标代码 |
|
运行时 |
动态加载 |
不再需要(已经在目标代码内) |
2、常见问题
[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目录下的软链接。
- 重新启动应用程序。
- 如果不能找到缺失的动态库,需要安装相应的软件包。
KingbaseES 缺少库文件问题的更多相关文章
- CentOS系统缺少库文件解决办法
By francis_hao May 31,2017 程序在编译时出现缺少库文件的提示,如下: as: error while loading shared libraries: libz. ...
- ubuntu 安装 库文件
ubuntu 16.4 安装freeradius 时,缺少库文件 libtalloc, 使用命令: sudo apt-get install libtalloc 发现找不到库文件 libtallo ...
- Linux 中安装软件报缺少共享库文件的错误
linux 安装一些如软件 或者相关的模块时,经常报出缺少一些依赖包的 libxxx.so等的共享库文件 首先找到 该共享库文件 然后查看/etc/ld.so.conf 这个文件记录了编译时使用的动态 ...
- linux web服务器必需的库文件
往往安装完linux之后,本文用的centos6.4,再编译安装其它服务器软件时,总是提示缺少各种库文件,在这里我总结了一下 平时web服务器经常需要的一些库,如下: yum -y install m ...
- 添加Ubuntu的库文件路径
添加Ubuntu的库文件路径 http://blog.csdn.net/r91987/article/details/6879062 关于ubuntu添加共享库路径: 1. 将绝对路径写入 /etc/ ...
- Linux链接库四(多个库文件链接顺序问题)
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...
- ldd命令--查看命令依赖的库文件
.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行:在Linux环境下通过ldd命令即可实现,在终端下执行:ldd /bin/ls //l ...
- 如何查询一个库文件属于哪个rpm包
1.如果这个库文件已经存在 使用rpm命令: # rpm -qf /file/path (绝对路径) 例如: # rpm -qf /lib/libm.so.6 glibc-2.12-1.47.el ...
- Linux系统中如何添加自己的库文件路径
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...
随机推荐
- SQL SERVER 算法面试题,自己再插入数据时,本想一次性复制10条数据,结果变成了1024条。产生一个算法bug,最后记录一下
- Nginx+Keepalived+VIP漂移实现HA高可用技术之详细教程
https://www.cnblogs.com/zcc666/p/13141626.html 这个是nginx安装教程地址 https://www.cnblogs.com/zcc666/p/1313 ...
- C++几种特殊形式的函数
本篇文章主要介绍C++语言中5中特殊形式的函数,分别是带默认形参值的函数.重载函数.内联函数.带形参和返回值的主函数以及递归函数. 一.带默认形参值的函数 如果函数的形参在多数情况下都可以取某个固定的 ...
- VIM编辑器的宏操作
这两天看到一个小练习,要求如下: 在GVIM下,将下面这张图的内容 改成下面这样 并且指出,要用批量操作的方式,不能一行一行的键入 其实第一反应是利用正则表达式来操作,但是让用正则表达式以外的操作方式 ...
- P2512 【一本通提高篇贪心】「一本通 1.1 练习 6」[HAOI2008]糖果传递
[HAOI2008]糖果传递 题目描述 有 n n n 个小朋友坐成一圈,每人有 a i a_i ai 个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为 1 1 1. 输入格式 小朋友 ...
- input 输入框背景色设置为透明
- PROFIBUS,PROFINET,Ethernet三者的区别
PROFIBUS,PROFINET,Ethernet三者的区别 简单一点说,PROFINET=PROFIbus+etherNET,把Profibus的主从结构移植到以太网上,所以profinet会有C ...
- CSS3 基础学习
CSS基础学习 当前进度[P78] 参考资料 视频链接:https://www.bilibili.com/video/BV14J4114768 菜鸟教程:https://www.runoob.com/ ...
- 构建数据湖上低延迟数据 Pipeline 的实践
T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...
- ASP.NET Core自定义中间件的方式
ASP.NET Core应用本质上,其实就是由若干个中间件构建成的请求处理管道.管道相当于一个故事的框架,而中间件就相当于故事中的某些情节.同一个故事框架采用不同的情节拼凑,最终会体现出不同风格的故事 ...