导入"ibm_db"时出错
我遇到了这个错误!
错误追踪(最近的调用最后): 文件 "/home/e****/RRR/RRR_Success.py",第37行,在 ? 导入 ibm_db 导入错误:libdb2.so.1:无法打开共享对象文件:没有这样的文件或目录
请帮我解决这个问题
4 个回答
1
这是我为一个docker镜像所做的事情:
WORKDIR /home/db2_cli_odbc_driver
RUN apt-get update && \
apt-get --assume-yes install \
wget && \
wget https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/linuxx64_odbc_cli.tar.gz -O odbc_cli.tar.gz && \
tar -xvf odbc_cli.tar.gz && rm odbc_cli.tar.gz && \
echo /home/db2_cli_odbc_driver/clidriver/lib > /etc/ld.so.conf.d/db2.conf && \
ldconfig && \
apt-get purge -y --auto-remove wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV IBM_DB_HOME=/home/db2_cli_odbc_driver/clidriver
换句话说,
- 下载驱动程序
- 解压它
- 创建一个
/etc/ld.so.conf.d/db2.conf
文件,指向目标文件夹 - 运行
ldconfig
- 在安装python包之前,设置
IBM_DB_HOME
变量
1
根据我的经验,LD_LIBRARY_PATH这个东西其实并不需要。我在一台机器上遇到了这个问题,那台机器上同时安装了Python的db2 odbc驱动和db2服务器。
首先,检查一下系统里是否只有一个libdb2.so.1这个文件。你可以用下面的命令来查找:
find / -name libdb2.so.1
如果发现有两个这样的文件,那它们可能是不同的,所以要检查一下它们的md5值。
[root@localhost ~]# cat /etc/ld.so.conf.d/db2-odbc.conf
/opt/ibm/db2/odbc_cli/clidriver/lib
[root@localhost ~]# ll /opt/ibm/db2/odbc_cli/clidriver/lib/libdb2.so.1
[root@localhost ~]# ll /home/db2inst1/sqllib/lib64/libdb2.so.1
-r-xr-xr-x 1 bin bin 42685547 Dec 15 08:49 /home/db2inst1/sqllib/lib64/libdb2.so.1
[root@localhost ~]# md5sum /home/db2inst1/sqllib/lib64/libdb2.so.1
ffca929b98201e3934e9625d1480890f /home/db2inst1/sqllib/lib64/libdb2.so.1
[root@localhost ~]# md5sum /opt/ibm/db2/odbc_cli/clidriver/lib/libdb2.so.1
a1247f1582eb1bd2fc248b3901812951 /opt/ibm/db2/odbc_cli/clidriver/lib/libdb2.so.1
[root@localhost ~]#
如果这些文件确实不同,你可以通过修改ldconfig来控制链接哪个文件。
[root@localhost ~]# ll /etc/ld.so.conf.d/
total 24
-rw-r--r--. 1 root root 17 Feb 9 2012 atlas-x86_64.conf
-rw-r--r-- 1 root root 28 Dec 15 08:50 db2.conf
-rw-r--r-- 1 root root 36 Dec 15 09:07 db2-odbc.conf
-r--r--r--. 1 root root 324 Jun 6 2014 kernel-2.6.32-431.20.3.el6.x86_64.conf
-rw-r--r--. 1 root root 17 Feb 3 2014 mysql-x86_64.conf
-rw-r--r--. 1 root root 22 Jul 18 2011 qt-x86_64.conf
[root@localhost ~]#
我把这个文件夹里的db2.conf文件删掉,然后运行了ldconfig,这样就开始正常工作了。
[root@localhost ~]# mv /etc/ld.so.conf.d/db2.conf mahesh/
[root@localhost ~]# ldconfig
需要注意的是,来自db2inst1的db2客户端仍然可以正常使用,而LD_LIBRARY_PATH就是在这里设置的。
[root@localhost ~]# su - db2inst1
[db2inst1@localhost ~]$ db2 connect to dbname
Database Connection Information
Database server = DB2/LINUXX8664 10.5.3
SQL authorization ID = DB2INST1
Local database alias = dbname
[db2inst1@localhost ~]$ env | grep LIBRARY
LD_LIBRARY_PATH=/home/db2inst1/sqllib/lib64:/home/db2inst1/sqllib/lib32
[db2inst1@localhost ~]$
1
上面的错误提示说明你的系统找不到DB2的客户端库,也就是相关的文件没有在你的LD_LIBRARY_PATH这个环境变量里。你需要把路径/home/../path/to/sqllib/lib添加到你的LD_LIBRARY_PATH中。想了解更多信息,可以查看这个链接:http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.gs.doc/doc/c0006321.html?lang=en