數據庫概論 (七)恢復技術

數據庫恢復技術

保證數據庫數據的可靠性。數據庫

一個簡單的例子:併發

  • 從A帳戶向B帳戶轉帳1000元人民幣
  • 讀取A帳戶的餘額
  • 餘額足夠,扣除一千元
  • 讀取B帳戶的餘額
  • 將餘額加上1000元

在扣除餘額到餘額增長的步驟之間,若是出現了系統性的故障,硬件故障,致使整個流程沒有順利完成,就會致使錯帳。atom

簡單分析可知出錯是由於整個流程並非原子性的,或者說,想要完成原子性,可是沒有對中間錯誤發生的預案。日誌

事務

事務的基本特性有四個特性,ACID,保證了事務的原子性,一致性,永久性,隔離性。對象

1. 原子性(Atomicity)

事務被視爲不可分割的最小單元,事務的全部操做要麼所有提交成功,要麼所有失敗回滾。隊列

回滾能夠用回滾日誌(Undo Log)來實現,回滾日誌記錄着事務所執行的修改操做,在回滾時反向執行這些修改操做便可。事務

2. 一致性(Consistency)

數據庫在事務執行先後都保持一致性狀態。在一致性狀態下,全部事務對同一個數據的讀取結果都是相同的。若是出問題可能會致使不可重複讀,幻影讀等問題。ci

3. 隔離性(Isolation)

一個事務所作的修改在最終提交之前,對其它事務是不可見的。在併發的時候使用鎖機制來保證隔離性。it

4. 持久性(Durability)

一旦事務提交,則其所作的修改將會永遠保存到數據庫中。即便系統發生崩潰,事務執行的結果也不能丟失。io

系統發生崩潰能夠用重作日誌(Redo Log)進行恢復,從而實現持久性。與回滾日誌記錄數據的邏輯修改不一樣,重作日誌記錄的是數據頁的物理修改。

事務的目的是保障在任何狀況下,無論是正常運行仍是發生了系統故障,不管是單用戶,串行執行仍是多用戶併發執行都要保證事務的執行。

關於鎖和併發的問題放在下一章講 [鎖與併發](./數據庫概論 (八))


日誌系統

日誌文件是用來記錄事務對數據庫的更新操做的文件,日誌每每以記錄爲最小單位,或者以數據庫定義的數據塊爲最小單位。

以記錄爲單位的日誌文件的內容

  • 各個事務的開始標記(BEGIN TRANSACTION)
  • 各個事務的結束標記(COMMIT或ROLLBACK)
  • 各個事務的全部更新操做
  • 事務標識(標明是哪一個事務)
  • 操做類型(插入、刪除或修改)
  • 操做對象(記錄內部標識)
  • 更新前數據的舊值(對插入操做而言,此項爲空值)
  • 更新後數據的新值(對刪除操做而言, 此項爲空值)

重點是爲了記錄:哪一個事務改變了哪一個數據塊。

登記日誌文件的基本原則

  1. 登記的次序嚴格按照事務執行的時間次序登記
  2. 必須先寫日誌文件,再寫數據庫

並非全部的操做都要寫日誌文件,只有在要把數據寫到數據庫中的時候才須要先寫日誌文件,再寫數據庫

由於能夠經過日誌文件恢復UNDO失敗的數據庫操做,若是先寫數據庫那麼若是出現了錯誤就沒有機會恢復剛剛的修改了。

恢復策略

事務運行過程當中發生了故障

由恢復子系統利用日誌文件撤銷剛剛發生的對數據庫的修改。此處的恢復操做是對用戶透明的,用戶不須要干預此處的修復。

  1. 從日誌文件的末尾開始反向掃描日誌文件,找到故障事務的數據庫修改操做
  2. 執行修改操做的逆操做
  3. 繼續反向掃描,遇到修改操做則執行2,直到抵達故障事務的開始語句。

系統故障致使的數據庫狀態不一致

形成不一致的緣由

  • 未完成的事務的數據已經寫入到數據庫中
  • 已經提交的事務對數據庫的修改還在緩衝區中,尚未執行修改

恢復的方法

  • Undo 針對未完成的,已經修改的操做
    • 反向掃描日誌文件,對修改數據庫的操做執行逆操做
    • 將更新前的值寫入到數據庫,覆蓋數據
  • Redo 針對緩衝區中的操做
    • 正向掃描日誌文件,找到每個要執行數據庫修改的操做
    • 將數據從新寫入數據庫

介質故障

首先要轉入最新的,正常的數據庫備份副本,使之恢復到最近的正常狀態。

  • 對於靜態存儲的數據庫副本,裝入以後就已經處於一致性狀態。
  • 對於動態存儲的數據庫副本,還要裝入轉儲時刻的日誌文件副本,使用Undo和Redo機制恢復到一致性狀態。

而後對於備份以後的數據,咱們要經過存儲的日誌文件來恢復,重作全部已經完成的事務。

  • 掃描日誌文件,找出故障發生時已經提交的事務的標誌,而後將其記入Redo隊列,等待Redo
  • 而後正向掃描日誌文件,對重作隊列中的全部事務進行重作,而後寫入數據庫