最近、SQL ServerODBCドライバーを使用してOracleをSQLServerに接続していたお客様から、次のエラーが報告されました。
ORA-28545: error diagnosed by Net8 when connecting to an agent Unable to retrieve text of NETWORK/NCR message 65535 ORA-02063: preceding 2 lines from SQLSERVERLINK
この「キャッチオール」エラーは、次の場合に発生する可能性があります。
- 環境が正しく設定されていません(たとえば、LD_LIBRARY_PATHがunixODBCライブラリディレクトリを指していないか、ODBCSYSINIがターゲットODBC DSNが定義されているodbc.iniのコピーを含むディレクトリを指していない)。 >
- 64ビットのDG4ODBCライブラリは32ビットのODBCライブラリで使用されており、その逆も同様です。
- DG4ODBC構成で指定されたSIDが、tnsnames.oraで指定されたホストで実行されていません。
ただし、調査の結果、これらの問題はいずれも適用されませんでした。原因はOracleの設定ミスの問題であると考えられます。これは、DG4ODBCデバッグが有効になっているにもかかわらず、DG4ODBCデバッグファイルが生成されていないためです。つまり、OracleがDG4ODBCライブラリをロードするまでに到達していませんでした。
このような場合、お客様のOracle構成ファイルを要求します。これにより、.oraファイルで角かっこが欠落している、または置き忘れているのを見つけるのが難しいため、お客様の設定を再現できます。
お客様のエラーを再現できませんでした。提供された構成ファイルは完全に機能しました。
次のステップは、strace
を使用することでした Oracleリスナーの起動時にロードされていた構成ファイルを「内部」で確認します。これを行うために、お客様に次のことを依頼しました:
- Oracleユーザーとして2つのシェルセッションを開始します。
- シェル1で、Oracleリスナーを停止します。
- 次のコマンドでリスナーを起動します:
strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
- シェル2で、SQL * PLusを起動し、DG4ODBC /SQLServerデータベースリンクに対してSQLステートメントを実行します。
- シェル2で、Oracleリスナーを停止します。
straceログ/tmp/easysoft.logは、根本的な問題を明らかにしました。当初、Oracleリスナーはlistener.oraをロードして読み取ることができました:
53049 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = 3 53049 read(3, "#/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora Network Configuration File: \n# Generated by Oracle configuration tools.\n\nLISTENER =\n (DESCRIPTION_LIST =\n (DESCRIPTION =\n (ADDRESS = (PROTOCOL = TCP)..., 4096) = 577
ただし、顧客のOracleセットアップは次のとおりです。ユーザーAがリスナーを起動してユーザーBになりました。straceで明らかになったのは、ユーザーBにその.oraファイルをロードするための十分なアクセス許可がないことです。
53051 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = -1 EACCES (Permission denied)
最終的に、これがお客様の「ORA02063」の原因でした。