Shutdown Timeout Tweet
今回は、Oracle10g R2から実装された停止タイムアウトネタです。よく、shutdown immediateを実行したのに、”すぐにshutdownしない”。なんて話を聞きますが、
当然ですよ、immediateという言葉とは裏腹に、shutdown immediateにより強制的にrollbackされたトランザクションが、大量にundoブロックを保持していたらどうなると思いますか?
トランザクションのロールバックに時間がかかり、shutdown処理が待たされる、という状況が発生します!
これが、shutdown immediateを実行したのに、”すぐには停止しない”理由です。(これ以外の理由で停止しない場合もあるにはあるようだが・・・、大抵の場合はこれが原因。)
Oracle10g R2 より前のリリースでは、shutdown immeidateが終了せず、遠くを見つめて、ただ、ひたすら終了を待ち続けた方は、意外と多いかもしれません。。
しかも、Oracleさん、な〜〜〜んにもメッセージ出してくれないので何を待機しているのか、何をしているのか分かりずらいし。
で、そのガス抜き策? なのか、 Oracle10g R2から、停止タイムアウトという機能が追加されています。
これは、文字通り、shutdownが一定時間内に終了しないと、shutdown自体がキャンセルされてしまうという機能です。
正常に復帰しても、本当に実行したかったのは、shutdownなのですから、それはそれで欲求不満状態ではあるのですが・・・(笑)
SYS> l
1 create smallfile tablespace test datafile E:¥ORACLE¥ORADATA¥CATFISH¥CATFISH¥test.dbf' size 10g
2 autoextend on
3 extent management local uniform size 1m
4* segment space management auto
SYS> /
表領域が作成されました。
SYS>
SYS> create table scott.test (data varchar2(4000)) tablespace test;
表が作成されました。
いうことで、準備完了。(Windows版のOracle Database 10g R2を利用しています。)
次に、以下のように、大量のデータを登録し、1時間以上実行させておく。
(当然、ストレージの性能などにより、どの程度のデータを登録すれば、ロールバックが1時間以上になるのか異なってくることをお忘れなく。今回テストに利用したものは、HDDが2本、OSとは別ドライブのDISKにOracleのバイナリ及びデータファイルを配置。)
では、SCOTTユーザに接続して、大量データを登録!
SCOTT>
SCOTT> l
1 begin
2 for i in 1..2000000 loop
3 insert into test values(lpad('x',4000,'x'));
4 end loop;
5* end;
SCOTT> /
おまけ。
別途、SQL*Plusを起動し、SYSDBAで接続して、UNDOの量をモニタしているところ。
SYS> r
1 select
2 s.username,
3 t.used_ublk,
4 to_char(systimestamp,'hh24:mi:ss.ff') as time
5 from
6 v$session s join v$transaction t
7* on t.addr = s.taddr
USERNAME USED_UBLK TIME
---------- ---------- ------------------------------------
SCOTT 2618 17:29:43.890000
大量データ登録処理を実行したまま、一時間以上経過したところで、shutdown immediateを実行!!
すると、一時間以上実行していたトランザクションのロールバック処理のため、shutdownが待機させられる。
そう、これが、shutdown immediateで、shutdownしても言葉通り、即刻には停止しない状況の一例なのである。
Oracle10g R2より前のリリースであれば、延々と待たなければならない。それが、2時間や3時間だとキツいですよね。
しかも、shutdownを実行してしまったので、その後は何もできないし。
そこで、Oracle10g R2から実装されたのが、shutdownが自動的にcancelされるという機能。
(便利なだと感じるかどうかは。。。いろいろ・・・)
では、ロールバックに1時間以上かかる状態になったところで、shutdown immeidateを実行!!!
SYS> shutdown immediate;
・・・・・ここでおおよそ1時間ほど待たされます。コーヒーでも飲んで、ゆったりと・・・・お待ちください。
ほぼ1時間経過しても、shutdownが待機させられていると、以下のようなメッセージとともに
SQL*plusへ制御が返されます。
ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました。
SYS>
この時点で、shutdownがキャンセルされ、
alert_<SID>.logには以下のように記録されます。
以前のリリースに比べると、shutdownが待機させられているというメッセージや、shutdownがキャンセルされたというメッセージなど、意外と分かり易いメッセージが記録されている事に気付くはずです。ず〜〜〜っと、なんのメッセージもなく待たされるよりはましといったところです。
Tue Jul 31 23:03:16 2007
Shutting down instance: further logons disabled
Tue Jul 31 23:03:24 2007
Stopping background process QMNC
Tue Jul 31 23:03:24 2007
Stopping background process CJQ0
Tue Jul 31 23:03:25 2007
Stopping background process MMNL
Tue Jul 31 23:03:26 2007
Stopping background process MMON
Tue Jul 31 23:03:26 2007v
Thread 1 advanced to log sequence 289
Current log# 1 seq# 289 mem# 0: E:¥ORACLE¥ORADATA¥CATFISH¥CATFISH¥REDO01.LOG
・・・・中略・・・・
Tue Jul 31 23:03:27 2007
Shutting down instance (immediate)
License high water mark = 14
Tue Jul 31 23:03:27 2007
Stopping Job queue slave processes
Tue Jul 31 23:03:27 2007
Job queue slave processes stopped
・・・・中略・・・・
Tue Jul 31 23:08:26 2007
Active call for process 884 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
SHUTDOWN: waiting for active calls to complete.
Tue Jul 31 23:22:39 2007
MMNL absent for 1203 secs; Foregrounds taking over
・・・・中略・・・・
Wed Aug 01 00:03:26 2007
SHUTDOWN: Active sessions prevent database close operation
まあ、shutdown immediateする場合には事前に、rollbackに時間を要するトランザクションが実行中でないことをよ〜〜〜〜く確認するか、運用ルールで実行しない/できないように制限したりすることが重要だと思いますね。
次回は、ロールバックの終了時刻を大雑把に見積もるファンクションでも作成してみるか・・・
参考:「Oracle Database 管理者ガイド 10g リリース 2(10.2)- 停止タイムアウト」
2010/1/12追記.
Oracle11g R2のマニュアルの停止タイムアウトの解説に停止タイムアウトが発生した場合、再度、shutdown immediateを実行して、それでもなお、timeoutするようならshutdown abort行う。という記述が追加されています。ご注意ください。Oracle® Database Administrator's Guide 11g Release 2 (11.2) - Shutdown Timeout
| 固定リンク | 0
コメント