UNDOに関する検証 その2

投稿日: 2003年1月22日

<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表領域の管理についてやっていきたい。

以上、まもなく花粉の波がやってくる茅ヶ崎にて