今日もなんだかいい天気♪

アクセスカウンタ

help RSS ORA-27154を起こしてみる。んで、解決してみる。

<<   作成日時 : 2009/07/25 19:32   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

元ネタはココ・・・って、自分のブログなんだけど(汗)。
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を試みる、というわけ。

テーマ

注目テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
ORA-27154を起こしてみる。んで、解決してみる。 今日もなんだかいい天気♪/BIGLOBEウェブリブログ
[ ]