天天看點

關于redo log 和 undo log

redo log

  重做日志

undo log

  撤消日志

重做日志:每當有操作執行前,将資料真正更改時,先前相關操作寫入重做日志。這樣當斷電,或者一些意外,導緻後續任務無法完成時,系統恢複後,可以繼續完成這些更改

撤消日志:當一些更改在執行一半時,發生意外,而無法完成,則可以根據撤消日志恢複到更改之前的壯态

有兩個概念:前滾與回退

比如某一時刻資料庫DOWN機了,有兩個事務,一個事務已經送出,另一個事務正在處理

資料庫重新開機的時候就要根據日志進行前滾及回退,把已送出事務的更改寫到資料檔案,未送出事務的更改恢複到事務開始前的狀态。

redo--> undo-->datafile

insert一條記錄時, 表跟undo的資訊都會放進 redo 中, 在commit 或之前, redo 的資訊會放進硬碟上. 故障時, redo 便可恢複那些已經commit 了的資料.

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 也是也是datafile, 可能dirty buffer 沒有寫回到磁盤裡面去。

隻有先redo apply 成功了,才能保證undo datafile 裡面的東西都是正确的,然後才能rollback

做undo的目的是使系統恢複到系統崩潰前(關機前)的狀态,再進行redo是保證系統的一緻性.

不做undo,系統就不會知道之前的狀态,redo就無從談起

是以instance crash recovery 的時候總是先rollforward, 再rollback

undo

回退段中的資料是以“回退條目”方式存儲。

回退條目=塊資訊(在事務中發生改動的塊的編号)+在事務送出前存儲在塊中的資料

在每一個回退段中oracle都為其維護一張“事務表”

在事務表中記錄着與該回退段中所有回退條目相關的事務編号(事務SCN&回退條目)

redo

重做記錄由一組“變更向量”組成。

每個變更變量中記錄了事務對資料庫中某個塊所做的修改。

當使用者送出一條commit語句時,LGWR程序會立刻将一條送出記錄寫入到重做日志檔案中,然後再開始寫入與該事務相關的重做資訊。

#事務送出成功後,Oracle将為該事備生成一個系統變更碼(SCN)。事務的SCN将同時記錄在它的送出記錄和重做記錄中。

commit

送出事務前完成的工作:

·在SGA區的回退緩存中生成該事務的回退條目。在回退條目中儲存有該事務所修改的資料的原始版本。

·在SGA區的重做日志緩存中生成該事務的重做記錄。重做記錄中記載了該事務對資料塊所進行的修改,并且還記載了對回退段中的資料塊所進行的修改。緩存中的重做記錄有可能在事務送出之前就寫入硬碟中。

·在SGA區的資料庫緩豐中記錄了事務對資料庫所進行的修改。這些修改也有可能在事務送出之前就寫入硬碟中。

送出事務時完成的工作:

·在為該事務指定的回退段中的内部事務表内記錄下這個事務已經被送出,并且生成一個惟一的SCN記錄在内部事務表中,用于惟一辨別這個事務。

·LGWR後進程序将SGA區重做日志緩存中的重做記錄寫入聯機重做日志檔案。在寫入重做日志的同時還将寫入該事務的SCN。

·Oracle服務程序釋放事務所使用的所有記錄鎖與表鎖。

·Oracle通知使用者事務送出完成。

·Oracle将該事務标記為已完成。

rollback

回退事務完成的工作:

·Oracle通過使用回退段中的回退條目,撤銷事務中所有SQL語句對資料庫所做的修改。

·Oracle服務程序釋放事務所使用的所有鎖

·Oracle通知事務回退成功。

·Oracle将該事務标記為已完成

繼續閱讀