爲什麼PG只是用REDO方法來進行數據庫的恢復

爲什麼PG只是用REDO方法來進行數據庫的恢復

在閱讀<PG數據內核分析>一書中, 看到這樣一句話:

PG只是用REDO方法來進行數據庫的恢復, 它不使用UNDO是因爲其數據的多版本使得UNDO沒有必要. 但從本質上來講, PG日誌並非是REDO日誌, 而應該是UNDO/REDO日誌, 其創建檢查點時大體上服從UNDO/REDO日誌創建檢查點時要服從的規則, 只是做了一點改動.

爲什麼不使用UNDO呢?

我們知道Oracle數據庫恢復時除過redo日誌, 還需要undo日誌. 看看Oracle數據庫是如何恢復的. 先了解一下Oracle undo表空間的作用.

undo表空間

回退段介紹

在Oracle數據庫中,當某個事物對數據進行修改時,Oracle首先將數據的原始值保存到一個回退段中。一個事物只能將它的回退信息保存到一個回退段中,而多個並行事物可以使用同一個回退段。

(1)回退段的作用

回退段主要有4個作用,分別是:事物回滾、數據庫恢復、讀一致性、閃回查詢。

–事物回滾:當事物執行失敗或用戶執行回滾操作(rollback)時,Oracle會利用保存在回退段中的信息將數據恢復到原來的值;

–數據庫恢復:當數據庫實例運行失敗,在數據庫重啓恢復時,Oracle先利用重做日誌文件的信息對數據庫進行恢復(包括已提交和未提交的事務),再利用回滾段中的信息回滾未提交的事務;

–讀一致性:當一個用戶對數據進行修改時,會預先將其原始值保存到回退段中,這時,如果有其它用戶訪問該數據,則訪問回退段中的信息,使當前用戶未提交的修改其他用戶無法看到,保證了數據的一致性;

–閃回查詢:通過保留在回退段中的信息,用戶可以查詢某個數據在過去某個時刻的狀態

(2)回退段的工作方式

當事務開始時,系統分配給該事物一個回退段,在事務的整個生命週期中,當數據發生改變時,數據的原始值被複制到回退段中。回退段採用循環寫的方式進行工作,當事務寫滿回退段的一個區之後,會接着寫入回退段的下一個區,當所有的區都寫滿後,事務開始循環寫入到第一個區或者分配新的區(datafile爲autoextend)。回退段歸用戶sys所有,每個回退段至少包含2個區。

總結

個人理解, Oracle未提交數據恢復時, 需要從undo段空間中以回滾(undo)的方式獲得"舊版數據", 並且還要寫回到數據文件中. 而PG舊版數據就在數據文件中, 所謂恢復, 其實就是更改一下數據的標記, 即: 將原舊版數據"修改標記"成新的即可.

所以, 基於以上機制, 當爲提交需要恢復的數據量很大時, PG的數據恢復會很快. 代價就是引入了Vacuum這樣的機制.

當然, 上面講了" PG日誌並非是REDO日誌", 這個後續研究明白了, 再講.

參考

[Oracle]理解undo表空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章