ヘッダ部分にはトランザクション情報、データ領域には変更前の値やブロック情報が格納されている。
ロールバックセグメントは、
ために使用される。
ロールバックセグメントには、
- SYSTEMロールバックセグメント:SYSTEM表領域内のオブジェクトに対する変更内容を保持する。
DB作成時に作成され、必ずオンラインになる。- 非SYSTEMロールバックセグメント:それ以外の表領域のオブジェクトに対する変更内容を保持する
追加で作成し、オンライン化するまでは書込みできない。の2種類がある。
パブリックとプライベートのロールバックセグメント
- Parallel Serverオプション付きのデータベースでは、パブリックロールバックセグメントが使用できる。 (このオプションがないときは同一)
- パブリックロールバックセグメントは、ロールバックセグメントを必要とする任意のインスタンスが使用できる ロールバックセグメントのプールを形成する。
SET TRANSACTION USE ROLLBACK SEGMENT ロールバックセグメント名; |
エクステントサイズが大きいと、複数のトランザクションが1つのエクステントに存在する確率が高くなる
--->ブロッキング状態の多発。複数のトランザクションが頻繁に1つのロールバックセグメントを共有するような、オンライン処理(OLTP)用のロールバックセグメントは、 エクステント設定パラメータINITIALとNEXTの値を小さく設定する(トランザクションの大きさによるが、100K程度)とよい。
一方、大きな変更を実行する少数のトランザクションが発生するバッチ処理や、 実行時間の長い問合せを行なう場合には、大きめのロールバックセグメントを少数用意すると良い。
ロールバック時に必要な領域のサイズは、「挿入<削除」となる。
(挿入はROWIDのみロールバックセグメントに格納されるため)※Oracle社の推奨
- 全てのエクステントを同じサイズにするため、INITIAL=NEXT
- ロールバックセグメントの動的拡張を軽減するため、MINEXTENTSは20以上
- 必要以上の拡張を防ぐため、MAXEXTENTSにUNLIMITEDを設定することは回避する
- 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.起動時の管理
ロールバックセグメントは、作成直後はオフラインになっているため、ALTER ROLLBACK SEGMENT文を使用して使用可能にする。
また、インスタンス停止時にもロールバックセグメントはオフラインになる。
ALTER ROLLBACK SEGMENT ロールバックセグメント名 ONLINE;
●初期化パラメータとの関係
値 内容 MAX_ROLLBACK_SEGMENTS インスタンスでオンラインにできるロールバックセグメントの数。
SYSTEMロールバックセグメントは必ずオンラインにされるので、非SYSTEMロールバックセグメント+1の値を設定する。ROLLBACK_SEGMENTS 起動後自動的にオンラインにされるロールバックセグメントを指定する。 TRANSACTIONS
TRANSACTIONS_PER_ROLLBACK_SEGMENTインスタンスは、この二つの値を使用して必要なロールバックセグメント数を算出する。
TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENTS2.記憶領域パラメータの変更
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 スナップショットが古すぎます」が発生した場合:
読み取り一貫性を保証するための元データが、ロールバックセグメントの循環書き込みにより上書きされ、消えてしまっている。解決策としては、以下の方法が考えられる。
- より大きなエクステント数(MAXEXTENTS、INITIALなどで指定される記憶領域)を用意するか、エクステントサイズを大きくする
- OPTIMAL値の設定を見直す(より大きくする)
5.ロールバックセグメントの削除
ロールバックセグメントを削除するには、セグメントをオフラインにした後、DROP ROLLBACK SEGMENT文を使用する。
ALTER ROLLBACK SEGMENT ロールバックセグメント名 OFFLINE;
DROP ROLLBACK SEGMENT ロールバックセグメント名;※ロールバックセグメント内にアクティブなトランザクションがある場合、OFFLINEにするコマンドを発行しても「PENDING OFFLINE」状態になる。
-->アクティブ・トランザクション終了後再びOFFLINEコマンドを発行すれば、直ちにOFFLINEになる。コマンドを発行しなくとも、ある一定時間(時間の指定はできない)が経過すればSMONにより自動的にOFFLINEにされる。
●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) ); レコードが選択されませんでした。