數(shù)據(jù)庫的恢復(fù)機(jī)制是數(shù)據(jù)庫系統(tǒng)必不可少的組成部分,負(fù)責(zé)把數(shù)據(jù)庫從錯誤狀態(tài)恢復(fù)到某一已知的正確狀態(tài),使用的基礎(chǔ)技術(shù)便是日志,以一種安全的方式記錄數(shù)據(jù)庫變更的歷史。
系統(tǒng)可能發(fā)生的故障有很多種,需要不同的方法進(jìn)行處理。
根據(jù)故障的處理方式來看,主要是冗余數(shù)據(jù)(轉(zhuǎn)儲)和登記日志文件。
數(shù)據(jù)轉(zhuǎn)儲
轉(zhuǎn)儲是指將整個數(shù)據(jù)庫復(fù)制到磁帶或另一個磁盤上保存起來的過程,備份的數(shù)據(jù)可以用來恢復(fù)數(shù)據(jù)庫。
轉(zhuǎn)儲十分耗費(fèi)時間和資源數(shù)據(jù)庫一致性錯誤修復(fù),不能頻繁進(jìn)行。轉(zhuǎn)儲可分為靜態(tài)轉(zhuǎn)儲和動態(tài)轉(zhuǎn)儲。
轉(zhuǎn)儲還可以分為全量轉(zhuǎn)儲和增量轉(zhuǎn)儲。增量就是上一次轉(zhuǎn)儲后的更新數(shù)據(jù)。
事務(wù)的過程
事務(wù)故障是恢復(fù)機(jī)制中最重要的部分,需要借助日志系統(tǒng)才能展開,日志記錄了系統(tǒng)中發(fā)生的各個事務(wù)。為了保證恢復(fù)時可以從Log中看到最新的數(shù)據(jù)庫狀態(tài),要求Log先于數(shù)據(jù)內(nèi)容落盤,也就是常說的Write Ahead Log,WAL。
事務(wù)的兩種恢復(fù)操作:
事務(wù)日志也能解決動態(tài)轉(zhuǎn)儲的數(shù)據(jù)正確性問題。
事務(wù)操作是先寫入主內(nèi)存,然后再寫回磁盤。輸入輸出以塊為單位數(shù)據(jù)庫一致性錯誤修復(fù),磁盤上的物理塊,主內(nèi)存上臨時的塊叫緩沖塊,主內(nèi)存中這部分區(qū)域叫緩沖區(qū)。
寫磁盤有兩種策略:
事務(wù)的原語操作有:
登記日志記錄
登記數(shù)據(jù)庫修改的就是日志,記錄了數(shù)據(jù)庫中所有的更新動作。
事務(wù)記錄的日志記錄類型有:
事務(wù)更新日志記錄包括的數(shù)據(jù)有:
日志記錄序列寫入日志文件中,每個日志記錄都將立即追加到日志文件的尾部。
為了優(yōu)化日志恢復(fù)性能,減少搜索日志范圍,引入檢查點(diǎn)技術(shù),加入了新的日志記錄類型:
執(zhí)行檢查點(diǎn)操作的過程中不允許執(zhí)行任何更新,并將所有更新過的緩沖塊都輸出到磁盤。過程如下:
有了檢查點(diǎn)后,恢復(fù)從最后一條檢查點(diǎn)類型的日志記錄開始的所有日志。
另外還有一個模糊檢查點(diǎn)技術(shù),允許記錄檢查點(diǎn)過程中事務(wù)執(zhí)行。
恢復(fù)算法
在基于磁盤的數(shù)據(jù)庫系統(tǒng)中,恢復(fù)子系統(tǒng)大都是基于ARIES( for and )算法實(shí)現(xiàn)。ARIES對于數(shù)據(jù)緩沖區(qū)和日志緩沖區(qū)的管理采用Steal + No Force的管理策略
ARIES的日志類型包括、、Abort、End以及補(bǔ)償日志記錄CLR( Log )。
故障恢復(fù)包含三個階段:,Redo和Undo。