Linux環境においてサーバーの設定作業をしていたら、Oracleに接続できなくなったという相談を受けました。
調べてみるとリスナーがまともに動いていない状態で、再起動しても状態は変わりません。
listener.oraなどの設定は一切触った形跡はありませんでしたので、設定の問題ではないようなのですが、なぜでしょう?
listener.logを見ると以下のようなエラーが出ていました。
TNS-12557: TNS: プロトコル・アダプタがロード不能です。
TNS-12560: TNS: プロトコル・アダプタ・エラー
TNS-00527: プロトコル・アダプタがロード不能です。
TNS-12557というのは見慣れない...というより初めて見るエラーコードです。
Oracleのマニュアルを見ると、このTNS-12557の原因と処置については以下のように書かれています。
原因: プラットフォーム(OS/2 など)によっては、プロトコル・アダプタが実行時にロードされます。プロトコル・アダプタの共有ライブラリ(またはDLL)が欠落しているか、サポートしているライブラリが欠落している場合に、このエラーが戻されます。
処置: 詳細を調べるには、トレースをオンにして、操作を再実行してください。トレース・ファイルには、ロードできなかった共有ライブラリ(またはDLL)の名前が記述されています。
サーバーの設定作業中に誤って共有ライブラリを削除してしまったのでしょうか?
しかし、Oracleのインストールディレクトリなどを調べてみても何かを削除したような形跡は特に見当たりません。
そこで、念のため、リスナーのトレースをとってみることにしました。
リスナーがまともに動いていない状態だったので、リスナー制御ユーティリティ(lsrctl)で
set trc_level off
としても、トレース・レベルが変更できなかったため、listener.oraに
TRACE_LEVEL_LISTENER=admin
と書き込んでリスナーを再起動しました。
そして、listener.trcにエラーらしきものが出ていないかを確認してみると、以下のようなログが出力されていました。
[11-6月 -2007 11:32:02:365] sntuscrt: entry/var/tmp/.oracleを作成する際にエラーが発生しているようです。
[11-6月 -2007 18:38:42:365] sntuscrt: failed to create dir /var/tmp/.oracle
[11-6月 -2007 18:38:42:365] sntuscrt: exit
[11-6月 -2007 18:38:42:365] snlsodx_lookup: entry
[11-6月 -2007 18:38:42:365] snlsodx_lookup: Can't open shared object library
実際にそのディレクトリを確認してみると、なんと、/var/tmpそのものがなくなっていました。
どうやらこれが直接の原因のようです。
/var/tmpを再作成すると、無事リスナーが起動し、Oracleに接続できるようになりました。