UNDO表領域とUNDOセグメントガイド

Oracle Master Silver

Oracleデータベースを適切に運用するためには、UNDO表領域とUNDOセグメントの理解が不可欠です。この記事では、初心者が基礎をしっかり学び、運用で直面する課題を解決するための具体例や図解をふんだんに取り入れ、実践的な内容に仕上げました。

1. UNDOとは何か?(基礎から応用まで)

UNDOは、トランザクションが行う変更の「元の状態」を保持し、データベースの整合性と一貫性を担保するための仕組みです。

UNDOの主な用途

  1. トランザクションのロールバック
    未完了の変更を元に戻します。
  2. クエリの一貫性を保証
    他のセッションがデータを更新中でも、安定したクエリ結果を返します。
  3. フラッシュバック操作
    データの過去の状態を参照、復元します。

2. UNDO表領域の全貌

UNDO表領域は、UNDO情報を格納する専用の領域です。自動UNDO管理モードでは、OracleがUNDO表領域を効率的に管理します。

UNDO表領域の特徴

  • 自動UNDO管理:デフォルトで有効。管理の負担を大幅に軽減。
  • UNDO保持期間:指定された時間だけUNDO情報を保持。
  • UNDO表領域のサイズ管理:トランザクション量に応じて適切に設定する必要があります。

UNDO表領域の構成イメージ

[UNDO表領域]
├─ UNDOセグメント1
├─ UNDOセグメント2
├─ UNDOセグメント3
...

UNDO表領域の確認方法

現在使用しているUNDO表領域を確認するSQL:

SELECT tablespace_name
FROM dba_tablespaces
WHERE contents = 'UNDO';

3. UNDOセグメントの仕組み

UNDOセグメントは、UNDO情報を実際に保存する単位です。トランザクションごとに必要なUNDOセグメントが自動的に割り当てられます。

UNDOセグメントの特徴

  • 動的管理:Oracleが自動でUNDOセグメントを割り当て。
  • 並列処理対応:複数のセッションが同時に異なるUNDOセグメントを利用可能。

UNDOセグメントの確認方法

SELECT segment_name, tablespace_name, status
FROM dba_rollback_segs;

状態の説明:

  • ONLINE: 使用中
  • OFFLINE: 未使用
  • PENDING OFFLINE: オフライン処理中

4. 実践:UNDOの設定・確認方法

UNDO表領域の作成

新しいUNDO表領域を作成するコマンド:

CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/app/oracle/oradata/undotbs2.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

デフォルトUNDO表領域を切り替え:

ALTER SYSTEM SET UNDO_TABLESPACE = undotbs2;

UNDO保持期間の設定

UNDO情報の保持期間(秒単位)を設定:

ALTER SYSTEM SET UNDO_RETENTION = 1200; -- 20分間保持

5. トラブルシューティング(図解付き)

問題1:UNDO表領域が不足

エラー

ORA-30036: UNDO表領域が不足しています

原因: トランザクションが多く、UNDO情報の保存先が不足。

解決策

  1. UNDO表領域を拡張:sqlコードをコピーするALTER DATABASE DATAFILE '/u01/app/oracle/oradata/undotbs1.dbf' RESIZE 2G;
  2. 新しいUNDO表領域を作成して切り替え:sqlコードをコピーするCREATE UNDO TABLESPACE undotbs3 DATAFILE '/u01/app/oracle/oradata/undotbs3.dbf' SIZE 1G; ALTER SYSTEM SET UNDO_TABLESPACE = undotbs3;

問題2:UNDO情報が保持されない

原因: UNDO保持期間が短すぎる。

解決策: UNDO保持期間を再設定:

ALTER SYSTEM SET UNDO_RETENTION = 1800; -- 30分間保持

6. ケーススタディ:UNDOを使った問題解決

ケース1:フラッシュバッククエリでデータを確認

フラッシュバッククエリを使い、5分前のデータ状態を確認:

SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

ケース2:UNDO不足時のリアルタイム対応

エラー発生後、即座にUNDO表領域を拡張:

ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/undotbs1.dbf' RESIZE 5G;

7. FAQ:よくある質問と答え

Q1: UNDO表領域の最適なサイズは?
A1: トランザクション量や保持期間に依存します。以下のコマンドで推奨サイズを確認:

SELECT dbms_undo_adv.required_undo_size(900) AS recommended_size
FROM dual;

Q2: 手動UNDO管理モードに切り替えるべきか?
A2: 通常は自動UNDO管理モードを使用してください。特別な要件がない限り、手動管理は非推奨です。


8. まとめと次のステップ

UNDO表領域とUNDOセグメントの運用を成功させるためのポイント:

  1. UNDO表領域を適切にサイズ設定
    トランザクション量に応じてサイズを調整。
  2. UNDO保持期間を最適化
    データベースの要件に合わせて設定。
  3. トラブルシューティング手順を事前に把握
    エラー発生時に迅速に対応。

この記事で学んだ内容をもとに、さらに高度な運用スキルを磨きましょう。次は「フラッシュバック操作」や「クエリ最適化」に挑戦してみてください!

[参考]
データベース管理者ガイド – 16 UNDOの管理

コメント

タイトルとURLをコピーしました