資料庫,資料庫學習
登記記錄檔
基本原則
登記的次序嚴格按並行事務執行的時間次序
必須先寫記錄檔,後寫資料庫
寫記錄檔操作:把表示這個修改的日誌記錄
寫到記錄檔
寫資料庫操作:把對資料的修改寫到資料庫中
為什麼要先寫記錄檔 (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處理:重新執行,浪費了大量時間
具有檢查點(checkpoint)的恢複技術
在記錄檔中增加檢查點記錄(checkpoint)
增加重新開始檔案
恢複子系統在登入記錄檔期間動態地維護日誌
檢查點記錄的內容
1. 建立檢查點時刻所有正在執行的事務清單
2. 這些事務最近一個日誌記錄的地址
重新開始檔案(Oracle控制檔案)的內容
記錄各個檢查點記錄在記錄檔中的地址
動態維護記錄檔的方法
周期性地執行如下操作:建立檢查點,儲存資料庫狀態。
具體步驟是:
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
提高恢複效率的技術
檢查點技術
可以提高系統故障的恢複效率
可以在一定程度上提高利用動態轉儲備份進行介質故障恢複的效率
鏡像技術
鏡像技術可以改善介質故障的恢複效率