|
元ネタはココ・・・って、自分のブログなんだけど(汗)。 http://noro2-diary.at.webry.info/200907/article_40.html この中で「セマフォが獲得できないために発生」とか書いた。 それは正しいが、対処が間違っていた。 セマフォが獲得できてないんだから、セマフォ数(SEMMNS)を増やすか、DBのPROCESSESを減らせばいい。 ORA-27154の場合、コレでは対処できない。 根本的な原因は、何らかの理由でインスタンスが異常終了して、セマフォが開放されずに残ってしまった。 セマフォ集合は、キー値でインスタンスごとに識別されているため、インスタンスの起動を試みると、すでにそのセマフォは獲得されているため、新たに起動しようとしたインスタンスはセマフォを獲得できない。 ・・・ということが原因。 そんなわけで、PROCESSESを減らすとか、SEMMSLを増やしたりとかしても、解決にはならない。 残ってしまったセマフォを開放してから再起動を試みるっていうのが正しい。 で、どんなときにセマフォが開放されずに残るのか? いろいろやってみたが、SHUTDOWN ABORTではもちろんダメ(言い方に語弊があるが、リソースは問題なく開放されている)。 <SHUTDOWN ABORTした場合> -bash-3.00$ sysresv -l orcl01 IPC Resources for ORACLE_SID "orcl01" : Shared Memory: ID KEY 8 0xad030c04 Semaphores: ID KEY 26 0x723fc244 Oracle Instance alive for sid "orcl01" SQL> shutdown abort ORACLEインスタンスがシャットダウンされました。 -bash-3.00$ sysresv -l orcl01 IPC Resources for ORACLE_SID "orcl01" : Shared Memory ID KEY No shared memory segments used Semaphores: ID KEY No semaphore resources used Oracle Instance not alive for sid "orcl01" ちゃんとリソースは開放されている。 じゃあ、バックグラウンドプロセスをKILL -9してみる。 -bash-3.00$ ps -ef | grep ora_ | grep orcl01 oraora 1274 1 0 19:01:47 ? 0:00 ora_mmnl_orcl01 oraora 1282 1 0 19:01:53 ? 0:00 ora_qmnc_orcl01 oraora 1290 1 0 19:02:03 ? 0:00 ora_q000_orcl01 oraora 1278 1 0 19:01:48 ? 0:00 ora_s000_orcl01 oraora 1272 1 0 19:01:47 ? 0:00 ora_mmon_orcl01 oraora 1276 1 0 19:01:48 ? 0:00 ora_d000_orcl01 oraora 1256 1 0 19:01:47 ? 0:00 ora_psp0_orcl01 oraora 1268 1 0 19:01:47 ? 0:00 ora_reco_orcl01 oraora 1270 1 0 19:01:47 ? 0:00 ora_cjq0_orcl01 oraora 1286 1 1 19:01:54 ? 0:00 ora_j000_orcl01 oraora 1258 1 0 19:01:47 ? 0:00 ora_mman_orcl01 oraora 1260 1 0 19:01:47 ? 0:00 ora_dbw0_orcl01 oraora 1262 1 0 19:01:47 ? 0:00 ora_lgwr_orcl01 oraora 1266 1 0 19:01:47 ? 0:00 ora_smon_orcl01 oraora 1264 1 0 19:01:47 ? 0:00 ora_ckpt_orcl01 oraora 1292 1 0 19:02:03 ? 0:00 ora_q001_orcl01 oraora 1254 1 0 19:01:47 ? 0:00 ora_pmon_orcl01 -bash-3.00$ kill -9 1254 -bash-3.00$ sysresv -l orcl01 IPC Resources for ORACLE_SID "orcl01" : Shared Memory ID KEY No shared memory segments used Semaphores: ID KEY No semaphore resources used Oracle Instance not alive for sid "orcl01" これでもやっぱりリソースはちゃんと開放されている。 あ、でもこの場合、起動しようとしたら下のエラーが出た。 SQL> startup ORA-24324: サービス・ハンドルが初期化されていません。 ORA-01041: 内部エラーが発生しました。hostdefエクステンションが存在しません。 KILLコマンドは怖いねぇ。 これは、一旦EXITしてから再度接続しなおして、STARTUPすればいい。 この程度のエラーじゃビビらないぜ。 で、どうしたら再現するだろう・・・と考えていたら、なんのこっちゃない。 インスタンス起動中(nomountするまでの間)に、CTRL+Cで強制終了するのが一番手っ取り早い。 ・・・と思ったら、これもうまくいかないことが多い。 リソースの獲得はあっという間に完了してしまう。 タイミング的には、リソースの獲得が完了する前に、強制終了できなくちゃいけないっぽい。 確信はもちろんないが。 で、その場合、どうなるかというと、sysresvの実行結果がこうなる。 -bash-3.00$ sysresv -l orcl01 IPC Resources for ORACLE_SID "orcl01" : Shared Memory: ID KEY No shared memory segments used Semaphores: ID KEY 46 0x723fc244 Oracle Instance not alive for sid "orcl01" インスタンスは起動していない(not alive)なのに、セマフォを獲得した状態になっている。 この状態で、orcl01インスタンスを起動しようとすると、ORA-27154が発生する。 これを解決するためには、sysresv -i (または -f)かipcrm -s コマンドでセマフォを開放してやる。 上記の場合は、 ipcrm -s 46 (※確認メッセージはないので注意) または sysresv -i 46 (※削除してもいいか確認してくる。 -f の場合、確認なし。どちらの場合も、インスタンスが起動している場合は警告が出て削除できない。) を実行してから、再度、STARTUPを試みる、というわけ。 |
| << 前記事(2009/07/25) | ブログのトップへ | 後記事(2009/07/29) >> |
| タイトル (本文) | ブログ名/日時 |
|---|
| 内 容 | ニックネーム/日時 |
|---|
| << 前記事(2009/07/25) | ブログのトップへ | 後記事(2009/07/29) >> |