ロールバック・セグメントに関する検証 その1

投稿日: 2001年2月28日

~ロールバック・セグメントに関する検証 その1 ~
ペンネーム ちゃむ

今回から、ロールバック・セグメントに関する検証を行なう。

<ロールバック・セグメントの役割>
Oracleには、1つ以上のロールバック・セグメントが存在する。ロールバック・
セグメントには、トランザクション処理時の変更前の値が記録される。
この更新前の値を用いて、読取り一貫性、トランザクションのロールバック、
データベースのリカバリ(REDOをあてていくロールフォワードの後にロールバッ
クを行なう)を実現している。

以下に、ロールバック・セグメントが更新前情報を格納しているイメージ図
を示す。

ロールバック・セグメントには、プライベート・ロールバック・セグメントと
パブリック・ロールバック・セグメントがある。

<プライベート・ロールバック・セグメント>
単一のインスタンスでのみ使用可能。起動時に、初期化パラメータの
rollback_segmentsでロールバック・セグメントの指定を行なわないと、online
にならない。

<パブリック・ロールバック・セグメント>
OPS(Oracle Parallel Server)のような複数のインスタンスで使用可能。Oracle
の起動時に、自動的に以下の初期化パラメータの計算式の個数だけ、
ロールバック・セグメントをonlineにする。

CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)

CEIL(A)ならA以上の最小の整数
例)CEIL(5.1)なら5.1以上の最小の整数なので6

また、パブリック・ロールバック・セグメントをrollback_segmentsで指定して
も、それはちゃんとonlineになる(以下に検証結果を記載)。
ただ、エラーになるわけではないと言いたかった。

1.パブリック・ロールバック・セグメント(r_pub)を作成

SQL> create public rollback segment r_pub tablespace rbs ;

2.初期化パラメータに「r_pub」を追加してOracleを再起動

rollback_segments = (r1, r2, r3, r4,r0,RBS0,r_pub)

3.パブリック・ロールバック・セグメントがONLINEになっている様子

SVRMGR> SHOW PARAMETER rollback_segments
NAME                                TYPE    VALUE
----------------------------------- ------- -------------------------------
max_rollback_segments               整数値  30
rollback_segments                   文字列  r1, r2, r3, r4, r0, RBS0, r_pub
SQL> SELECT SEGMENT_NAME FROM DBA_ROLLBACK_SEGS WHERE STATUS = 'ONLINE' ;
SEGMENT_NAME
------------------------------
SYSTEM
R0
R1
R2
R3
R4
RBS0
R_PUB

このように、エラーにならずR_PUBがONLINEになっている様子が確認できる。
また、SYSTEMとはシステム・ロールバック・セグメントのことで、通常、特定
のシステム・トランザクションにのみ使用される。このように、初期化パラメ
ータのrollback_segmentsに指定しなくてもONLINEとなる。また、削除もOFFLINE
にもできない。

SQL> ALTER ROLLBACK SEGMENT SYSTEM OFFLINE ;

エラー行: 1: エラーが発生しました。
ORA-01597: ロールバック・セグメントをオンライン/オフラインに変更できません。

SQL> DROP ROLLBACK SEGMENT  SYSTEM ;

エラー行: 1: エラーが発生しました。
ORA-01544: システム・ロールバック・セグメントは削除できません。

ちなみに、システム・ロールバック・セグメントでなくても、ONLINE状態のも
のは削除できない。

SQL> DROP ROLLBACK SEGMENT R0 ;

エラー行: 1: エラーが発生しました。
ORA-01545: 指定したロールバック・セグメント R0は使用できません。

また、初期化パラメータの max_rollback_segments のデフォルトは30個であるが、
この場合、30個以上のロールバック・セグメントを初期化パラメータ rollback_segments
で指定するとORA-01599が発生する。

ORA-01599 キャッシュ領域がいっぱいなので、ロールバック・セグメントを獲
得できません。

以上 今年も梅を 茅ヶ崎にて