數據庫系統基於日志的故障恢復過程


      在數據庫系統中日志是記錄數據庫修改的結構,記錄數據庫中的所有更新活動。描述一次數據庫寫操作的一個更新日志記錄包含如下幾個字段:

1)事務標識符是執行write操作事務的唯一標識符。
2)數據項標識符是所寫數據項的唯一標識符。通常是數據項在磁盤上的位置。
3)舊值是寫之前數據項的值。
4)新值是寫之后數據項的值。
      每次事務執行寫操作之前,必須在數據庫修改前建立該次寫操作的日志記錄。一旦日志記錄已存在,如果需要,就可以輸出對數據庫的修改,並且,我們能夠利用日志記錄中的舊值字段來撤銷已經對數據庫的修改。
為了從系統故障和磁盤故障中恢復時能使用日志記錄,日志必須放在穩定存儲器上。利用日志,系統可以解決任何不造成非易失性存儲器上的信息丟失的故障。


恢復機制使用兩個恢復過程:
1)undo(Ti)將事務Ti所更新的所有數據項的值恢復成舊值。
2)redo(Ti)將事務Ti所更新的所有數據項的值置為新值。


Ti所更新過的數據項集合及其舊值和新值均能在日志中找到。
故障發生后,恢復機制檢查日志,決定哪些事務需要redo,哪些需要undo:
事務Ti需要undo,如果日志包含記錄<Ti start>,但不包含記錄<Ti commit>。
事務Ti需要redo,如果日志即包含記錄<Ti start>,又包含記錄<Ti commit>。

數據庫系統中的檢查點相關操作
當系統發生故障時,必須檢查日志,決定哪些事務需要redo,哪些事務需要undo。
系統周期性地執行檢查點(checkpoint),需要執行下列動作序列:
1.將當前位於主存的所有日志記錄輸出到穩定的存儲器上。
2.將所有修改了的緩沖塊輸出到磁盤上。
3.將一個日志記錄<checkpoint>輸出到穩定存儲器。
檢查點執行過程中,不允許事務執行任何更新動作,如寫緩沖塊或寫日志記錄。


日志記錄<checkpoint>使系統提高了恢復過程的效率。
例如在檢查點前提交的事務Ti。記錄<Ti commit>在日志中出現在<checkpoint>前。Ti所最的任何數據庫修改都必然已在檢查點前或作為檢查點本身的一部分寫入數據庫。因此,在恢復時就不必再對Ti執行redo操作了。


故障發生后,恢復機制檢查日志來確定最近的檢查點發生前開始執行的最近一個事務Ti。
要找到這個事務只需要從日志的尾部有后之前搜索日志,直到找到第一個<checkpoint>記錄(由於由后至前搜索,這個找到的記錄是日志中的最后一個<checkpoint>記錄),然后繼續向前搜索直至發現下一個<Ti start>記錄。該記錄指明了事務Ti。
一旦系統確定事務Ti,則只需要對事務Ti和事務Ti后開始執行的所有事務Tj執行redo和undo操作。日志的剩余部分(前面的部分)可以忽略,並且可以根據需要隨時刪除。

並發事務的恢復
在並發事務處理系統中,檢查點日志記錄的形式<checkpoint L>,其中L為檢查點是活躍的事務列表。
當系統從崩潰中恢復時,它構造兩個列表:undo-list由需要撤銷的事務構成,redo-list由需要重做的事務構成。
兩個列表按如下步驟構造:開始時都為空。系統有后至前掃描日志,檢查每一條記錄,直至發現第一個<checkpoint>記錄:
對每個<Ti commit>的記錄,將Ti 加入redo-list.
對每個<Ti start>的記錄,如果Ti不屬於redo-list,則將Ti加入undo-list。
所有相應的日志記錄都檢查后,系統查看檢查點記錄中的列表L。對L中的每一個事務Ti,
如果Ti不屬於redo-list,則將Ti加入undo-list。
redo-list,undo-list構造完,恢復過程進行如下工作:
1.系統從最近一個記錄開始由后至前重新掃描日志,並且對undo-list中事務Ti的每一個日志記錄執行undo操作。redo-list中事務的日志記錄在本步驟中忽略。當undo-list中的所有事務 Ti

所對應的<Ti start>記錄都找到時,掃描停止。
2.系統找出日志中的最近一條<checkpoint L>記錄。上一步已經經過了最近的檢查點記錄,這一步可能要由前至后掃描日志。
3.系統有最近一條<checkpoint L>記錄開始有前至后掃描日志,並且對redo-list中事務Ti的每一個日志記錄執行redo操作。這時忽略undo-list中事務的日志記錄。
當undo-list中的所有事務撤銷后,重做redo-list中的事務。由前至后處理日志。
當恢復過程完成時,事務處理恢復執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM