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)- 停止タイムアウト」
最近のコメント