OracleのUNDOとREDOの違いが良く分かりません。

どちらも表に対しての変更内容を保存している気がするのですが…

違いを教えてください!
宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/12/30 15:44:08
  • 終了:2007/12/31 22:10:40

ベストアンサー

id:shinfukui No.2

shinfukui回答回数7ベストアンサー獲得回数12007/12/31 14:49:36

ポイント50pt

UNDOとは主に「実行した操作を取り消す」ことで、REDOとは「一度やったことをもう一度やる」ということになります。

UNDOはトランザクション取り消し時のロールバック用に、REDOは障害が起きた場合に一旦データをバックアップ時点まで戻し、そこから再度障害直前まで処理をやり直す(ロールフォワード)際に用いられます。

例えばレコードのUPDATEが行われた場合、UNDOデータにそのレコードの「更新前の状態」が丸ごと保存されます。トランザクションがキャンセルされた場合には、UNDOデータに保存された「更新前の状態」をレコードに書き戻す事でキャンセルを実現します。このUNDOデータは、トランザクションコミット前にそのレコードに対してSELECT要求があった場合にも使われたりします。

同様に、レコードのUPDATEが行われた場合には、REDOログにそのUPDATE内容が保存されます。ここに保存されるのはレコードのコピーではなく、UPDATEの命令内容です。データベースの運用では、障害発生に備えて定期的にデータバックアップを取りますが、例えば一日に1回朝バックアップを取るとして、夜に障害が発生すると、バックアップに戻したとしてもその日一日の更新がパァになってしまいます。かといってそんな頻繁にバックアップを取るとパフォーマンスが低下してしまいます。そこで、REDOログという仕組みを使い、バックアップ時点+REDOログの再実行、という形で、障害直前までの状態に復旧させるのです。これにより、バックアップ回数を抑えつつ、障害発生リスクを減らす事が可能になっています。

その他の回答(2件)

id:mass3 No.1

mass3回答回数118ベストアンサー獲得回数152007/12/30 20:27:37

ポイント50pt

「どちらも表に対しての変更内容を保存している」は正しいのですが、保存する目的が違います。

UNDOログはロールバック用、REDOログはロールフォワード用です。

ロールバックとロールフォワードの用語がわからない場合は以下を参照ください。

http://e-words.jp/w/E383ADE383BCE383ABE38390E38383E382AF.html

http://e-words.jp/w/E383ADE383BCE383ABE38395E382A9E383AFE383BCE3...

id:shinfukui No.2

shinfukui回答回数7ベストアンサー獲得回数12007/12/31 14:49:36ここでベストアンサー

ポイント50pt

UNDOとは主に「実行した操作を取り消す」ことで、REDOとは「一度やったことをもう一度やる」ということになります。

UNDOはトランザクション取り消し時のロールバック用に、REDOは障害が起きた場合に一旦データをバックアップ時点まで戻し、そこから再度障害直前まで処理をやり直す(ロールフォワード)際に用いられます。

例えばレコードのUPDATEが行われた場合、UNDOデータにそのレコードの「更新前の状態」が丸ごと保存されます。トランザクションがキャンセルされた場合には、UNDOデータに保存された「更新前の状態」をレコードに書き戻す事でキャンセルを実現します。このUNDOデータは、トランザクションコミット前にそのレコードに対してSELECT要求があった場合にも使われたりします。

同様に、レコードのUPDATEが行われた場合には、REDOログにそのUPDATE内容が保存されます。ここに保存されるのはレコードのコピーではなく、UPDATEの命令内容です。データベースの運用では、障害発生に備えて定期的にデータバックアップを取りますが、例えば一日に1回朝バックアップを取るとして、夜に障害が発生すると、バックアップに戻したとしてもその日一日の更新がパァになってしまいます。かといってそんな頻繁にバックアップを取るとパフォーマンスが低下してしまいます。そこで、REDOログという仕組みを使い、バックアップ時点+REDOログの再実行、という形で、障害直前までの状態に復旧させるのです。これにより、バックアップ回数を抑えつつ、障害発生リスクを減らす事が可能になっています。

id:HISI No.3

pkb_wn回答回数40ベストアンサー獲得回数42007/12/31 17:36:05

ポイント50pt

Redoログは、トランザクションログとも呼ばれていて

チェックポイント時にデータファイル本体に反映させる更新内容を逐次小書き(メモ)しているものです。

ご存知かもしれませんが、データベースシステム(DBMS)は、高パフォーマンス目的に

トランザクション開始後COMMITされた際、直接データファイルを更新せずRedoログにその内容をメモし終わった時点でCOMMIT成功にします。

そして定期的なCHECKPOINTイベントで、記録したRadoログの内容を順次データファイルに反映していきます。

ちなみにロールフォワードによるリカバリは、この仕組みを応用したもので

最新のデータファイルがなくて古い状態のデータファイルしか残っていなくても、その時点からのRedoログさえあれば最新のデータファイルの状態まで持ち込んでいく処理です。


一方、Undoログは、ロールバックセグメントあるいはUndoセグメントのことだと思いますが、

こちらは複数ユーザーからの同時実行性のための機能です。(すべてのDBMSが実装しているものではありません。MSSQLServer2000など)

あるユーザが更新トランザクションを開始した時点のデータをUndoセグメントに保存しておき(スナップショットのようなもの)、

その間に別のユーザが更新対象になっているデータを読み出すとき、このUndoセグメントから読み込まれます。

もしUndoセグメントのしくみを用いないと、おそらく更新中のデータは排他ロックをかけられて(トランザクションの原子性を保つため)読むことが出来ません。


しくみ上の大きな違いは、Redoログは更新内容をこつこつ溜めていくのに対して、Undoセグメントはある時点の内容を丸ごと保存することでしょうか。


これはMySQLのものですが、もしご参考になればどうぞ。

http://www.buena-idea.net/~hironobu/mysql/m-2-08.html

トランザクションの原子性

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32904&fo... (関連のない情報もあります)

id:jun09

ありがとうございました。

皆様の回答を見て、UNDOとREDOの考え方がわかりました!

2007/12/31 22:08:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません