【问题标题】:[01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so' : file not found[01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':找不到文件
【发布时间】:2014-05-24 20:29:38
【问题描述】:

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

【问题讨论】:

  • 基本即时客户端没有该文件(或lib 目录)。那么它真的是路径建议的即时客户端,还是完整的客户端(或服务器)?
  • 已修复...仍然无法正常工作。
  • 如果您重新排列了即时客户端文件,我不知道这是否会混淆内部链接 - 也许错误是另一个找不到的错误?您可能还需要将lib 目录(和/或其父目录)添加到LD_LIBRARY_PATH,这有什么不同吗?
  • 我根据您的反馈更新了 LD_LIBRARY_PATH 并且成功了。
  • 我让 isql 工作,但发现我正在为其构建的应用程序仅支持 32 位 oracle 客户端。因此我安装了 32 位 oracle 并再次破坏了它。我现在在执行 sql 时遇到同样的错误。

标签: linux oracle unixodbc oracleclient


【解决方案1】:

此错误具有误导性:

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 应用程序访问时遇到了同样的文件丢失问题。
  • 如果文件存在但不在库路径中,可以设置LD_LIBRARY_PATH或添加文件到/etc/ld/conf.d,然后重新运行ldconfig
  • @user3771500 能否请您发布您创建的链接,我缺少这些文件:libicuuc.so.42 和 libicudata.so.42
  • #ldd 救了我!
  • 我也想知道您是如何“创建链接”的?我这边有libclntsh.so.12.1 =&gt; not foundlibclntshcore.so.12.1 =&gt; not found
【解决方案2】:

即时客户端没有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 建议的那样:

安装步骤:

  1. 为您的平台下载适当的 Instant Client 软件包。所有安装都需要基本包。

  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 安装。
  • 请帮助...我已经尝试了对 odbsinst.ini 文件的所有更改。
  • @user3521305 - 如果您现在得到 ORA-01017,那不是驱动程序或环境问题。您已成功联系数据库,但是否正确取决于您的SMARTS_SDI_NA DSN 指向的位置。那是错误的数据库实例,或者您的 odbc.ini 中的用户名或密码对于该 DSN 是错误的。请记住,这些在 11g 中是区分大小写的。我认为这三个中的一个肯定是错误的,很可能是密码。检查您是否可以连接其他客户端。
  • 我粘贴了错误的输出... ORA-01017 是用于 64 位 oracle 驱动程序的工作...我可以让它工作。我的问题是当我尝试使用 32 位 oracle 驱动程序时。
  • 好的,那么该文件肯定存在 - 您获得了 32 位 ODBC 包 - 并且您将 LD_LIBRARY_PATH 设置为该新位置?
【解决方案3】:

sudo apt-get install libaio1 libaio-dev

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2020-03-14
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多