目錄sql
1、數據庫恢復概述數據庫
1.1故障分類安全
1.1.2系統故障spa
1.1.3介質故障操作系統
2、基於日誌的恢復技術code
2.1日誌對象
2.1.1日誌記錄的格式blog
DBMS的子恢復系統必須確保故障發生後可以把數據庫恢復到某種一致狀態,最大限度地下降損失,並將崩潰後的數據庫不能使用的時間減少到最小
某個事務在運行過程當中因爲種種緣由未能運行到正常終止而夭折
兩種錯誤致使事務執行失敗
因爲某種緣由形成整個系統的正常運行忽然中止,導致全部正在運行的事務都以非正常方式終止
產生緣由
存儲數據庫的存儲設備故障
產生緣由
在系統正常運行時創建冗餘數據,保證有足夠的信息可用於故障恢復。故障發生後採起措施,將數據庫內容恢復到某個一致性狀態,保證事務原子性和持久性
數據庫系統主要經過登記日誌和數據轉儲創建冗餘數據
利用冗餘數據進行故障恢復考慮因素
日誌是日誌記錄的序列,記錄了數據庫中全部的更新活動
一條更新日誌記錄了一個事務對數據庫的一次 write操做,包括
<Ti,start> --事務Ti開始 <Ti,Xj,V1,V2> --事務Ti對 Xj的一次更新,其中 V1是舊值,V2是新值。對於插入,V1爲空;對於刪除,V2爲空 <Ti,commit> --事務Ti正常提交 <Ti,abort> --事務Ti異常終止
日誌記錄必須嚴格按併發事務執行的時間次序登記
必須先記日誌,後寫數據庫
redo(Ti) 根據日誌記錄,按登記日誌的次序,將事務 Ti每次更新的數據對象的新值用 write操做從新寫到數據庫(不是從新執行事務 Ti)
undo(Ti) 根據日誌記錄,按登記日誌的相反次序,將事務 Ti每次更新的數據對象的舊值用 write操做寫回數據庫
redo和 undo都是冪等的,執行屢次等價於執行一次
延遲更新將事務對數據庫的更新推遲到事務提交以後
遵循規則
事務 Ti發生故障時,Ti未到達提交點,所以Ti的更新操做都登記在日誌中,並未輸出到數據庫
當事務 Ti發生故障時,只需清除日誌中事務 Ti的日誌記錄,而無須對數據庫自己作進一步處理。若是故障不是事務Ti自己的邏輯錯誤,則事務Ti能夠在稍後從新啓動
一、正向掃描日誌文件,創建兩個事務列表。一個是已提交事務列表,包含全部具備日誌記錄 <Ti,commit>的事務 Ti;另外一個是未提交事務列表,包含全部具備日誌記錄 <Tj,start>但不具備日誌記錄 <Tj,commit>的事務Tj
二、對已提交事務列表的每一個事務 Ti執行 redo(Ti):正向掃描日誌文件,對於每一個形如 <Ti,Xj,V1,V2>的日誌記錄,若是 Ti在已提交事務列表中,則將 Xj=V2寫到數據庫中
即時更新技術容許事務在活躍狀態時就將更新輸出到數據庫當中
處於活動狀態的事務直接在數據庫上實施的更新稱爲非提交更新
遵循規則
事務 Ti發生故障時,它可能已經將某些更新輸出到數據庫,所以必須執行 undo(Ti)
反向掃描日誌文件直到遇到 <Ti,start>,對於每一個形如 <Ti,Xj,V1,V2>的日誌記錄,將 Xj=V1寫到數據庫當中
一、正向掃描日誌文件,創建兩個事務列表。一個是已提交事務列表,包含全部具備日誌記錄 <Ti,commit>的事務 Ti;另外一個是未提交事務列表,包含全部具備日誌記錄 <Tj,start>但不具備日誌記錄 <Tj,commit>的事務Tj
二、對未提交事務列表的每一個事務 Ti執行 undo(Ti):反向掃描日誌文件直到遇到未提交事務列表每一個事務 Tk的 <Tk,commit>,對於每一個形如 <Ti,Xj,V1,V2>的日誌記錄,若是 Ti在未提交事務列表中,則將 Xj=V1寫到數據庫中
三、對已提交事務列表的每一個事務 Ti執行 redo(Ti):正向掃描日誌文件,對於每一個形如 <Ti,Xj,V1,V2>的日誌記錄,若是 Ti在已提交事務列表中,則將 Xj=V2寫到數據庫中
提升系統故障恢復效率的基本方法是使用檢查點技術
假設系統在時刻 Tc設立最後一個檢查點,在時刻 Tf發生系統故障,如圖能夠把事務分爲五類
當系統故障發生時,首先要從新啓動系統。系統重啓後,恢復子系統自動執行如下步驟
將整個或部分數據庫複製到磁帶或另外一個磁盤上,產生數據庫後備副本
後備副本能夠脫機保存,供介質故障恢復時使用
從轉儲時是否容許事務運行角度考慮
靜態轉儲是在系統中無運行事務時進行的轉儲;必定獲得一個一致的副本,但下降了數據庫的併發性
動態轉儲容許轉儲操做與用戶事務併發執行,轉儲期間容許事務對數據庫進行存取和更新;不能保證副本中數據的一致性
從轉儲時是轉儲整個數據庫仍是部分數據庫角度考慮
海量轉儲製做數據庫的完整副本
增量轉儲只複製上此轉儲後更新過的數據,造成數據庫的增量副本,增量副本不能單獨使用
恢復時,必須使用最後一個完整副本和以後的全部增量副本才能將數據庫恢復到一致狀態
當數據庫被破壞時,須要用轉儲的後備副本和日誌進行恢復,這裏只考慮海量轉儲