我正在尝试从linux服务器访问oracle。我正在使用unixODBC。
当我尝试使用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
我在odbcinst.ini中输错了。我已经纠正但仍然是同样的错误。
[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
ENV
[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
修复了LD_LIBRARY_PATH更新的原始问题,但现在它再次被破坏,因为我正在尝试使用32位Oracle客户端。
在目录/opt/oraClient/11.2.0.4_32 /.
中安装了32位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
如果我需要使用32位Oracle客户端,我做错了什么......我知道它是环境变量中的东西。
[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)
我没有找到一个&#34;未找到&#34;这可能会导致一些问题:
[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
答案 0 :(得分:28)
此错误具有误导性:
The file that the error claimed was not present did exist.
我能够通过执行:
来追逐实际丢失的文件# ldd /path/to/your/socalled/missing/file.so
这返回了一系列文件,其中一个说:
libodbcinst.so.2 => not found
这是我的罪魁祸首。然后我创建了我需要的链接,瞧,错误就消失了。
参考:http://mailman.unixodbc.org/pipermail/unixodbc-support/2011-November/003018.html
答案 1 :(得分:3)
Instant客户端没有lib
目录。如果您已下载instantclient-odbc-linux
package并将其解压缩到与基本软件包相同的位置,那么libsqora.so.11.1
文件将在/usr/local/easysoft/oracle/InstantClient112
下保存。
所以你的.ini应该指向:
Driver=/usr/local/easysoft/oracle/InstantClient112/libsqora.so.11.1
注意扩展名;您可能希望将其软链接到libsqora.so
。如果您在解压缩(?)后将.so
文件移动到子目录中,那么您需要:
Driver=/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so.11.1
看起来你在解压缩后重新启动了即时客户端文件,创建了一个lib
目录。我不确定这是否会直接导致你的问题。但您还没有设置LD_LIBRARY_PATH
,因为installation instructions建议:
安装步骤:
下载适用于您平台的相应Instant Client软件包。所有安装都需要Basic包。
将软件包解压缩到一个目录,例如“instantclient”。
将环境中的库加载路径设置为步骤2中的目录(“instantclient”)。在许多UNIX平台上,LD_LIBRARY_PATH 是适当的环境变量。在Windows上,PATH应该是 用过的。
- 醇>
启动您的申请并享受。
显然步骤(4)还没有为你工作,但我认为那是因为你还没有完成第(3)步;我认为,当您拆分文件时 - 这可能会导致问题 - 您可能需要在.../InstantClient112
变量中同时包含.../InstantClient112/lib
和LD_LIBRARY_PATH
。并确保导出修改后的值。我不确定你为什么要重新排列文件。
答案 2 :(得分:-3)
sudo apt-get install libaio1 libaio-dev