« shutdown immeidateしない、ほかの理由に遭遇! #2 | トップページ | shutdown immeidateしない、ほかの理由に遭遇! おまけ »

2011年2月 9日 (水)

shutdown immeidateしない、ほかの理由に遭遇! #3

もう一つ検証し忘れてた!。

この現象に気づいたとき、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しない、ほかの理由に遭遇! おまけ

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/106341/50820627

この記事へのトラックバック一覧です: shutdown immeidateしない、ほかの理由に遭遇! #3:

コメント

コメントを書く