TOP > ロールバックセグメントの管理

ロールバックセグメントの管理


  1. ロールバックセグメントとは
  2. ロールバックセグメントの作成・管理
  3. ロールバックセグメント情報の収集


ロールバックセグメントとは

ヘッダ部分にはトランザクション情報、データ領域には変更前の値やブロック情報が格納されている。
ロールバックセグメントは、

ために使用される。

ロールバックセグメントの種類

ロールバックセグメントには、

  1. SYSTEMロールバックセグメント:SYSTEM表領域内のオブジェクトに対する変更内容を保持する。
    DB作成時に作成され、必ずオンラインになる
  2. 非SYSTEMロールバックセグメント:それ以外の表領域のオブジェクトに対する変更内容を保持する
    追加で作成し、オンライン化するまでは書込みできない

の2種類がある。

パブリックとプライベートのロールバックセグメント

ロールバックセグメントの割り当て

  1. 1つのトランザクションは1つのロールバックセグメントしか使えない。
    (複数のトランザクションが1つのロールバックセグメントを使用することは可能)

  2. Oracleサーバは、トランザクション開始時にもっとも競合の少ないロールバックセグメントを選択し、割り当てる。
    明示的に割り当てるロールバックセグメントを指定するには、

    SET TRANSACTION
    USE ROLLBACK SEGMENT ロールバックセグメント名;

  3. ラップ:
    現行のエクステントがいっぱいになると次のエクステントへの書き込みが開始される。これをラップという。

  4. エクステントの拡張:
    ロールバックセグメント内のエクステントは循環形式で使用される。 最後のエクステントに達した時点で最初のエクステントにアクティブなトランザクションが含まれる場合は、 このエクステントは上書きできないため、追加のエクステントが割り当てられ、ラップされる。 ロールバックセグメントは、最初のエクステントが空かない限り、MAXEXTENTSで指定された最大値に達するまで拡張される(=ブロッキング状態)。

  5. エクステントの割り当て解放:
    ロールバックセグメント作成時にOPTIMALオプションを指定すると、ラップ時に、拡張したロールバックセグメント領域の自動解放が行なわれ、指定したサイズまで縮小する。

ロールバックセグメントの計画

エクステントサイズが大きいと、複数のトランザクションが1つのエクステントに存在する確率が高くなる
--->ブロッキング状態の多発。

複数のトランザクションが頻繁に1つのロールバックセグメントを共有するような、オンライン処理(OLTP)用のロールバックセグメントは、 エクステント設定パラメータINITIALとNEXTの値を小さく設定する(トランザクションの大きさによるが、100K程度)とよい。

一方、大きな変更を実行する少数のトランザクションが発生するバッチ処理や、 実行時間の長い問合せを行なう場合には、大きめのロールバックセグメントを少数用意すると良い。

ロールバック時に必要な領域のサイズは、「挿入<削除」となる。
(挿入はROWIDのみロールバックセグメントに格納されるため)

※Oracle社の推奨

  1. 全てのエクステントを同じサイズにするため、INITIAL=NEXT
  2. ロールバックセグメントの動的拡張を軽減するため、MINEXTENTSは20以上
  3. 必要以上の拡張を防ぐため、MAXEXTENTSにUNLIMITEDを設定することは回避する
  4. OLTP処理では、4つの同時トランザクションに対してロールバック・セグメントを1つを目安に作成する。 つまり同時に20のトランザクションが発生しうる場合、20/5=4つのロールバック・セグメントを作成することが推奨される。


ロールバックセグメントの作成・管理

ロールバックセグメントの作成

ロールバックセグメントは、CREATE ROLLBACK SEGMENT文で作成する。

CREATE [PUBLIC] ROLLBACK SEGMENT ロールバックセグメント名
[TABLESPACE 表領域名]
[STORAGE (

[INITIAL 初期エクステントサイズ [K | M] ]
[NEXT 増分エクステントサイズ [K | M] ]
[MINEXTENTS 作成時エクステント数]
[MAXEXTENTS {最大エクステント数 | UNLIMITED}
[OPTIMAL (最適サイズ [K | M] ] | NULL) ]

)]:

  1. MINEXTENTSは2以上に設定する
  2. PCTINCREASEは指定できない(常に0
  3. OPTIMALオプションは、ロールバックセグメントの初期サイズ(INITIAL+NEXT×(MINEXTENTS−1))より小さな値を設定することはできない。
  4. オンライントランザクション用のロールバックセグメントでは、INITIALとNEXTを小さく設定するが、必要以上の拡張を防ぐためMAXEXTENTSにUNLIMITEDを設定することは推奨されない。
  5. I/Oの競合と断片化を防ぐため、ロールバックセグメントは専用の表領域に作成することが推奨される。


ロールバックセグメントの管理

1.起動時の管理

ロールバックセグメントは、作成直後はオフラインになっているため、ALTER ROLLBACK SEGMENT文を使用して使用可能にする。
また、インスタンス停止時にもロールバックセグメントはオフラインになる。

ALTER ROLLBACK SEGMENT ロールバックセグメント名 ONLINE;

●初期化パラメータとの関係
内容
MAX_ROLLBACK_SEGMENTS インスタンスでオンラインにできるロールバックセグメントの数。
SYSTEMロールバックセグメントは必ずオンラインにされるので、非SYSTEMロールバックセグメント+1の値を設定する。
ROLLBACK_SEGMENTS 起動後自動的にオンラインにされるロールバックセグメントを指定する。
TRANSACTIONS
TRANSACTIONS_PER_ROLLBACK_SEGMENT
インスタンスは、この二つの値を使用して必要なロールバックセグメント数を算出する。
TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENTS

2.記憶領域パラメータの変更

ALTER ROLLBACK SEGMENT文を使用して変更する。

ALTER ROLLBACK SEGMENT ロールバックセグメント名
[STORAGE (

[NEXT 増分エクステントサイズ [K | M] ]
[MINEXTENTS 作成時エクステント数]
[MAXEXTENTS {最大エクステント数 | UNLIMITED}
[OPTIMAL (最適サイズ [K | M] ] | NULL) ]

)]:

初期エクステントサイズ(INITIAL)は変更できない。ロールバックセグメントの再作成が必要。

3.領域割り当ての手動解放

ロールバックセグメントにOPTIMAL句が指定されている場合、Oracleサーバが自動的にエクステントの割り当てを解放して最適サイズに近づける。
これを手動で行なうには、ALTER ROLLBACK SEGMENT文を使用する。

ALTER ROLLBACK SEGMENT ロールバックセグメント名 SHRINK [TO サイズ [K | M];

4.エラーへの対応

Oracleエラー「ORA-1555 スナップショットが古すぎます」が発生した場合:
読み取り一貫性を保証するための元データが、ロールバックセグメントの循環書き込みにより上書きされ、消えてしまっている。

解決策としては、以下の方法が考えられる。

5.ロールバックセグメントの削除

ロールバックセグメントを削除するには、セグメントをオフラインにした後、DROP ROLLBACK SEGMENT文を使用する。

ALTER ROLLBACK SEGMENT ロールバックセグメント名 OFFLINE;

DROP ROLLBACK SEGMENT ロールバックセグメント名;

※ロールバックセグメント内にアクティブなトランザクションがある場合、OFFLINEにするコマンドを発行しても「PENDING OFFLINE」状態になる。
-->アクティブ・トランザクション終了後再びOFFLINEコマンドを発行すれば、直ちにOFFLINEになる。コマンドを発行しなくとも、ある一定時間(時間の指定はできない)が経過すればSMONにより自動的にOFFLINEにされる。


ロールバックセグメント情報の収集

  1. DBA_ROLLBACK_SEGSデータディクショナリビューの検索
    (オフラインのロールバックセグメントの情報は、このビューからしか検索できない)
  2. V$ROLLNAME 動的データディクショナリの検索
  3. V$ROLLSTAT 動的データディクショナリの検索
  4. V$SESSION, V$TRANSACTION 動的データディクショナリの検索

DBA_ROLLBACK_SEGS−データベース内の全てのロールバックセグメントの情報
列名 内容
SEGMENT_NAME ロールバックセグメント名
TABLESPACE_NAME 表領域名
OWNER 所有ユーザ
STATUS 状態(オフラインも含む)

DBA_ROLLBACK_SEGSを参照する例

SQL> select SEGMENT_NAME, TABLESPACE_NAME, OWNER, INITIAL_EXTENT, STATUS from DBA_ROLLBACK_SEGS;

SEGMENT_NAME                   TABLESPACE_NAME                OWNER  INITIAL_EXTENT STATUS
------------------------------ ------------------------------ ------ -------------- ----------------
SYSTEM                         SYSTEM                         SYS             65536 ONLINE
DUMMY_RBS                      SYSTEM                         SYS             65536 OFFLINE
R01                            RBS01                          PUBLIC       31457280 ONLINE
R02                            RBS01                          PUBLIC       31457280 ONLINE
R03                            RBS01                          PUBLIC       31457280 ONLINE
R04                            RBS02                          PUBLIC       31457280 ONLINE
R05                            RBS02                          PUBLIC       31457280 ONLINE
R06                            RBS02                          PUBLIC       31457280 ONLINE

8行が選択されました。
		

V$ROLLNAME−現在インスタンスが使用しているロールバックセグメントの名称
列名 内容
USN 識別番号
NAME ロールバックセグメント名

V$ROLLSTAT−現在インスタンスが使用しているロールバックセグメントの情報
列名 内容
EXTENTS エクステント数
RSSIZE 現行サイズ
XACTS トランザクション数
OPTSIZE 最適サイズ(OPTIMAL SIZEはここでしか見られない)
STATUS 状態

V$ROLLNAME、V$ROLLSTATを参照する例

SQL> select n.USN, n.NAME, s.EXTENTS, s.RSSIZE, s.XACTS, s.OPTSIZE, s.STATUS
  2  from V$ROLLNAME n, V$ROLLSTAT s
  3  where n.USN = s.USN;

       USN NAME                              EXTENTS     RSSIZE      XACTS    OPTSIZE STATUS
---------- ------------------------------ ---------- ---------- ---------- ---------- ---------------
         0 SYSTEM                                  8     507904          0            ONLINE
         2 R01                                    22  692043776          0            ONLINE
         3 R02                                    22  692043776          0            ONLINE
         4 R03                                    22  692043776          0            ONLINE
         5 R04                                    22  692043776          1            ONLINE
         6 R05                                    22  692043776          0            ONLINE
         7 R06                                    22  692043776          1            ONLINE

7行が選択されました。
		

V$SESSION、V$TRANSACTIONを参照する例
<現在使用中のロールバックセグメントについて、セッションの所有者を確認>

SQL> select s.USERNAME,s.SID, s.SERIAL#,t.XIDUSN
  2  from V$SESSION s, V$TRANSACTION t
  3  where s.SADDR = t.SES_ADDR;

USERNAME                              SID    SERIAL#     XIDUSN
------------------------------ ---------- ---------- ----------
UPCBND                                  7      43008          6
SELUSR                                  8      15332          7


<ブロッキング状態のセッションを検出するSQL>
SQL> select s.SID,s.SERIAL#,t.START_TIME,t.XIDUSN,s.USERNAME
  2  from V$SESSION s, V$TRANSACTION t, V$ROLLSTAT r
  3  where s.SADDR = t.SES_ADDR
  4  and t.XIDUSN = r.USN
  5  and ( (r.CUREXT = t.START_UEXT - 1) OR ((r.CUREXT = r.EXTENTS - 1) and t.START_UEXT = 0) );

レコードが選択されませんでした。
		


TOP > ロールバックセグメントの管理
2001/08/24 担当:K.Y