kagamihogeの日記

kagamihogeの日記です。

Oracle 11g XEのリスナーが起動しなくなった

centosにインストールしたoracle 11g xeをアンインストールしてもっかいインストールしなおしたら、リスナーが起動しなくなった。

起きたこと、やったこと

インスタンスは起動するのだけど、リスナーが起動に失敗する。ローカルからはsqlplusで接続できるのに、外部からは接続できないのでなんだ? と思ったらリスナーの起動に失敗していた。

よって、LSNRCTLからリスナーの起動を試みてみる。


LSNRCTL> start
/u01/app/oracle/product/11.2.0/xe/bin/tnslsnrを起動しています。お待ちください...
TNSLSNR for Linux: Version 11.2.0.2.0 - Production
System parameter file is /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/11.2.0/xe/log/diag/tnslsnr/kagamihogex61/listener/alert/log.xml
リスニング・エラーです: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
TNS-12555: TNS: 許可が拒否されました。
TNS-12560: TNS: プロトコル・アダプタ・エラー
TNS-00525: 操作するには権限が不十分です。
Linux Error: 1: Operation not permitted

リスナーが起動に失敗しました。前述のエラー・メッセージを参照してください...

ぐぐってみると、弁財天: TNS-00525: Insufficient privilege for operation に辿り着く。

サーバがリブートするときIPC KEYの予約ファイルが/tmp/.oracleに残る。
コマンド操作でtnsプロセスをkillした場合にも発生。
同じユーザでリスナーを起動している場合には問題は発生しないが、別のユーザでリスナーを起動してしまったときにも問題が発生。
先頭が"s"のIPC KEYエントリのファイルをチェック(もしKEY=KKならファイル名はsKKになってる)。
ファイルの所有者が別ユーザになっている場合はrootユーザでファイルを削除(または、所有者を変更)する。
弁財天: TNS-00525: Insufficient privilege for operation より抜粋

俺自身がlinuxド素人ということもあり、詳しいことは知識不足でちょっと良く分からない。ただ、/tmp/.oracleとかリスナーが起動するときに参照するファイルのパーミッションがおかしなことになってるから、ということまでは分かる。/tmp/.oracleの所有者はoracleユーザでないとダメだと思われるが、俺の環境ではrootになっていた。権限不足のエラーはコレで起きているのでは、と思われる。どーしてこうなったかというと、oracleがいきなり起動しなくなって、焦ってユーザをrootだったり他のユーザだったりでoracle起動しようとしたり停止させようとしたりしたのが、原因っぽい。

解決方法は、じゃあ/tmp/.oracleを消せばいいのか、ってことで消してみたが……ダメ。

というわけで、どうせIPCは俺の実験環境のOracleでは関係ないしってことでlistener.oraからコメントアウトしてしまって当座はしのぐことにした。下から6行目の # (ADDRESS = (PROTOCOL = IPC)〜って行をコメントアウトする。これで外部から接続可能になった。

$ vi /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora 
# listener.ora Network Configuration File:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
     # (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = kagamihogex61)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)