redo和undo的區別

leixue0906發表於2012-07-26

redo和undo的區別

Oracle的redo和undo的區別

redo->每次操作都先記錄到redo日誌中,當出現例項故障(像斷電),導致資料未能更新到資料檔案,則資料庫重啟時須redo,重新把資料更新到資料檔案
undo->記錄更改前的一份copy,但你係統rollback時,把這份copy重新覆蓋到原來的資料

redo->記錄所有操作,用於恢復(redo records all the database transaction used for recovery)
undo->記錄所有的前印象,用於回滾(undo is used to store uncommited data infor used for rollback)

redo->已遞交的事務,例項恢復時要寫到資料檔案去的
undo->未遞交的事務.

redo的原因是:每次commit時,將資料的修改立即寫到online redo中,但是並不一定同時將該資料的修改寫到資料檔案中。因為該資料已經提交,但是隻存在聯機日誌檔案中,所以在恢復時需要將資料從聯機日誌檔案中找出來,重新應用一下,使已經更改資料在資料檔案中也改過來!

undo的原因是:在oracle正常執行時,為了提高效率,假如使用者還沒有commit,但是空閒記憶體不多時,會由DBWR程式將髒塊寫入到資料檔案中,以便騰出寶貴的記憶體供其它程式使用。這就是需要UNDO的原因。因為還沒有發出commit語句,但是oracle的dbwr程式已經將沒有提交的資料寫到資料檔案(undo 表空間對應得資料檔案)中去了。
只有先redo apply 成功了,才能保證undo datafile 裡面的東西都是正確的,然後才能rollback
做redo的目的是使系統恢復到系統崩潰前(關機前)的狀態,再進行undo是保證系統的一致性.
不做redo,系統就不會知道之前的狀態, undo就無從談起
所以instance crash recovery 的時候總是先rollforward,再rollback

舉個例子:
insert into a(id) values(1);(redo)
這條記錄是需要回滾的。
回滾的語句是delete from a where id = 1;(undo)

試想想看。如果沒有做insert into a(id) values(1);(redo)
那麼delete from a where id = 1;(undo)這句話就沒有意義了。

現在看下正確的恢復:
先insert into a(id) values(1);(redo)
然後delete from a where id = 1;(undo)
系統就回到了原先的狀態,沒有這條記錄了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26845409/viewspace-736915/,如需轉載,請註明出處,否則將追究法律責任。

相關文章