Redo(重做)
除了用於儲存資料的資料檔案外,每個oracle資料庫都會有一組(兩個或多個)重做記錄檔。重做日誌用於儲存對資料的所有修改,包括提交的和未提交的修改。在把對資料的修改寫到資料檔案之前,所有的修改都被寫到重做日誌中。
重做日誌的主要目的是在執行個體失敗或者介質損壞時,協助把資料庫恢複到一個合理的狀態。例如:當進行執行個體恢複時,重做日誌可以重做那些已經提交但是還沒有把修改寫入到資料檔案中的事務。
重做日誌由兩部分組成:線上重做日誌和歸檔重做日誌。為了避免發生單點故障,Oracle會建立多組線上重做記錄檔。如果資料庫工作在ARCHIVELOG模式,Oracle將在每個檢查點建立歸檔日誌,他們可以用於磁碟損壞時的資料庫恢複。所以對於生產系統來說,歸檔重做日誌是很重要的,應該把生產系統設定為ARCHIVELOG模式。歸檔重做日誌應該週期性備份和刪除。
Oracle會重用重做記錄檔,當一個記錄檔寫滿時就會切換到另一個記錄檔,因此在進行日誌切換之前,需要確保前一個日誌可以被重寫,這是通過建立檢查點來實現的,這時DBWn進程將把該記錄檔保護的所有髒塊寫入到磁碟。因此,重做記錄檔的大小直接影響建立檢查點的頻率和效能,建立檢查點的頻率會根據系統活動發生很大的變化,但是通常情況下是2到3個小時建立一次。
Undo(撤消)
Oracle把所有即將被修改(即執行update,delete等)的資料記錄到undo段中,即在資料被修改之前,Oracle把他們記錄到undo段中。
Undo資訊有兩個用途:1.實現Oracle中的多版本機制,從而使讀不阻塞寫,寫也不阻塞讀。2.當復原一個事務時用於把資料庫恢複到該事務執行前的狀態。
復原段也會被重用,因此應該把復原段設定成足夠大。否則,有可能發生ORA-01555:snapshot too old錯誤,發生這種錯誤的一般是因為復原段設定的太小。例如:你在讀取一個資料表中的記錄,另一個使用者更新該表中你正要讀取的記錄並且提交了更新,這時你讀取那個時點的資料就會被寫入到復原段中,你將從復原段中讀取這些記錄,如果這些資料所在的復原段被覆蓋了,就會發生snapshot too old錯誤。