[Oracle] shutdown normalでOracleインスタンスが停止しない。 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

shutdownコマンドには標準(normal)、トランザクション(transaction)、即時(immediate)、異常終了(abort)の4つのモードがありますが、shutdown normalで停止しようとした場合、接続中のセッションが存在するとそのセッションが終了するまでOracleインスタンスは停止しません。

ということは常識なのですが、ではセッションを切断してやれば停止できるのかとALTER SYSTEM KILL SESSIONコマンドを実行して、サーバー側から強制的に切断してみてもやはりOracleインスタンスは停止しません。


この時、v$sessionを確認すると

select sid, serial#, username, status, server from v$session;

       SID    SERIAL# USERNAME        STATUS           SERVER
---------- ---------- --------------- ---------------- ------------------
         1          1                 ACTIVE           DEDICATED
         2          1                 ACTIVE           DEDICATED
         3          1                 ACTIVE           DEDICATED
         4          1                 ACTIVE           DEDICATED
         5          1                 ACTIVE           DEDICATED
         6          1                 ACTIVE           DEDICATED
         7          1                 ACTIVE           DEDICATED
         8          1                 ACTIVE           DEDICATED
         9          1                 ACTIVE           DEDICATED
        10          1 SYS             INACTIVE         DEDICATED
        11         94 SCOTT           KILLED           PSEUDO


と、強制終了したセッションがSTATUS=KILLED、SERVER=PSEUDOで残ったままになっていることがあります。


shutdown normalで停止しようとした場合、このような状態のセッションが残っていてもOracleインスタンスは停止しないのです。(他のモードでは停止できる)

このような状態になった場合、強制終了したセッションをクライアント側でも終了してやると上記のレコードは消え、shutdown normalでもOracleインスタンスを停止することができるのですが、クライアント側からセッションを終了することが難しいような場合は、shutdown normalは使わないほうがいいかもしれません。

ちなみに、接続中、もしくは強制終了したセッションが残っている状態でshutdown normalを実行すると、セッションを終了するまで待たされるわけですが、待機状態のまま放置しておくと、1時間後にモゾモゾと動き出し、セッションが残っているにもかかわらず、ALTER DATABASE CLOSE NORMAL...、ALTER DATABASE DISMOUNT...と立て続けに実行し、エラーを吐いてしまいます。

アラートログファイルを見るとこんな感じになります(↓)

Fri Jun 24 11:55:55 2005
Shutting down instance: further logons disabled
Shutting down instance (normal)
License high water mark = 3
Fri Jun 24 12:00:54 2005
Active process 0 user '' program 'PSEUDO'
SHUTDOWN: waiting for logins to complete.
Fri Jun 24 12:52:36 2005
SHUTDOWN: Active sessions prevent database close operation
Fri Jun 24 12:52:36 2005
ALTER DATABASE CLOSE NORMAL
Fri Jun 24 12:52:36 2005
SMON: disabling tx recovery
Fri Jun 24 12:52:36 2005
Active process 0 user '' program 'PSEUDO'
CLOSE: Active sessions prevent database close operation
CLOSE: Error 1093 during database close
ORA-1093 signalled during: ALTER DATABASE CLOSE NORMAL...
Fri Jun 24 12:52:36 2005
Restarting dead background process CJQ0
Fri Jun 24 12:52:36 2005
SMON: enabling tx recovery
Fri Jun 24 12:52:36 2005
ALTER DATABASE DISMOUNT
Fri Jun 24 12:52:36 2005
ORA-1106 signalled during: ALTER DATABASE DISMOUNT...
CJQ0 started with pid=8
Fri Jun 24 12:52:37 2005
ARCH: Archiving is disabled
Shutting down archive processes
Archiving is disabled
Fri Jun 24 12:52:37 2005
ARCH shutting down
Fri Jun 24 12:52:37 2005
ARCH shutting down
Fri Jun 24 12:52:37 2005
ARC0: Archival stopped
Fri Jun 24 12:52:37 2005
ARC1: Archival stopped
Fri Jun 24 12:52:40 2005
ARCH: Archiving is disabled
Shutting down archive processes
Archiving is disabled
Archive process shutdown avoided: 0 active
Fri Jun 24 12:57:40 2005
SHUTDOWN: waiting for detached processes to terminate.

このままさらに放置していると内部エラーなど発生し、にっちもさっちもいかなくなってしまいます。

このような状態になったときには、横からsysユーザーで割り込んで、shutdown abortでOracleインスタンスを強制的に終了せざるをえなくなります。

ということで、shutdown normalを使う場合には注意が必要です。