SSJ Tech Lab - Oracle Database テクニカルラボ

REDOログとUNDOレコードの違いについて

対応バージョン

Oracle Database 10.1 - 12.1

2017-04-03小見出しを追加(小見出しに伴い内容を調整)

2016-06-25記事公開

UNDOとREDOの違いについて説明します。
UNDOとREDOについて違いを出来るだけ覚えやすいように概要の記載のみします。
詳細の理解についてはマニュアル又は、別記事を参照してください。

UNDO及びREDOログの概要についての別記事

REDOログとUNDOレコードの大まかな違い

REDOログとUNDOレコードは、大雑把に言うと以下のような違いがあります。

REDOログ
主にバックアップデータを最新のデータまで戻すために使われます。
要は以前の処理の再実行(RECOVERY)です。ログを書く場所は専用ログファイルです。
UNDOレコード
主に変更したデータを元に戻すために使われます。
要は現在の処理の取り消し(ROLLBACK)です。レコードを書く場所は表領域です。

REDOログとは

REDOログの主な用途

REDOログの主な用途としては、データベースが破損した時などに、データベースのリカバリのために使用されます。RMANなどを用いてRECOVERYコマンドを実行するときはREDOログを使うと覚えると覚えやすいかもしれません。

REDOログの出力

専用のログファイルに出力され、データベースに反映された内容の再現・再実行を行うためのログが格納されます。
ARCHIVELOGモードで運用している場合は、REDOログの過去分の保存(アーカイブ)が行われます。

REDOログのバックアップ・リカバリでの利用

データベースのリカバリ処理では、以前取得したデータベース全体のバックアップに対してREDOログの内容を再適用し、直前のデータまで戻すことができるようになります。この仕組みにより、ARCHIVELOGモードではREDOログに変更データを記録、保存しておくことで、データベースを停止しなくてもバックアップが取得できるようになります。(バックアップ完了後、記録、保存されたREDOログがデータファイルに適用されます。REDOログの過去分を保存しないNOARCHIVELOGモードでは、バックアップに時間がかかった場合にREDOログの保存先がないため、データファイルの更新が出来なくなってしまいます。)

REDOログの遠隔地同期での利用

再度同じ変更を行うことが出来るという性質のログのため、遠隔地へのデータ同期にも使用されます。
例えば、東京にあるデータファイルのコピーを大阪に置き、東京で実行されたREDOログのみを大阪へ送ることで、少ない転送量でのデータの同期ができるようになります(基本スタンバイ/Data Guard)。
他にも特定の表に対する実行内容を取り出して、遠隔地で再実行することで部分的な同期が出来るようになります。(ログマイナー/Oracle Golden Gate)

UNDOレコードとは

UNDOレコードの主な用途

UNDOレコードは主にトランザクションをロールバックするために使用されます。処理を開始してからデータがコミット(決定)されるまでの一連の流れのことをトランザクションと呼びます。
ROLLBACKコマンドによって実行を取り消し、処理の開始時点に戻すこと(UNDO)が出来ます。

他に重要な機能として、UNDOレコードは読み取り一貫性というものを提供します。これは、検索時に一貫性のあるデータを提供する機能です。

例えば10秒間かかるSELECTを行うと、データ取得中に更新があった時、最初に検索されたレコード(行データ)は古いデータで、最後の方に検索されたレコードは新しいデータとなってしまうことが想定されます。Oracleではこの時に、時間断面の一貫性がとれたデータの取得を保証しています。
一貫性の取れたデータを取得するためには、この例の場合最大10秒前の過去のデータを参照する必要があります。

この10秒間において一貫性のある過去データを取得する仕組みとしてUNDOレコードが使用されます。10秒間のSELECT中に過去データが保存容量を超えて上書きされたなどの理由により参照できないと、ORA-01555が発生します。

UNDOレコードの出力

UNDO用の表領域を準備してそこにUNDOレコードを作成します。DBCAにおけるデフォルトでの名前は、UNDOTBS1となっています。
このようなUNDO専用の表領域を準備する場合は、自動UNDO管理と呼ばれる管理方法です。SYSTEM表領域を利用し、UNDOレコードを細かく手動管理する方法もありますが、デメリットが多く、新規のシステムでは殆ど使用されていません。Oracleとしても自動UNDO管理の使用を推奨しています。

UNDOレコードのFLASHBACKテクノロジーでの利用

トランザクションの取り消しでは、UNDOレコードにある実行前のデータと操作内容から処理開始前のデータに戻します。このように、実行前のデータを参照できるような性質を持つため、FLASHBACK操作に多用されています。
UNDOレコードを利用したFLASHBACK操作の例としては、以前の時間を指定して指定時間の過去データを参照する問い合わせ(Oracle Flashback Version Query)や、指定した行データについて指定時間のデータに戻すためのSQLを生成する問い合わせ(Oracle Flashback Transaction Query)を行うことが出来ます。