如何解决库文件缺失问题?

3848dbd63be355eff819eb3788d7fc31.gif

磁盘坏道、机房断电、服务器遭遇病毒、运维人员误操作等,会造成数据库文件缺失;环境变量设置有误、版本不适配,也会导致库文件丢失。这些情况一旦遇上就是“惊心动魄”的大事,直接影响业务系统的正常运转


作为保存和管理数据的IT系统软件,数据库在实际应用中会遇到库文件缺失问题,那如何快速解决并保证系统稳定运行呢?

先了解一个重要的专业术语----动态链接库(Dynamic Link Library,简称DLL),它是可以被其他应用程序共享的文件,其中封装了一些能被共享的例程和资源。

在Linux系统下,DLL文件的扩展名是so。对于DLL,由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。相对于动态链接,静态链接是指把要调用的函数或过程在编译时链接到可执行文件中,成为可执行文件的一部分。如果DLL编译时没有被编译进目标文件中,当程序执行到对应的函数时,会调用该函数库里的相应函数。如果缺少相应的动态库文件,程序运行失败。

3da63a1b1328e4be3ee2f7bba0f8590e.png

注:以上问题都是由于so文件无法找到或缺失导致。

TIPS

我们通常把一些公用函数制作成函数库,供其他程序使用。函数库分为静态库和动态库两种。两者对比:

0f5275fa802b32ef4c63bb0d3544ad1d.png

ebb179762564580fa29f81238cf54899.png

KingbaseES如何找so文件? 

金仓KingbaseES 在编译中使用 -r path 参数告诉编译器,编译生成可执行文件时记住库的位置,运行时不需要再设置这个动态库的位置。但工作中经常会遇到找不到so文件的问题,这就需要设置LD_LIBRARY_PATH环境变量。

LD_LIBRARY_PATH:动态库的查找路径
方法一:

export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 

注意:退出当前终端后就失效


方法二:

修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile

在其中添加例如

exportLD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH

 source .bashrc (Source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录)

方法三:

没有修改LD_LIBRARY_PATH,但效果是一样的实现动态库的查找。

1)/etc/ld.so.conf下面加一行,如: 

/usr/local/mysql/lib

2)保存后执行 ldconfig 生效。ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

b7e87cd47d98426d36a204d493980a74.png

库文件缺失的解决思路有哪些?

敲黑板!KingbaseES库文件缺失,操作思路有以下重要的三点:

01)如果执行命令,如 ksql,报“error while loading shared libraries” ,可以先执行:ldd path/ksql ,确认丢失的库文件名;

02)先到 Server/lib 路径下寻找,如果有对应的库文件,那可能是 LD_LIBRARY_PATH 环境变量问题,需要设置该环境变量;

01)如果Server/lib 路径下没有,再找 /lib64 , /lib 目录。注意:即使 /lib64 或  /lib 目录下有同样的库文件名,也未必可用,因为这些文件可能是PG的。

fe99007f043673e6692433c7f18056c1.png

 真实场景应用 

实例1:动态库版本不兼容

如在initdb时,提示libstdc++版本不兼容。

729d71e878f6a179b5382fcb9ac698c2.png

确认kingbase所链接的库的位置:

9d0c2de65d88fe76d252080fb9e04342.png

验证操作系统 libstdc++.so.6 文件,确认确实不包含kingbase程序所需要的 CXXABI_1.3.8 版本。

b80b07b597484bf4d84b6aedd0d7fb6c.png

问题分析:这种情况通常由于软件在编译时,libc版本较高,而用户现场的版本较低,导致版本不兼容的情况。需要用户现场升级操作系统版本。

实例2:错误设置LD_LIBRARY_PATH

ksql 连接数据库时,报错如下:

f6820e0eaed1cdabc072708d13956c73.png

从这个错误信息看,ksql 去连接5432端口,而5432 端口是PostgreSQL默认运行的端口,怀疑用户使用了错误lib库文件。

b4496d0a4cea33ec7006775c26361b8b.png

果然,ksql 使用了/lib64 下的libpq文件,而这个文件是操作系统安装时带入的PostgreSQL文件。修改LD_LIBRARY_PATH环境变量,指向 /opt/kb86/ES/V8/Server/lib目录。

393a44f808ff969a0b6a1731582179e3.png

确认已链接到正确的libpq文件。验证ksql连接正常:

2b792ba839b2d0d8c77a4dd630ec2856.png

总结:针对数据库可执行程序启动时缺少动态库的问题,可按照以下步骤可解决

首先通过ldd命令查看可执行程序需要加载的动态库;

检查LD_LIBRARY_PATH变量配置是否正确;

通过find命令查找缺失的so动态库文件;

建立查找到的动态库文件到数据库系统lib目录下的软链接;

重新启动应用程序;

如果不能找到缺失的动态库,需要安装相应的软件包。

77dade10e6aa4e1a6b9698e8769813a5.gif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值