程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 數據庫-恢復策略與數據庫鏡像

數據庫-恢復策略與數據庫鏡像

編輯:DB2教程

數據庫-恢復策略與數據庫鏡像


登記日志文件

基本原則
登記的次序嚴格按並行事務執行的時間次序
必須先寫日志文件,後寫數據庫
寫日志文件操作:把表示這個修改的日志記錄
寫到日志文件
寫數據庫操作:把對數據的修改寫到數據庫中

為什麼要先寫日志文件 (The Write-Ahead Log)
寫數據庫和寫日志文件是兩個不同的操作
在這兩個操作之間可能發生故障
如果先寫了數據庫修改,而在日志文件中沒有登記下這個修改,則以後就無法恢復這個修改了
如果先寫日志,但沒有修改數據庫,按日志文件恢復時只不過是多執行一次不必要的UNDO操作,並不會影響數據庫的正確性

事務故障的恢復

事務故障:事務在運行至正常終止點前被終止
恢復方法
由恢復子系統應利用日志文件撤消(UNDO)此事務已對數據庫進行的修改
事務故障的恢復由系統自動完成,對用戶是透明的,不需要用戶干預

事務故障的恢復步驟

反向掃描文件日志(即從最後向前掃描日志文件),查找該事務的更新操作。 對該事務的更新操作執行逆操作。即將日志記錄中“更新前的值” 寫入數據庫。
插入操作, “更新前的值”為空,則相當於做刪除操作
刪除操作,“更新後的值”為空,則相當於做插入操作
若是修改操作,則相當於用修改前值代替修改後值 繼續反向掃描日志文件,查找該事務的其他更新操作,並做同樣處理。 如此處理下去,直至讀到此事務的開始標記,事務故障恢復就完成了。

系統故障的恢復

系統故障造成數據庫不一致狀態的原因
未完成事務對數據庫的更新已寫入數據庫
已提交事務對數據庫的更新還留在緩沖區沒來得及寫入數據庫
恢復方法
1. Undo 故障發生時未完成的事務
2. Redo 已完成的事務
系統故障的恢復由系統在重新啟動時自動完成,不需要用戶干預

1.正向掃描日志文件(即從頭掃描日志文件)
重做(REDO) 隊列: 在故障發生前已經提交的事務
這些事務既有BEGIN TRANSACTION記錄,也有COMMIT記錄
撤銷 (Undo)隊列:故障發生時尚未完成的事務
 這些事務只有BEGIN TRANSACTION記錄,無相應的COMMIT記錄
2. 對撤銷(Undo)隊列事務進行撤銷(UNDO)處理
反向掃描日志文件,對每個UNDO事務的更新操作執行逆操作
即將日志記錄中“更新前的值”寫入數據庫 

3. 對重做(Redo)隊列事務進行重做(REDO)處理
正向掃描日志文件,對每個REDO事務重新執行登記的操作
即將日志記錄中“更新後的值”寫入數據庫 

介質故障的恢復

恢復步驟
1. 裝入最新的後備數據庫副本(離故障發生時刻最近的轉儲副本) ,使數據庫恢復到最近一次轉儲時的一致性狀態。
對於靜態轉儲的數據庫副本,裝入後數據庫即處於一致性狀態
對於動態轉儲的數據庫副本,還須同時裝入轉儲時刻的日志文件副本,利用與恢復系統故障的方法(即REDO+UNDO),才能將數據庫恢復到一致性狀態。

裝入有關的日志文件副本(轉儲結束時刻的日志文件副本) ,重做已完成的事務,撤銷未完成的事務。
首先掃描日志文件,找出故障發生時已提交和未完成的事務的標識,分別將其記入重做隊列和撤銷隊列。
然後正向掃描日志文件,對重做隊列中的所有事務進行REDO處理。反向掃描日志文件,對撤銷隊列中的所有事務進行UNDO處理。
這裡寫圖片描述
介質故障的恢復需要DBA介入
DBA的工作
重裝最近轉儲的數據庫副本和有關的各日志文件副本
執行系統提供的恢復命令
具體的恢復操作仍由DBMS完成

兩個問題
搜索整個日志將耗費大量的時間
REDO處理:重新執行,浪費了大量時間
具有檢查點(checkpoint)的恢復技術
在日志文件中增加檢查點記錄(checkpoint)
增加重新開始文件
恢復子系統在登錄日志文件期間動態地維護日志
檢查點記錄的內容
1. 建立檢查點時刻所有正在執行的事務清單
2. 這些事務最近一個日志記錄的地址
重新開始文件(Oracle控制文件)的內容
記錄各個檢查點記錄在日志文件中的地址<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCgoKPGgyIGlkPQ=="動態維護日志文件的方法">動態維護日志文件的方法

