UNDO概要
2016-06-27
対応バージョン
Oracle Database 10.1 - 12.1
2017-04-03小見出しを追加(小見出しに伴い内容を調整)
2016-06-25記事公開
UNDOとREDOの違いについて説明します。
UNDOとREDOについて違いを出来るだけ覚えやすいように概要の記載のみします。
詳細の理解についてはマニュアル又は、別記事を参照してください。
REDOログとUNDOレコードは、大雑把に言うと以下のような違いがあります。
REDOログの主な用途としては、データベースが破損した時などに、データベースのリカバリのために使用されます。RMANなどを用いてRECOVERYコマンドを実行するときはREDOログを使うと覚えると覚えやすいかもしれません。
専用のログファイルに出力され、データベースに反映された内容の再現・再実行を行うためのログが格納されます。
ARCHIVELOGモードで運用している場合は、REDOログの過去分の保存(アーカイブ)が行われます。
データベースのリカバリ処理では、以前取得したデータベース全体のバックアップに対してREDOログの内容を再適用し、直前のデータまで戻すことができるようになります。この仕組みにより、ARCHIVELOGモードではREDOログに変更データを記録、保存しておくことで、データベースを停止しなくてもバックアップが取得できるようになります。(バックアップ完了後、記録、保存されたREDOログがデータファイルに適用されます。REDOログの過去分を保存しないNOARCHIVELOGモードでは、バックアップに時間がかかった場合にREDOログの保存先がないため、データファイルの更新が出来なくなってしまいます。)
UNDOレコードは主にトランザクションをロールバックするために使用されます。処理を開始してからデータがコミット(決定)されるまでの一連の流れのことをトランザクションと呼びます。
ROLLBACKコマンドによって実行を取り消し、処理の開始時点に戻すこと(UNDO)が出来ます。
他に重要な機能として、UNDOレコードは読み取り一貫性というものを提供します。これは、検索時に一貫性のあるデータを提供する機能です。
この10秒間において一貫性のある過去データを取得する仕組みとしてUNDOレコードが使用されます。10秒間のSELECT中に過去データが保存容量を超えて上書きされたなどの理由により参照できないと、ORA-01555が発生します。
UNDO用の表領域を準備してそこにUNDOレコードを作成します。DBCAにおけるデフォルトでの名前は、UNDOTBS1となっています。
このようなUNDO専用の表領域を準備する場合は、自動UNDO管理と呼ばれる管理方法です。SYSTEM表領域を利用し、UNDOレコードを細かく手動管理する方法もありますが、デメリットが多く、新規のシステムでは殆ど使用されていません。Oracleとしても自動UNDO管理の使用を推奨しています。
トランザクションの取り消しでは、UNDOレコードにある実行前のデータと操作内容から処理開始前のデータに戻します。このように、実行前のデータを参照できるような性質を持つため、FLASHBACK操作に多用されています。
UNDOレコードを利用したFLASHBACK操作の例としては、以前の時間を指定して指定時間の過去データを参照する問い合わせ(Oracle Flashback Version Query)や、指定した行データについて指定時間のデータに戻すためのSQLを生成する問い合わせ(Oracle Flashback Transaction Query)を行うことが出来ます。