オラクル|コンセプト|計画|解決策|問題
ロールバック セグメントの管理は、ORACLE データベース管理において常に困難な問題であり、この記事では、ORACLE ロールバック セグメントの概念、使用法、計画、および例を通じて問題の解決方法を紹介します。
ロールバックセグメントの概要
ロールバックセグメントは、データ変更前の値(データ変更前の位置と値を含む)を格納するために使用されます。ロールバック セグメントのヘッダーには、ロールバック セグメントで使用されているトランザクションに関する情報が含まれています。トランザクションはロールバック情報を格納するために 1 つのロールバック セグメントのみを使用でき、1 つのロールバック セグメントは複数のトランザクションのロールバック情報を格納できます。
ロールバックセグメントの役割
トランザクションのロールバック: トランザクションがテーブル内のデータを変更すると、ユーザーがトランザクションをロールバックすると、データ変更前の値 (つまり、前のイメージ) がロールバック セグメントに格納されます。 ROLLBACK)、ORACLE は、ロールバック セグメント内のプレデータ イメージを使用して、変更されたデータを元の値に復元します。
トランザクションリカバリ: トランザクションの処理中にルーチンが失敗すると、ロールバックセグメント情報がREDOログファイルに保存され、次回データベースが開かれたときに、ORACLEはロールバックを使用してコミットされていないデータをリカバリします。
読み取り一貫性: セッションがデータを変更しているとき、他のセッションはセッションのコミットされていない変更を認識しません。また、ステートメントの実行中は、ステートメントの実行開始以降にコミットされていない変更はステートメントには表示されません (ステートメント レベルの読み取り一貫性)。 ORACLE が SELECT 文を実行するとき、ORACLE は現在のシステム変更番号 (SYSTEM CHANGE NUMBER-SCN) を使用して、現在の SCN より前のコミットされていない変更が文によって処理されないようにします。長いクエリの実行中に、他のセッションがクエリでクエリされる特定のデータ ブロックを変更すると、ORACLE はロールバック セグメントの前のデータを使用して読み取り整合性ビューを構築することが考えられます。
トランザクション レベルの読み取り一貫性
ORACLE は通常、SQL ステートメント レベル (SQL STATEMENT LEVEL) の読み取り一貫性を提供します。次のステートメントを使用して、トランザクション レベルの読み取り一貫性を実現できます。
SET TRANSACTION READ ONLY;
または:
SET TANNSACTION SERIALIZABLE;
上記の 2 つのステートメントは両方とも、トランザクション開始後の読み取り一貫性を提供します。 2 番目のステートメントを使用すると、データベースの同時実行性とパフォーマンスに影響を与えることに注意してください。
ロールバック セグメントの種類
システム ロールバック セグメント: データベースの作成時に、システム ロールバック セグメントが自動的に作成されます。このロールバック セグメントは、オブジェクトの以前のイメージをシステム テーブル スペースに保存するためにのみ使用されます。
非システム ロールバック セグメント: 複数の表スペースを持つデータベースには、非システム テーブル スペースにオブジェクトの事前データ イメージを格納するために使用される非システム ロールバック セグメントが少なくとも 1 つ必要です。非システム ロールバック セグメントは、プライベート ロールバック セグメントとパブリック ロールバック セグメントに分割され、ルーチンの開始時に自動的にオンライン (ONLINE) にできるように、パラメーター ファイルの ROLLBACK SEGMENTS パラメーターにリストされる必要があります。パブリック ロールバック セグメントは通常、OPS (ORACLE Parallel Server) に表示され、ルーチンが開始されると自動的にオンラインになります。
DEFERED ロールバック セグメント: このロールバック セグメントは、表スペースがオフライン (OFFLINE) のときにシステムによって自動的に作成され、表スペースが再びオンライン (ONLINE) になったときにシステムによって自動的に削除されます。ロールバック情報を格納するために使用されます。表スペースがオフラインのときに生成されます。
ロールバックセグメントの使用
ロールバックセグメントの割り当て:トランザクションが開始されると、ORACLEはトランザクションにロールバックセグメントを割り当て、トランザクションが最も少ないロールバックセグメントをトランザクションに割り当てます。トランザクションは、次のステートメントを使用して、指定されたロールバック セグメントを適用できます: SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
トランザクションは、現在の領域がいっぱいになると、ロールバック セグメント領域 (EXTENTS) を順次かつ循環的に使用します。次の地区に移動します。ロールバック セグメントの同じ領域に複数のトランザクションを書き込むことができますが、各ロールバック セグメント ブロックには 1 つのトランザクションからの情報しか含めることができません。
例 (2 つのトランザクションが同じロールバック セグメントを使用し、ロールバック セグメントには 4 つの領域がある):
1. トランザクションが進行中であり、ロールバック セグメントの 3 番目の領域を使用しています。 2 つのトランザクションはさらにロールバック情報を生成し、引き続き 3 番目の領域を使用します
3. 3 番目の領域がいっぱいになると、トランザクションは 4 番目の領域に書き込み、トランザクションが新しい領域への書き込みを開始すると、 、それはロールオーバー (WRAP) と呼ばれます。
4. 4 番目の領域がいっぱいのとき、最初の領域がアイドル状態または非アクティブである場合 (この領域を使用するすべてのトランザクションはアクティブなトランザクションなしで完了します)、トランザクションは最初のゾーンを使用します。
ロールバックセグメントの拡張(EXTEND)
現在のロールバックセグメント領域のブロックがすべて使い果たされ、トランザクションがより多くのロールバック領域を必要とする場合、ロールバックセグメントのポインタは次の領域に移動されます。最後のエリアがなくなると、ポインタは最初のエリアの先頭に移動します。ロールバック セグメント ポインタを次の領域に移動するための前提条件は、次の領域にアクティブなトランザクションがなく、ポインタが領域を越えることができないことです。次のエクステントが使用中の場合、トランザクションはロールバック セグメントに新しいエクステントを割り当てます。この割り当てはロールバック セグメントの拡張と呼ばれます。ロールバック セグメントは、ロールバック セグメント領域の数がロールバック セグメント パラメータ MAXEXTENTS の値に達するまで拡張されます。
ロールバックセグメントとOPTIMALパラメータのリサイクル
OPTIMAL パラメータは、ロールバック セグメントがアイドル状態のときに縮小する位置を指定します。ロールバック セグメントを指定すると、ロールバック セグメント領域の無駄を削減できます。
ロールバックセグメントの作成
構文:
CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment
[TABLESPACE テーブルスペース]
[STORAGE (][INITIAL integer][K|M]] [NEXT integer][K|M]]
[MINEXTENTS integer]
credtrap ローリングセグメントは PRIVATE または PUBLIC を指定して作成でき、一度作成すると変更できません。
MINEXTENTSは2以上でなければなりません
PCTINCREASEは0でなければなりません
OPTIMALが指定されている場合は、ロールバックセグメントの初期サイズ(MINEXTENTSで指定されます)以上でなければなりません
推奨事項:
通常の状況では、初期=次の
設定スペースを節約する最適パラメーター
マックステントを無制限に設定しないでくださいロールバックセグメントを特定のロールバックセグメントテーブルスペースに作成する必要があります
例: rbs
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10
MAXEXTENTS 500 OPTIMAL 1000K);
ロールバックセグメントをオンラインにする
ロールバックセグメントが作成されると、ロールバックセグメントはオフラインになり、データベースで使用できなくなります。トランザクションで使用されるロールバック セグメントの場合は、ロールバック セグメントをオンラインにする必要があります。次のコマンドを使用してロールバック セグメントをオンラインにできます: ALTER ROLLBACK SEGMENT rollback_segment ONLINE; 例: ALTER ROLLBACK SEGMENT rbs01 ONLINE; にロールバック セグメント名がリストされています。たとえば、パラメータ ファイルに次の行を追加します。
ROLLBACK_SEGMENT=(rbs01,rbs02)
ロールバック セグメントのストレージ パラメータを変更する
ALTER ROLLBACK SEGMENT コマンドを使用して、ロールバック セグメントのストレージ パラメータを変更できます ( OPTIMAL、MAXEXTENTS を含む)。
構文:
ALTER ROLLBACK SEGMENT rollback_segment
[STORAGE (][NEXT integer][K|M]]
[MINEXTENTS integer]
[MAXEXTENTS {integer|UNLIMITED}]
[OPTIMAL {整数][ K|M]|NULL}]) ]
例:
ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);
ロールバックセグメントの領域を再利用する
ロールバックセグメントのOPTIMALパラメータが指定されている場合、ORACLEは自動的にそれを再利用します。 OPTIMAL で指定された位置にセグメントをロールします。ユーザーは、ロールバック セグメントのスペースを手動で再利用することもできます。
構文:
ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer ][K|M]];
説明:
TO integer の値が指定されていない場合、ORACLE は OPTIMAL 位置へのリサイクルを試みます。
例:
ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;
ロールバックセグメントをオフラインにする
ロールバックセグメントは次の 2 つの目的を達成するためにオフラインになります:
1. 新しいトランザクションがロールバックセグメントを使用しないようにします。
2. ロールバックセグメントを削除する必要があります。
構文:
ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;
例:
ALTER ROLLBACK SEGMENT rbs01 OFFLINE;
説明:
トランザクションがこのコマンドを実行した後の、ローリング セグメントの状態オフライン保留になります。トランザクションが終了すると、ステータスは OFFLINE に変わり、V$ROLLSTAT を介してロールバック セグメントのステータスを問い合せることができます。
ロールバックセグメントの削除
ロールバックセグメントが不要になった場合、またはINITIAL、NEXT、MINNEXTENTSパラメータを変更するために再構築する必要がある場合は、削除できます。ロールバック セグメントを削除するには、ロールバック セグメントをオフラインにしてはいけません。
構文:
DROP ROLLBACK SEGMENT rollback_segment;
例:
DROP ROLLBACK SEGMENT rbs01;
使用するデータディクショナリ:DBA_ROLLBACK_SEGS
問い合わせ可能な情報: ロールバックセグメント識別 (SEGMENT_ID )、名前(SEGMENT_NAME)、表スペース (TABLESPACE_NAME)、タイプ (OWNER)、ステータス (STATUS)。
例:
SQL>SELECT セグメント名,テーブルスペース名,owner,status FROM dba_rollback_segs;
ロールバックセグメントの統計情報
データディクショナリ: V$ROLLNAME,V$ROLLSTAT
例:
SQL>名前、 s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.status
FROM v$rollname n,v$rollstat s
WHERE n.usn=s.usn;ローリング セグメントの現在アクティブなトランザクション
データ ディクショナリ: V$SESSION、V$TRANSACTION
例:
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
------- -------- ----------- ----------- ------ ----- SYSTEM 7 OLTP システムの場合、多数の小規模なトランザクション処理、一般的な推奨事項:
多数の小規模なロールバック セグメント、各ロールバック セグメントごとに 10 トランザクション以下。 。
バッチ処理の場合は、一般的に次のことが推奨されます:
トランザクションごとに大きなロールバック セグメントをいくつか。
ロールバックセグメントの問題と解決策
問題 1: トランザクションに必要なロールバックセグメント領域が十分ではありません。これは、表領域がいっぱいで (ORA-01560 エラー)、ロールバックセグメント拡張がパラメータ MAXEXTENTS (ORA-01628) 。
解決策: ロールバック セグメントのテーブル スペースにファイルを追加するか、既存のファイルの MAXEXTENTS の値を大きくします。
問題 2: 読み取り整合性エラー (ORA-01555 SNAPSHOT TOO OLD)
解決策: MINEXTENTS の値を増やし、領域のサイズを増やし、高い OPTIMAL 値を設定します。