发现我们用的Perl在数据库版本变化后(如8i到9i, 9i到10g)时, DBD-Oracle模块都需要重新编译Perl才能工作. 在多种数据库版本混合使用的环境下, 就需要安装几个Perl(或只使用一个版本的客户端)才能解决问题, 其中的原因是因为编译出来的Oracle.so会去找特定版本的Oracle客户端库文件, 如下所示:
$ldd ./lib/site_perl/5.8.5/sun4-solaris-64/auto/DBD/Oracle/Oracle.so
libclntsh.so.9.0 => /export/home/oracle/products/9201/lib/libclntsh.so.9.0
libnsl.so.1 => /usr/lib/64/libnsl.so.1
libsocket.so.1 => /usr/lib/64/libsocket.so.1
......
其实在每一个Oracle的客户端库目录下都会有一个"libclntsh.so"的链接指向"libclntsh.so.ver", 如果在ldd的输出中只去查找"libclntsh.so"的话, 就可以解决在8i/9i/10g下的重新编译的问题了. 我在编译OCI程序时, 就没有不同版本的客户端的问题.
$ldd ociuldr.bin
libm.so.1 => /usr/lib/libm.so.1
libclntsh.so => /export/home/oracle/products/9201/lib32/libclntsh.so
......
今天就将这个方法用在Perl的DBD-Oracle模块中试试吧, 首先下载DBD-Oracle源程序, 然后就可以开始了. 如果你只想替换Oracle.so文件, 则需要注意下载的源代码的版本要和现在正在用的一致.
Perl分32位和64位, DBD-Oracle也分为32位和64位. 在解压源程序后, 首先用以下命令生成Makefile:
32Bit: perl Makefile.PL -r=build32
64Bit: perl64 Makefile.pl -r=build64
接下来执行make命令就可以编译了, 可以用以下命令查找Oracle.so的所在位置:
$find ./ -name Oracle.so
./blib/arch/auto/DBD/Oracle/Oracle.so
用这个刚生成的文件去换掉现在正在使用的文件, 然后在8i/9i/10g的客户端下试试? Oracle的客户端库的位置如下:
32Bit
8i:${ORACLE_HOME}/lib
9i:${ORACLE_HOME}/lib32
10g${ORACLE_HOME}/lib32
64Bit
8i:${ORACLE_HOME}/lib64
9i:${ORACLE_HOME}/lib
10g${ORACLE_HOME}/lib
只要根据你编译的版本, 设置合适的LD_LIBRARY_PATH变量(AIX5L下是LIBPATH变量).
留言 (1)
下载1.19版本, 在10g的环境下编译, Makefile.PL中将opt_V设为8, 就可以了.
我已经在8i/9i/10g上测试过了.
Posted by anysql | Nov 30, 2006 9:56 AM