web-dev-qa-db-ja.com

[01000] [unixODBC] [Driver Manager] lib '/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so'を開けません:ファイルが見つかりません

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)

いくつかの問題を引き起こしている可能性のある「見つかりません」というメッセージは表示されません。

 [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
20
user3521305

このエラーは誤解を招くものです。

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

以下を実行することで、実際に不足しているファイルを追跡できました。

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

これは一連のファイルを返し、1つは次のように言いました。

libodbcinst.so.2 => not found

それが私にとっての犯人でした。その後、必要なリンクを作成しましたが、エラーはなくなりました。

参照: http://mailman.unixodbc.org/pipermail/unixodbc-support/2011-November/003018.html

30
user3771500

インスタントクライアントには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も設定していません。

インストール手順:

  1. プラットフォームに適したインスタントクライアントパッケージをダウンロードします。すべてのインストールには、基本パッケージが必要です。

  2. パッケージを「instantclient」などの単一のディレクトリに解凍します。

  3. 環境内のライブラリのロードパスを手順2のディレクトリ(「instantclient」)に設定します。多くのUNIXプラットフォームでは、LD_LIBRARY_PATHが適切な環境変数です。 Windowsでは、PATHを使用する必要があります。

  4. アプリケーションを起動してお楽しみください。

明らかに、ステップ(4)はまだ機能していませんが、それはステップ(3)をまだ行っていないためだと思います。また、ファイルを分割すると(それ自体が問題を引き起こす可能性があります)、.../InstantClient112.../InstantClient112/libの両方をLD_LIBRARY_PATH変数に含める必要があるかもしれません。そして、変更した値がエクスポートされていることを確認してください。しかし、なぜファイルを再配置したいのかわかりません。

3
Alex Poole