[01000][unixODBC][驱动程序管理器]无法打开库'/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':文件未找到。

28

我正在尝试从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

环境

 [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)

我不明白其中一个可能会导致一些问题的“未找到”:

 [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

以下是最近的环境输出:

 [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

基本的Instant Client没有那个文件(或'lib'目录)。所以它真的是路径所示的Instant Client,还是一个完整的客户端(或服务器)? - Alex Poole
修复了...仍然无法工作。 - user3521305
如果您重新排列了即时客户端文件,我不知道是否可能会混淆内部链接 - 也许错误是关于另一个找不到的链接?您还可能需要将“lib”目录(和/或其父目录)添加到“LD_LIBRARY_PATH”中,这有任何区别吗? - Alex Poole
我根据您的反馈更新了LD_LIBRARY_PATH,现在它可以正常工作了。 - user3521305
我已经让isql工作了,但是发现我正在构建这个应用程序的平台只支持32位的oracle客户端。因此,我安装了32位的oracle,但又把它搞崩了。当我执行SQL时现在出现了相同的错误。 - user3521305
3个回答

50

这个错误信息有误导性:

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


谢谢你的提示,我在Ubuntu上设置Linux I应用程序访问时也遇到了同样的缺失文件问题。 - gfroese
如果文件存在但不在库路径中,您可以设置 LD_LIBRARY_PATH 或将文件添加到 /etc/ld/conf.d 并重新运行 ldconfig - Gert van den Berg
1
@user3771500,请问您可以发布一下您创建的链接吗?我的文件中缺少这些文件:libicuuc.so.42和libicudata.so.42。 - Alen

ldd救了我!

- avn
我想知道你是如何“创建链接”的?在我的电脑上,出现了libclntsh.so.12.1 => 未找到libclntshcore.so.12.1 => 未找到的情况。 - Alexis.Rolland

3
即时客户端(Instant Client)没有lib目录。如果您已经下载了instantclient-odbc-linux软件包并将其解压到与基本软件包相同的位置,则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”: 安装步骤:
  1. 下载适用于你的平台的相应即时客户端软件包。所有安装都需要基本软件包。
  2. 将软件包解压缩到一个名为“instantclient”的目录中。
  3. 在你的环境中将库加载路径设置为第2步(“instantclient”)中的目录。在许多UNIX平台上,LD_LIBRARY_PATH是适当的环境变量。在Windows上,应使用PATH。
  4. 启动你的应用程序并享受它。
显然,步骤(4)对你还没有起作用,但我认为这是因为你还没有执行步骤(3)。而且,由于你已经拆分了文件——这本身可能会引起问题——所以你可能需要在“LD_LIBRARY_PATH”变量中同时包含“.../InstantClient112”和“.../InstantClient112/lib”两个路径。并确保修改后的值已经被导出。但我不确定为什么你要重新排列文件。

这是为 UnixODBC 打包的公司构建,看起来他们已经包含了 Oracle 驱动程序和 InstantClient。但我将驱动程序指向了位于 /opt/oraClient/11.2.0.4_32/ 下的 32 位 Oracle 安装。 - user3521305
@user3521305 - 如果你现在遇到ORA-01017错误,那不是驱动程序或环境问题。你已经成功连接到了一个数据库,但它是否正确取决于你的SMARTS_SDI_NA DSN指向哪里。那是错误的DB实例,或者你的odbc.ini中的用户名或密码对于该DSN是错误的。请记住,在11g中这些区分大小写。我认为其中三个之一肯定是错的,最有可能是密码。检查你能否使用不同的客户端连接。 - Alex Poole
我粘贴了错误的输出...ORA-01017是使用64位Oracle驱动程序的工作正常...我可以让它正常工作。我的问题是当我尝试使用32位Oracle驱动程序时。 - user3521305
好的,那么该文件肯定存在——您已经获得了32位ODBC包,并将LD_LIBRARY_PATH设置为新位置了吗? - Alex Poole
如果没有被导出,它就不会在环境输出中。有没有更有经验的人可以通过调试来解决问题? - user3521305
显示剩余8条评论

-4

sudo apt-get install libaio1 libaio-dev

请执行此命令安装libaio1和libaio-dev。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接