oracle - linux [01000] [unixODBC] [Driver Manager] 无法打开 lib'/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so': 文件未找到

我正试图从Linux服务器访问oracle,

当我尝试使用isql访问oracle时,得到驱动程序管理器无法打开libsqora.so.12.1的错误。

odbc.ini


[NAME]


 Application Attributes = T


 Attributes = W


 BatchAutocommitMode = IfAllSuccessful


 BindAsFLOAT = F


 CloseCursor = F


 DisableDPM = F


 DisableMTS = T


 Driver = Oracle 11g ODBC driver


 DSN = DSN_NAME


 EXECSchemaOpt =


 EXECSyntax = T


 Failover = T


 FailoverDelay = 10


 FailoverRetryCount = 10


 FetchBufferSize = 64000


 ForceWCHAR = F


 Lobs = T


 Longs = T


 MaxLargeData = 0


 MetadataIdDefault = F


 QueryTimeout = T


 ResultSets = T


 ServerName = ServerName


 SQLGetData extensions = F


 Translation DLL =


 Translation Option = 0


 DisableRULEHint = T


 UserID = xxxx


 Password=<password>


 StatementCache=F


 CacheBufferSize=20


 UseOCIDescribeAny=F



odbcinst.ini


 [Oracle 11g ODBC driver]


 Description=Oracle ODBC driver for Oracle 11g


 Driver=/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so


 FileUsage=1



然后,当我使用isql来访问oracle时,我得到以下错误:


 [root@xxxxx lib]# isql -v NAME


 [01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so' : file not found


 [ISQL]ERROR: Could not SQLConnect



我纠正了但仍然是同样的错误。


 [root@xxxxx tmp]# isql -v NAME


 [01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1' : file not found


 [ISQL]ERROR: Could not SQLConnect



 [root@xxxxx tmp]# ls -l /usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1


 -rw-r--r-- 1 bin bin 996363 Sep 5 2010 /usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1



 [Oracle 11g ODBC driver]


 Description=Oracle ODBC driver for Oracle 11g


 Driver=/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1


 FileUsage=1



环境


 [root@xxxxx tmp]# env


 HOSTNAME=xxxxx


 SSH2_TTY=/dev/pts/0


 SHELL=/bin/bash


 TERM=xterm


 HISTSIZE=1000


 ODBC_DIR=/usr/local/easysoft/unixODBC


 OLDPWD=/usr/local/easysoft


 SSH_SESSION_ID=1424


 SSH_TTY=/dev/pts/0


 LD_LIBRARY_PATH=/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib


 A__z="*SHLVL


 TNS_ADMIN=/usr/local/easysoft/oracle/InstantClient112/network/


 INPUTRC=/etc/inputrc


 PWD=/tmp


 LANG=en_US.UTF-8


 ODBCSYSINI=/etc/


 HOME=/root


 SHLVL=3


 ODBCINI=/etc


 LESSOPEN=|/usr/bin/lesspipe.sh %s


 ORACLE_HOME=/usr/local/easysoft/oracle/InstantClient112/


 G_BROKEN_FILENAMES=1


 _=/bin/env



 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/local/easysoft/unixODBC/bin:/opt/oraClient/11.2.0.4/bin



已在目录/opt/oraClient/ 11.2.0.4 _32/中安装32bit oracle客户端。

修改了odbcinst.ini:


[Oracle 11g ODBC driver]


Description=Oracle ODBC driver for Oracle 11g


#Driver=/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1


Driver=/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1


FileUsage=1



错误:


[root@xxxxx lib]# /usr/local/bin/isql -v NAME 


 [01000][unixODBC] [Driver Manager]Can't open lib '/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1' : file not found


 [ISQL]ERROR: Could not SQLConnect




 [root@xxxxx lib]# file /opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1


 /opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped



更多调试信息:


 [root@xxxxx bin]# ldd /opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1


 ldd: warning: you do not have execution permission for `/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1'


 linux-gate.so.1 => (0xffffe000)


 libdl.so.2 => /lib/libdl.so.2 (0xf7f2b000)


 libm.so.6 => /lib/libm.so.6 (0xf7f02000)


 libpthread.so.0 => /lib/libpthread.so.0 (0xf7ee8000)


 libnsl.so.1 => /lib/libnsl.so.1 (0xf7ecf000)


 libclntsh.so.11.1 => not found


 libodbcinst.so.1 => not found


 libc.so.6 => /lib/libc.so.6 (0xf7d71000)


 /lib/ld-linux.so.2 (0x00134000)



我没有获得 "not found" ,导致一些问题:


 [root@xxxxx bin]# ls /opt/oraClient/11.2.0.4_32/lib/libclntsh.so.11.1


 /opt/oraClient/11.2.0.4_32/lib/libclntsh.so.11.1



下面是最新的env输出:


 [root@xxxxx]# env


 HOSTNAME=xxxxx


 SSH2_TTY=/dev/pts/0


 TERM=xterm


 SHELL=/bin/bash


 HISTSIZE=1000


 ODBC_DIR=/usr/local/easysoft/unixODBC


 SSH_TTY=/dev/pts/0


 LD_LIBRARY_PATH=/opt/oraClient/11.2.0.4_32/:/opt/oraClient/11.2.0.4_32/lib/:/usr/local/easysoft/oracle/InstantClient112:/usr/local/easysoft/oracle/InstantClient112/lib/


 TNS_ADMIN=/opt/oraClient/11.2.0.4_32/network/


 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/local/easysoft/unixODBC/bin:/opt/oraClient/11.2.0.4_32/bin


 INPUTRC=/etc/inputrc


 LANG=en_US.UTF-8


 ODBCSYSINI=/etc/


 SHLVL=4


 HOME=/root


 ODBCINI=/etc


 ORACLE_HOME=/opt/oraClient/11.2.0.4_32/


 G_BROKEN_FILENAMES=1


 _=/bin/env



时间:

这个错误有误导性:


The file that the error claimed was not present did exist.



我可以通过执行以下命令来追查实际丢失的文件:


# ldd /path/to/your/socalled/missing/file.so



这返回了一系列文件,其中一个表示:


libodbcinst.so.2 => not found



这是罪魁祸首。

如果你已经下载了instantclient-odbc-linux软件包,并且将它解压缩到与基本包相同的位置,libsqora.so.11.1文件,/usr/local/easysoft/oracle/InstantClient112

你的.ini应该指向:


Driver=/usr/local/easysoft/oracle/InstantClient112/libsqora.so.11.1



如果在解压.so后将文件移动到子目录(),那么


Driver=/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1



...