ORACLE 前滾和回滾

bitifi發表於2015-10-09
Oracle資料庫是採用“日誌在先”機制的。當我們對資料庫資料進行修改時,並不是立即將修改資料寫入到檔案中,而是寫入到共享記憶體SGA空間中的Buffer Cache裡。同時,將修改的日誌不斷的寫入到SGA中另一塊Log Buffer快取中。有一個後臺程式LGWn不斷的將Log Buffer快取中的日誌內容寫入到online redo log檔案中。 

日誌檔案的幾個特點: 
首先,日誌檔案的寫入是很頻繁的。LGWn會不斷將日誌資訊從Log Buffer中寫入Online Redo Log; 
其次,在日誌檔案上,可以有三個型別的事務事件: 
1、事務結束,已經被commit,之後打過checkpoint檢查點。這種事務記錄在Log File上,但是變化資訊已經被DBWn寫入進資料檔案; 
2、事務結束,已經被commit,之後沒有打入checkpint檢查點。這種情況下,Log File已經寫入了日誌專案,資料檔案可能包括髒資料,也可能沒有寫入髒資料; 
3、事務未結束,沒有commit。這種時候,資料塊Dirty Block上面是有事務槽資訊,表示未結束事務,是不會將資料寫入到資料檔案中。但是,日誌Log Buffer可能將部分未提交的DML操作專案寫入到Log File中; 

“前滾和回滾”是Oracle資料庫例項發生意外崩潰,重新啟動的時候,由SMON進行的自動恢復過程。 

1、當例項失敗後,SMON首先找到最後SCN記錄的Redo Log File,尋找最後一個打入的Checkpoint。 
注:檢查點Checkpoint 
檢查點Checkpoint是資料庫一致性檢查的一個標記。簡單的說,就是在這個點上,Oracle保證各個檔案(資料、控制、日誌等)是一致的。檢查點的作用就是在進行例項恢復的時候,告訴SMON程式,這個點之前的內容不需要進行恢復。 
2、Oracle會從這個checkpoint position處開始應用日誌檔案進行“前滾”來重演整個操作過程直到例項失敗的那一刻 
前滾,就是把已經寫到redo上但是還沒有寫道到datafile上的變化透過讀取redo來寫到datafile上,不論是否提交。 
3、開啟資料庫 
4、對於沒有進行提交的事物,ORACLE會從Undo表空間中尋找到舊版本SCN的資料塊資訊,來進行SGA中Buffer Cache資料塊恢復。“回滾”未提交的事務。 

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

相關文章