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
このエラーは誤解を招くものです。
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
インスタントクライアントには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
も設定していません。
インストール手順:
プラットフォームに適したインスタントクライアントパッケージをダウンロードします。すべてのインストールには、基本パッケージが必要です。
パッケージを「instantclient」などの単一のディレクトリに解凍します。
環境内のライブラリのロードパスを手順2のディレクトリ(「instantclient」)に設定します。多くのUNIXプラットフォームでは、LD_LIBRARY_PATHが適切な環境変数です。 Windowsでは、PATHを使用する必要があります。
アプリケーションを起動してお楽しみください。
明らかに、ステップ(4)はまだ機能していませんが、それはステップ(3)をまだ行っていないためだと思います。また、ファイルを分割すると(それ自体が問題を引き起こす可能性があります)、.../InstantClient112
と.../InstantClient112/lib
の両方をLD_LIBRARY_PATH
変数に含める必要があるかもしれません。そして、変更した値がエクスポートされていることを確認してください。しかし、なぜファイルを再配置したいのかわかりません。