UNDOに関する検証 その2
<UNDOに関する検証その2>
ペンネーム:クレイジーボーダー
前回は、UNDOデータ管理の概要説明と自動UNDO管理機能を使用するために
必要なUNDO表領域を作成した。今回は、前回作成したUNDO表領域を実際に
使ってみるところに重点を置く。
まず、自動UNDO管理モードでインスタンスを起動するために、必要な設定を
行なう。今回は、二つ目に作成したUNDO表領域を使用する。ここで注意する
点が1つある。
初期化パラメータ(UNDO_TABLESPACE)のところで存在しない表領域を指定して
しまうと、STARTUPコマンドは失敗してしまう。
前回作成したUNDO表領域は、”UNDOTBL_01″と”UNDOTBL_02″であるが、初期化
パラメータ(UNDO_TABLESPACE)を’UNDOTBL2’とスペルが間違っている状態で
STARTUPコマンドを実行すると、以下の結果となる。UNDO_TABLESPACEを
指定する際は注意が必要である。
SQL> STARTUP PFILE=/EXPORT/HOME/MAG920/DBS/INITMAG920.ORA ORACLEインスタンスが起動しました。 Total System Global Area 64455672 bytes Fixed Size 730104 bytes Variable Size 37748736 bytes Database Buffers 25165824 bytes Redo Buffers 811008 bytes データベースがマウントされました。 ORA-01092: Oracleインスタンスが終了しました。強制的に切断されます
さて、UNDO表領域の管理に移っていきたい。まず、現在の表領域、
ロールバック・セグメントの状況を確認する。
SQL> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS FROM DBA_ROLLBACK_SEGS; SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------ ------ -------------------------- --------- SYSTEM SYS SYSTEM ONLINE _SYSSMU1$ PUBLIC UNDOTBS_01 OFFLINE ... _SYSSMU10$ PUBLIC UNDOTBS_01 OFFLINE _SYSSMU11$ PUBLIC UNDOTBS_02 ONLINE ... _SYSSMU20$ PUBLIC UNDOTBS_02 ONLINE
初期化パラメータ(UNDO_TABLESPACE)で指定した表領域のUNDOTBL_02とSYSTEM
はONLINEモード(状態)になっている。それ以外のUNDO表領域(UNDOTBL_01)は
OFFLINEモードになっている。
SYSTEMロールバック・セグメントは、データベースを作成すると自動的に、
システム表領域に作成されるが、これは、Oracleが内部的な処理
(システム・トランザクション)を実行するために使用されるもので、
一般的な用途では使用されない。
UNDO表領域は、SYSTEMロールバック・セグメント以外では、1つしか使用する
ことができない。
UNDO表領域は、デフォルトでは、AUTOEXTEND属性がONで設定してあるため、
環境によっては、拡張し続けて領域を圧迫し、表領域の再作成が必要な場合、
また、ディスクI/O分散を行なう為にデータファイルを配置するディスクを
変更する場合に、データベースを立ち上げたままUNDO表領域を切り替える
ことが出来る。
UPDATE文等を発行し、UNDO表領域(UNDOTBS_02)のセグメント(_SYSSMU19$)
を使用している状態で、UNDOTBL_01に切替える。また、UNDO表領域の変更後も
続けて、UPDATE処理等を実行する。
SQL> ALTER SYSTEM SET UNDO_TABLESPACE='UNDOTBS_01';
UNDO表領域をUNDOTBS_01に変更後、実際にOracleが使用しているセグメントを
確認する。表領域(UNDOTBS_02)内は、セグメント(_SYSSMU19$)のみが
ONLINEモードで、それ以外のセグメントはOFFLINEモードになっていた。
表領域(UNDOTBS_01)内のセグメントは全てONLINEモードになっていた。
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------ ------ -------------------------- --------- SYSTEM SYS SYSTEM ONLINE _SYSSMU1$ PUBLIC UNDOTBS_01 ONLINE ... _SYSSMU10$ PUBLIC UNDOTBS_01 ONLINE _SYSSMU11$ PUBLIC UNDOTBS_02 OFFLINE ... _SYSSMU18$ PUBLIC UNDOTBS_02 OFFLINE _SYSSMU19$ PUBLIC UNDOTBS_02 ONLINE _SYSSMU20$ PUBLIC UNDOTBS_02 OFFLINE
オラクルが現在使用中のUNDOセグメント状況を確認する。
SQL> SELECT N.NAME, S.STATUS, S.EXTENTS, S.RSSIZE, S.HWMSIZE, S.XACTS FROM V$ROLLNAME N, V$ROLLSTAT S WHERE N.USN = S.USN; USN NAME STATUS EXTENTS RSSIZE HWMSIZE XACTS --- ------------ --------------- -------- --------- --------- ------ 0 SYSTEM ONLINE 8 407552 407552 0 1 _SYSSMU1$ ONLINE 2 129024 129024 0 2 _SYSSMU2$ ONLINE 2 129024 129024 0 ... 9 _SYSSMU9$ ONLINE 2 129024 129024 1 10 _SYSSMU10$ ONLINE 2 129024 129024 0 19 _SYSSMU19$ PENDING OFFLINE 14 915456 915456 1
現在、アクティブなトランザクションによって使用されているUNDOセグメント
の状況を確認する。
SQL> SELECT S.USERNAME, T.XIDUSN, T.UBAFIL, T.UBABLK, T.USED_UBLK FROM V$SESSION S, V$TRANSACTION T WHERE S.SADDR = T.SES_ADDR; USERNAME XIDUSN UBAFIL UBABLK USED_UBLK ------------------------- ---------- ---------- ---------- ---------- MAG 19 5 1562 1 MAG 9 7 547 1
上記の結果より、セグメント(_SYSSMU19$)は、UNDO表領域(UNDOTBS_01)に
切替えた際に、トランザクション(XACTS)が使用していたために、
PENDING OFFLINEモードになった。
このトランザクションは引き続きこのUNDOセグメントを使用し実行できるが、
UNDO表領域の変更後、新しく実行されたトランザクションのUNDOデータは
このUNDOセグメントに格納されず、新しく変更した表領域(UNDOTBS_01)の
セグメント(_SYSSMU9$)が使用された。
全てのアクティブなトランザクションがコミットされた後に、自動的に
UNDOセグメント(_SYSSMU19$)のステータスがPENDING OFFLINEモードから
OFFLINEになる。PENDING OFFLINEモードでは、表領域の削除等はできない。
OFFLINEになって初めて、削除等の処理が可能になる。
以下のSQL文を実行し何も選択されなければ、使用していたセグメントは
既にOFFLINEモードに変わっている。
SQL> SELECT SEGMENT_NAME, XACTS, V.STATUS FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME = 'UNDOTBS_02' AND SEGMENT_ID = USN;
選択された場合、XACTSの値が0になっていれば、現在、ペンディング中の
トランザクションがロールバックに無いことを意味し、すぐにOFFLINEモードに
変わる。
次回も、引き続き、UNDO表領域の管理についてやっていきたい。
以上、まもなく花粉の波がやってくる茅ヶ崎にて