周期性地執行如下操作:建立檢查點,保存數據庫狀態。
具體步驟是:
1.將當前日志緩沖區中的所有日志記錄寫入磁盤的日志文件上
2.在日志文件中寫入一個檢查點記錄
3.將當前數據緩沖區的所有數據記錄寫入磁盤的數據庫中
4.把檢查點記錄在日志文件中的地址寫入一個重新開始文件

恢復子系統可以定期或不定期地建立檢查點,保存數據庫狀態
定期
按照預定的一個時間間隔,如每隔一小時建立一個檢查點
不定期
按照某種規則,如日志文件已寫滿一半建立一個檢查點

使用檢查點方法可以改善恢復效率
當事務T在一個檢查點之前提交
Oracle中,事務T對數據庫所做的修改已寫入日志文件,但未必已寫入數據庫
Oracle寫入數據庫的時間是在這個檢查點建立之時!
在進行恢復處理時,沒有必要對事務T執行REDO操作

利用檢查點的恢復策略

T1:在檢查點之前提交
T2:在檢查點之前開始執行,在檢查點之後故障點之前提交
T3:在檢查點之前開始執行,在故障點時還未完成
T4:在檢查點之後開始執行,在故障點之前提交
T5:在檢查點之後開始執行,在故障點時還未完成
恢復策略:
T3和T5在故障發生時還未完成,所以予以撤銷
T2和T4在檢查點之後才提交,它們對數據庫所做的修改在故障發生時可能還在緩沖區中,尚未寫入數據庫,所以要REDO
T1在檢查點之前已提交,所以不必執行REDO操作

<T1 start>
<T1, A, 0, 10>
<T1 commit>
<T2 start>
<T2, B, 0, 10>
<T3 start>                   
<T3, C, 0, 10>
<T3, C, 10, 20>
<checkpoint{T2,T3}>
<T4 start>
<T2 commit>
<T4, A, 10, 20>
<T5 start>
<T4, D, 0, 10>
<T4 commit>

   1.從重新開始文件中(Oracle控制文件)找到最後一個檢查點記錄在日志文件中的地址,由該地址在日志文件中找到最後一個檢查點記錄
2.由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST={T2,T3}
建立兩個事務隊列
UNDO-LIST 
REDO-LIST 
把ACTIVE-LIST暫時放入UNDO-LIST隊列={T2,T3},REDO隊列暫為空。
3.從檢查點開始正向掃描日志文件,直到日志文件結束
如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列={T2,T3,T4,T5}
如有提交的事務Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列={T2,T4}
4.對UNDO-LIST中的每個事務{T3,T5}執行UNDO操作
    對REDO-LIST中的每個事務{T2,T4}執行REDO操作

數據庫鏡像

DBMS自動把整個數據庫或其中的關鍵數據復制到另一個磁盤上
DBMS自動保證鏡像數據與主數據庫的一致性
每當主數據庫更新時,DBMS自動把更新後的數據復制過去

沒有出現故障時
可用於並發操作
一個用戶對數據加排他鎖修改數據,其他用戶可以讀鏡像數據庫上的數據,而不必等待該用戶釋放鎖

頻繁地復制數據自然會降低系統運行效率
在實際應用中用戶往往只選擇對關鍵數據和日志文件鏡像,而不是對整個數據庫進行鏡像

如果數據庫只包含成功事務提交的結果,就說數據庫處於一致性狀態!保證數據一致性是對數據庫的最基本的要求。
事務是數據庫的邏輯工作單位
DBMS保證系統中一切事務的原子性、一致性、隔離性和持久性

DBMS必須對事務故障、系統故障和介質故障進行恢復
恢復中最經常使用的技術:數據庫轉儲和登記日志文件
恢復的基本原理:利用存儲在後備副本、日志文件和數據庫鏡像中的冗余數據來重建數據庫

常用恢復技術
事務故障的恢復
UNDO
系統故障的恢復
UNDO + REDO
介質故障的恢復
重裝備份並恢復到一致性狀態 + REDO

提高恢復效率的技術
檢查點技術
可以提高系統故障的恢復效率
可以在一定程度上提高利用動態轉儲備份進行介質故障恢復的效率
鏡像技術
鏡像技術可以改善介質故障的恢復效率

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved