實現技術
?
- 恢復操作的基本原理:冗余?
- 恢復機制涉及的兩個關鍵問題
- 如何建立冗余數據
- 數據轉儲(backup)
- 登錄日志文件(logging)
- ?如何利用這些冗余數據實施數據庫恢復
?
數據轉儲
?
- 數據轉儲定義:
轉儲是指DBA將整個數據庫復制到其他存儲介質上保存起來的過程,備用的數據稱為后備副本或后援副本
- 如何使用
- 數據庫遭到破壞后可以將后備副本重新裝入
- 重裝后備副本只能將數據庫恢復到轉儲時的狀態
- 轉儲方法
- 靜態轉儲與動態轉儲
- 海量轉儲與增量轉儲
靜態轉儲:
1)定義:在系統中無事務運行時進行的轉儲操作。轉儲開始的時刻數據庫處于一? 致性狀態,而轉儲不允許對數據庫的任何存取、修改活動。靜態轉儲得到的一定是一個數據一致性的副本。
2)優點:實現簡單
3)缺點:降低了數據庫的可用性
轉儲必須等待正運行的用戶事務結束才能進行;新的事務必須等待轉儲結束才能執行
動態轉儲:
???????? ?? 1)定義:轉儲期間允許對數據庫進行存取或修改。轉儲和用戶事務可以并發執行。
???????? ?? 2)優點:不用等待正在運行的用戶事務結束;不會影響新事務的運行。
???????? ?? 3)實現:必須把轉儲期間各事務對數據庫的修改活動登記下來,建立日志文件后備副本加上日志文件就能把數據庫恢復到某一時刻的正確狀態。
海量轉儲:
???????? ?? 1)定義:每次轉儲全部數據庫
???????? ?? 2)特點:從恢復角度,使用海量轉儲得到的后備副本進行恢復更方便一些。
增量轉儲:
???????? ?? 1)定義:每次只轉儲上一次轉儲后更新過的數據
???????? ?? 2)特點:如果數據庫很大,事務處理又十分頻繁,則增量轉儲方式更實用更有效。
?
日志文件
?
1、什么是日志文件
日志文件(log)是用來記錄事務對數據庫的更新操作的文件
2、日志文件的格式
1)以記錄為單位:
日志文件中需要登記的內容包括:
-
- 各個事務的開始標記(BEGIN TRANSACTION)
- 各個事務的結束標記(COMMIT或ROLLBACK)
- 各個事務的所有更新操作
???? 以上均作為日志文件中的一個日志記錄???????????????????
每個日志記錄的內容:
- 事務標識(標明是哪個事務)
- 操作類型(插入、刪除或修改)
- 操作對象(記錄內部標識)
- 更新前數據的舊值(對插入操作而言,此項為空值)
- 更新后數據的新值(對刪除操作而言, 此項為空值)
?
2)以數據塊為單位
日志記錄內容包括:
事務標識(標明是哪個事務)
?被更新的數據塊
3、日志文件的作用
- 進行事務故障恢復
- 進行系統故障恢復
- 協助后備副本進行介質故障恢復
1)事務故障恢復和系統故障恢復必須用日志文件
2)在動態轉儲方式中必須建立日志文件,后備副本和日志文件結合起來才能有效地恢復數據庫
3)靜態轉儲方式中也可以建立日志文件(重新裝入后備副本,然后利用日志文件把已完成的事務進行重做,對未完成事務進行撤銷)
4、登記日志文件:
- 基本原則
- 登記的次序嚴格按并行事務執行的時間次序
- 必須先寫日志文件,后寫數據庫
為什么要先寫日志文件?
1)寫數據庫和寫日志文件是兩個不同的操作,在這兩個操作之間可能發生故障
2)如果先寫了數據庫修改,而在日志文件中沒有登記下這個修改,則以后就無法恢復這個修改了
3)如果先寫日志,但沒有修改數據庫,按日志文件恢復時只不過是多執行一次不必要的UNDO操作,并不會影響數據庫的正確性
?
恢復策略
?
事務故障的恢復
- 事務故障:事務在運行至正常終止點前被終止
- 恢復方法
- 由恢復子系統應利用日志文件撤消(UNDO)此事務已對數據庫進行的修改
- 事務故障的恢復由系統自動完成,對用戶是透明的,不需要用戶干預
- 事務故障的恢復步驟
1. 反向掃描文件日志,查找該事務的更新操作。
2. 對該事務的更新操作執行逆操作。即將日志記錄中“更新前的值” 寫入數據庫。
?
- ?插入操作, “更新前的值”為空,則相當于做刪除操作
- ?刪除操作,“更新后的值”為空,則相當于做插入操作
- ?若是修改操作,則相當于用修改前值代替修改后值
3. 繼續反向掃描日志文件,查找該事務的其他更新操作,并做同樣處理。
4. 如此處理下去,直至讀到此事務的開始標記,事務故障恢復就完成了。
系統故障的恢復
- 系統故障造成數據庫不一致狀態的原因
- 未完成事務對數據庫的更新已寫入數據庫
- 已提交事務對數據庫的更新還留在緩沖區沒來得及寫入數據庫
- 恢復方法
- Undo 故障發生時未完成的事務
- Redo 已完成的事務
- 系統故障的恢復由系統在重新啟動時自動完成,不需要用戶干預
- 系統故障的恢復步驟
1. 正向掃描日志文件
-
-
- 重做(REDO) 隊列: 在故障發生前已經提交的事務
- 這些事務既有BEGIN TRANSACTION記錄,也有COMMIT記錄
- 撤銷 (Undo)隊列: 故障發生時尚未完成的事務
- ?這些事務只有BEGIN TRANSACTION記錄,無相應的COMMIT記錄
- 重做(REDO) 隊列: 在故障發生前已經提交的事務
-
2. 對撤銷(Undo)隊列事務進行撤銷(UNDO)處理
-
-
- 反向掃描日志文件,對每個UNDO事務的更新操作執行逆操作
-
3. 對重做(Redo)隊列事務進行重做(REDO)處理
-
-
- 正向掃描日志文件,對每個REDO事務重新執行登記的操作
-
介質故障的恢復
恢復步驟
重裝數據庫
- 裝入最新的后備副本,使數據庫恢復到最近一次轉儲時的一致性狀態。
- 對于靜態轉儲的數據庫副本,裝入后數據庫即處于一致性狀態
- 對于動態轉儲的數據庫副本,還須同時裝入轉儲時刻的日志文件副本,利用恢復系統故障的方法(即REDO+UNDO),才能將數據庫恢復到一致性狀態。
?裝入有關的日志文件副本,重做已完成的事務。
- 首先掃描日志文件,找出故障發生時已提交的事務的標識,將其記入重做隊列。
- 然后正向掃描日志文件,對重做隊列中的所有事務進行重做處理。
- 介質故障的恢復需要DBA介入
- DBA的工作
- 重裝最近轉儲的數據庫副本和有關的各日志文件副本
- 執行系統提供的恢復命令,具體的恢復操作仍由DBMS完成
檢查點
- 利用日志技術進行數據庫恢復存在兩個問題
- 搜索整個日志將耗費大量的時間
- REDO處理:事務實際上已經執行,又重新執行,浪費了大量時間
- 具有檢查點(checkpoint)的恢復技術
- 在日志文件中增加檢查點記錄(checkpoint)
- 增加重新開始文件,并讓恢復子系統在登錄日志文件期間動態地維護日志
- 檢查點記錄的內容
- 建立檢查點時刻所有正在執行的事務清單
- 這些事務最近一個日志記錄的地址
- 重新開始文件的內容
- 記錄各個檢查點記錄在日志文件中的地址
- 動態維護日志文件的方法
周期性地執行如下操作:建立檢查點,保存數據庫狀態。
具體步驟是:
1.將當前日志緩沖區中的所有日志記錄寫入磁盤的日志文件上
2.在日志文件中寫入一個檢查點記錄
3.將當前數據緩沖區的所有數據記錄寫入磁盤的數據庫中
4.把檢查點記錄在日志文件中的地址寫入一個重新開始文件
?
使用檢查點方法可以改善恢復效率
當事務T在一個檢查點之前提交:
- T對數據庫所做的修改一定都已寫入數據庫
- 寫入時間是在這個檢查點建立之前或在這個檢查點建立之時
- 在進行恢復處理時,沒有必要對事務T執行REDO操作
使用檢查點的恢復步驟
?1.從重新開始文件中找到最后一個檢查點記錄在日志文件中的地址,由該地址在日志文件中找到最后一個檢查點記錄
?2.由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST
- 建立兩個事務隊列
- UNDO-LIST
- REDO-LIST
- 把ACTIVE-LIST暫時放入UNDO-LIST隊列,REDO隊列暫為空
?3.從檢查點開始正向掃描日志文件,直到日志文件結束
- 如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列
- 如有提交的事務Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列
4.對UNDO-LIST中的每個事務執行UNDO操作
? ??????????????? 對REDO-LIST中的每個事務執行REDO操作
?
鏡像
?
為避免硬盤介質出現故障影響數據庫的可用性,許多DBMS提供了數據庫映像(mirror)功能用于數據庫恢復。
將整個數據庫或其中的關鍵數據復制到另一個磁盤上,每當主數據庫更新時,DBMS自動把更新后的數據復制過去,由DBMS自動保證鏡像數據與主數據庫的一致性。一旦出現介質故障,可由鏡像磁盤繼續提供使用,同時DBMS自動利用磁盤數據進行數據庫的恢復,不需要關閉系統和重裝數據庫副本。
在沒有出現故障時,數據庫鏡像還可以用于并發操作,即當一個用戶對數據庫加排它鎖修改數據時,其他用戶可以讀鏡像數據庫上的數據,而不必等待該用戶釋放鎖。
由于數據庫鏡像是通過復制數據實現的,頻繁地賦值數據自然會降低系統運行效率。因此在實際應用中用戶往往只選擇對關鍵數據和日志文件進行鏡像。
?
?
?
小結:
?
- 如果數據庫只包含成功事務提交的結果,就說數據庫處于一致性狀態。保證數據一致性是對數據庫的最基本的要求。
- 事務是數據庫的邏輯工作單位
- DBMS保證系統中一切事務的原子性、一致性、隔離性和持續性
- DBMS必須對事務故障、系統故障和介質故障進行恢復
- 恢復中最經常使用的技術:數據庫轉儲和登記日志文件
- 恢復的基本原理:利用存儲在后備副本、日志文件和數據庫鏡像中的冗余數據來重建數據庫
常用恢復技術
?
事務故障的恢復
- UNDO
系統故障的恢復
- UNDO + REDO
介質故障的恢復
- 重裝備份并恢復到一致性狀態 + REDO
?
提高恢復效率的技術
檢查點技術
- 可以提高系統故障的恢復效率??
- 可以在一定程度上提高利用動態轉儲備份進行介質故障恢復的效率
鏡像技術
- 鏡像技術可以改善介質故障的恢復效率
?
?