UNDOに関する検証 その4

<UNDOに関する検証その4>
ペンネーム:クレイジーボーダー

前回は、UNDO表領域の削除を行った。UNDO_RETENTIONで設定した期間内でも
UNDO表領域が削除でき、フラッシュバック問合せができなくなった。

前回紹介できなかったが、UNDO表領域の削除・変更で注意する点がもう1つ
ある。それはSYSTEMロールバック・セグメントについてである。このSYSTEM
ロールバック・セグメントはデータベースを作成すると自動的にシステム表領
域に作成されるが、これはOracleが内部的な処理を実行するために使用される
もので、一般的な用途では使用されない。

データベースを起動させる前に、初期化パラメータ(UNDO_TABLESPACE)を
「”」(2つの一重引用符)に設定すると、使用可能なUNDO表領域に自動的に
割当てて起動する。UNDO表領域が使用可能な状態なら問題ない。

ただし、動的にSQL文から「”」を設定すべきではない。実際に試してみる。
まず、使用可能なテーブルスペースを確認する。

SQL> SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
UNDOTBS_01                     ONLINE
UNDOTBS_02                     ONLINE
MAG                            ONLINE
MAG2                           ONLINE


SQL> SHOW PARAMETER UNDO_TABLESPACE;

NAME                               TYPE        VALUE
---------------------------------- ----------- -------------------
UNDO_TABLESPACE                    STRING      UNDOTBS_01

現在使用中のUNDO表領域は、UNDOTBS_01である。
ここで、パラメータ値を「”」(2つの一重引用符)に変更する。

SQL> ALTER SYSTEM SET UNDO_TABLESPACE='';

SYSTEM ALTERED.

使用UNDO表領域を確認する。

SQL> SHOW PARAMETER UNDO_TABLESPACE;

NAME                              TYPE        VALUE
--------------------------------- ----------- ---------------------
UNDO_TABLESPACE                   STRING

VALUEの値が何も入っていない状態になった。現在のロールバック・セグメン
トの使用状態を確認する。

SQL> SELECT N.USN, N.NAME, S.STATUS, S.XACTS
  2  FROM V$ROLLNAME N, V$ROLLSTAT S
  3  WHERE N.USN = S.USN;

       USN NAME                           STATUS               XACTS
---------- ------------------------------ --------------- ----------
         0 SYSTEM                         ONLINE                   0

使用しているロールバック・セグメントはSYSTEMだけになっている。
ここで、INSERT文を発行してみる。

SQL> INSERT INTO TBL_MAG1 VALUES (1234, 'MAG_0205');
INSERT INTO TBL_MAG1 VALUES (1234, 'MAG_0205');
                *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system
tablespace 'MAG'

やはりSYSTEMしか利用可能になっていなかったのでエラーになってしまった。

ALERTログを見ると以下のようになっていた。

Tue Feb  4 12:13:13 2003
Undo Segment 1 Offlined
Undo Segment 2 Offlined
Undo Segment 3 Offlined
Undo Segment 4 Offlined
Undo Segment 5 Offlined
Undo Segment 6 Offlined
Undo Segment 7 Offlined
Undo Segment 8 Offlined
Undo Segment 9 Offlined
Undo Segment 10 Offlined
Undo Tablespace 1 successfully switched out.
Tue Feb  4 12:13:13 2003
ALTER SYSTEM SET undo_tablespace='' SCOPE=MEMORY;
Tue Feb  4 12:14:59 2003
***Warning - Executing transaction without active Undo Tablespace

結果、UNDO表領域を変更すると、UNDO表領域(UNDOTBS_02)がオンラインで使用
可能だったにもかかわらず、何も選択されない状態になり、現在使用している
UNDO表領域の割当てを解除してしまった。そのため、SYSTEMロールバック・セ
グメントのみが使用可能な状態になり、エラーになった。
動的に、UNDO_TABLESPACE=”とは設定すべきではないということになった。

っとSYSTEMロールバック・セグメントだけで説明が終わってしまったが、次回
こそ、V$UNDOSTATを使用してUNDO_RETENTIONについて検証していきたい。

以上、NET&COM2003来たる幕張にて