shutdown immeidateしない、ほかの理由に遭遇! #3 Tweet
もう一つ検証し忘れてた!。
この現象に気づいたとき、SQL*Plusから接続していたユーザがsysユーザや、systemユーザだけだったので、それ以外のユーザで接続している場合は大丈夫なんじゃね?都市伝説の検証…
これまでと同様に2つのSQL*Plusを起動しておきます。
1つめのSQL*Plusでは、sysユーザに接続しておきます…
[oracle@leaffish ˜]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 07:26:10 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
07:26:10 > conn / as sysdba
接続されました。
2つめのSQL*Plusでは、scottユーザ(sysユーザ、systemユーザ以外の一般ユーザ)に接続し、host command(!)でshellに入ったままにしておきます…
[oracle@leaffish ˜]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 07:26:23 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
07:26:23 > conn scott/tiger
接続されました。
07:26:29 SCOTT> !
[oracle@leaffish ˜]$
では、sysユーザでshutdown immeidateを実行してみます…
07:26:10 > conn / as sysdba
接続されました。
07:26:16 SYS>
07:26:16 SYS>
07:26:17 SYS> shutdown immediate
お〜〜〜、shutdown immeidateが待機させられています。
「SQL*Plusから接続していたユーザがsysユーザや、systemユーザだけだったので、それ以外のユーザで接続している場合は大丈夫なんじゃね?都市伝説」は都市伝説。
Oracleへ接続するユーザに関係なく、SQL*Plusからhost command(!)でshellに入ったままのセッションがある状態で他のセッションからshutdown immeidateを実行した場合、shutdown immeidateは、shutdown timeoutせずにshutdownを待機し続けるのは事実。
まとめると…
現象:
- shutdown immeidate文を実行したがshutdown timeout(1時間)も発生せずshutdownが待機させれれたままになり停止できない。
発生条件(Updated 16-Feb-2011):
- Linux/Unix系のOracle11g R2 11.2.0.1.0 (ちなみにそれ以外のリリースでは11.1.0.7.0で同様の現象を確認しています、他のリリースでは未検証。)
- shutdown immeidateを発行するセッション以外に、SQL*Plusからhost command(! はたま host)でshellに入ったままになっているセッションがある場合。かつ、Bequeath ProtocolでOracleへ接続している。
確認ポイント:
- アラートログに "SHUTDOWN: Active processes prevent shutdown operation"が繰り返される。
- ps -ef | grep ora などでプロセスをみると <defunct>な子プロセスがあり、親プロセスがSQL*Plusである。
- ls -lrt で最後にリストされるトレースファイル(shutdownを実行しているプロセスのトレースファイル)に"ksukia: Attempt <連番?> to re-kill process OS PID=<pid>"のメッセージが繰り返し出力され続ける。
対処(Updated 16-Feb-2011):
shutdown aboartするしかない。<defunct>なプロセスの親であるSQL*Plusのプロセスをkill -SIGTERMとか-SIGKILLで終了させる。それでもshutdownが待機しているようなら、最後の手段、shutdown abortということで。
SQL*Plus起動してる人が連絡取れる場所にいるのならその方にexitしてもらうのもありw- その他の方法として、sqlnet.oraに、BEQUEATH_DETACH=yes を設定して、サーバープロセスをSQL*Plusの子ではなく、INITの子になってもらう(これがおすすめかも)
現象と回避方法を確認したリリース(Updated 16-Feb-2011):
- Oracle11g R1 11.1.0.7.0 for Linux (32bit/64bit)
- Oracle11g R1 11.1.0.7.0 for HP-UX(itanium)
- Oracle11g R2 11.2.0.1.0 for Linux (32bit/64bit)
- Oracle11g R2 11.2.0.1.0 for Solaris x86-64
KROWNっぽいまとめ方にしてみました :) (他のUnix系リリースでも作りはおなじでしょうね)
でもさあ、SQL*Plusからホストコマンド、使うんだよね結構。shellに入って、SQL*Plusから入っていたこと忘れて、また、SQL*Plus起動しちゃって…さらにshellに入って…以下繰り返しw。 注意しましょうね。→ 自分。
・shutdown immeidateしない、ほかの理由に遭遇!
・shutdown immeidateしない、ほかの理由に遭遇! #2
・shutdown immeidateしない、ほかの理由に遭遇! #3
・shutdown immeidateしない、ほかの理由に遭遇! おまけ
| 固定リンク | 0
コメント