資料庫恢復技術
保證資料庫資料的可靠性,
一個簡單的例子:
- 從A賬戶向B賬戶轉賬1000元人民幣
- 讀取A賬戶的余額
- 余額足夠,扣除一千元
- 讀取B賬戶的余額
- 將余額加上1000元
在扣除余額到余額增加的步驟之間,如果出現了系統性的故障,硬體故障,導致整個流程沒有順利完成,就會導致錯賬,
簡單分析可知出錯是因為整個流程并不是原子性的,或者說,想要完成原子性,但是沒有對中間錯誤發生的預案,
事務
事務的基本特性有四個特性,ACID,保證了事務的原子性,一致性,永久性,隔離性,
1. 原子性(Atomicity)
事務被視為不可分割的最小單元,事務的所有操作要么全部提交成功,要么全部失敗回滾,
回滾可以用回滾日志(Undo Log)來實作,回滾日志記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可,
2. 一致性(Consistency)
資料庫在事務執行前后都保持一致性狀態,在一致性狀態下,所有事務對同一個資料的讀取結果都是相同的,如果出問題可能會導致不可重復讀,幻影讀等問題,
3. 隔離性(Isolation)
一個事務所做的修改在最終提交以前,對其它事務是不可見的,在并發的時候使用鎖機制來保證隔離性,
4. 持久性(Durability)
一旦事務提交,則其所做的修改將會永遠保存到資料庫中,即使系統發生崩潰,事務執行的結果也不能丟失,
系統發生崩潰可以用重做日志(Redo Log)進行恢復,從而實作持久性,與回滾日志記錄資料的邏輯修改不同,重做日志記錄的是資料頁的物理修改,
事務的目的是保障在任何情況下,不管是正常運行還是發生了系統故障,無論是單用戶,串行執行還是多用戶并發執行都要保證事務的執行,
關于鎖和并發的問題放在下一章講 [鎖與并發](./資料庫概論 (八))
日志系統
日志檔案是用來記錄事務對資料庫的更新操作的檔案,日志往往以記錄為最小單位,或者以資料庫定義的資料塊為最小單位,
以記錄為單位的日志檔案的內容
- 各個事務的開始標記(BEGIN TRANSACTION)
- 各個事務的結束標記(COMMIT或ROLLBACK)
- 各個事務的所有更新操作
- 事務標識(標明是哪個事務)
- 操作型別(插入、洗掉或修改)
- 操作物件(記錄內部標識)
- 更新前資料的舊值(對插入操作而言,此項為空值)
- 更新后資料的新值(對洗掉操作而言, 此項為空值)
重點是為了記錄:哪個事務改變了哪個資料塊,
登記日志檔案的基本原則
- 登記的次序嚴格按照事務執行的時間次序登記
- 必須先寫日志檔案,再寫資料庫
并不是所有的操作都要寫日志檔案,只有在要把資料寫到資料庫中的時候才需要先寫日志檔案,再寫資料庫
因為可以通過日志檔案恢復UNDO失敗的資料庫操作,如果先寫資料庫那么如果出現了錯誤就沒有機會恢復剛剛的修改了,
恢復策略
事務運行程序中發生了故障
由恢復子系統利用日志檔案撤銷剛剛發生的對資料庫的修改,此處的恢復操作是對用戶透明的,用戶不需要干預此處的修復,
- 從日志檔案的末尾開始反向掃描日志檔案,找到故障事務的資料庫修改操作
- 執行修改操作的逆操作
- 繼續反向掃描,遇到修改操作則執行2,直到抵達故障事務的開始陳述句,
系統故障導致的資料庫狀態不一致
造成不一致的原因
- 未完成的事務的資料已經寫入到資料庫中
- 已經提交的事務對資料庫的修改還在緩沖區中,還沒有執行修改
恢復的方法
- Undo 針對未完成的,已經修改的操作
- 反向掃描日志檔案,對修改資料庫的操作執行逆操作
- 將更新前的值寫入到資料庫,覆寫資料
- Redo 針對緩沖區中的操作
- 正向掃描日志檔案,找到每一個要執行資料庫修改的操作
- 將資料重新寫入資料庫
介質故障
首先要轉入最新的,正常的資料庫備份副本,使之恢復到最近的正常狀態,
- 對于靜態存盤的資料庫副本,裝入之后就已經處于一致性狀態,
- 對于動態存盤的資料庫副本,還要裝入轉儲時刻的日志檔案副本,使用Undo和Redo機制恢復到一致性狀態,
然后對于備份之后的資料,我們要通過存盤的日志檔案來恢復,重做所有已經完成的事務,
- 掃描日志檔案,找出故障發生時已經提交的事務的標志,然后將其記入Redo佇列,等待Redo
- 然后正向掃描日志檔案,對重做佇列中的所有事務進行重做,然后寫入資料庫
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/248959.html
標籤:其他
上一篇:資料庫概論 (四)完整性
下一篇:資料庫概論 (八)并發處理
