2017-07-01 41 views
0

從我瞭解的ARIES算法,支持ACID事務必須使用WAL(預寫日誌):所有的寫操作都會被記錄。當ARIES算法的恢復階段DBMS崩潰時會發生什麼?

據說給回滾崩潰之前未提交的事務做出變化的能力到數據庫。

每個寫,我們記錄有關實際寫入信息(如何重做,如何撤消它)。

在恢復階段,我們分析日誌來執行恢復操作:

  • 我們讀到的日誌條目
  • 我們將更改應用於數據庫
  • 我們設置日誌條目進行

然後,爲了執行UNDO,寫入了一個新的日誌條目(因爲它畢竟是一個寫入),然後在檢查點期間將更改應用於數據庫。

在一個檢查點,我想我們只是進行了重做所有提交的條目。

我還沒有發現任何信息。如果發生了什麼:

  • 有檢查點時的崩潰
  • 在REDO階段出現崩潰,之後更改已被應用到數據庫和前/期間日誌的更新將其設定爲完成

在這種情況下,一些變化已經應用到數據庫中,而不是由日誌反映,讓數據庫處於不一致的狀態。

注:下面是一些鏈接,我以前瞭解ACID事務和ARIES算法:

我我目前正在閱讀SQLite的源代碼瞭解整個事情是如何實施的。

預先感謝關於這一主題的任何澄清。

+0

相關:https://stackoverflow.com/questions/10289170/why-does-aries-perform-a-redo-before-undo-in-database-management-recovery – Jedi

回答

1

在REDO期間,如果需要,讀取日誌並修改數據。如果在重做期間發生崩潰,則下一次恢復將再次運行重做。在第一次恢復嘗試時修改數據的某些日誌記錄將被禁用,因爲數據修改已保存。其他將不會被保存,並會再次「重做」。

檢查點仍然是一筆交易操作。在內存中保存數據,然後最後在日誌中寫入檢查點日誌記錄。如果在檢查點期間發生崩潰,則只能在檢查點記錄寫入之前發生崩潰。在崩潰恢復再次運行並從REDO開始(因爲沒有新的檢查點記錄)。上述要點適用,REDO可以重複運行。某些日誌記錄將不可用,因爲數據更改已保存,有些日誌記錄將再次「重做」。

UNDO正在生成和編寫補償日誌記錄。如果在UNDO期間發生崩潰,那麼在下次恢復時,還有一條記錄用於分析和重做(補償記錄)。此後UNDO崩潰恢復將運行它的UNDO階段,開始上次成功的UNDO日誌記錄保存。也就是說,如果原始日誌在未提交的事務中包含兩個操作(例如OP1和OP2),然後啓動UNDO,它會寫入補償UNDO-OP1並崩潰。然後恢復將UNDO從OP2開始,因爲對於OP1,日誌中已經有了補償記錄(UNDO-OP1)。

正確實施的ARIES從來沒有任何不一致的窗口。

+0

這意味着,爲了正確實施算法,日誌記錄必須跟蹤舊狀態和新狀態? – linkdd

+0

日誌記錄必須是冪等的。實施細節各異。 –