日志(" />
時間:2022-12-29 10:30:01 | 來源:信息時代
時間:2022-12-29 10:30:01 來源:信息時代
基于日志的恢復(fù) : 基于日志對故障進行恢復(fù)的機制和過程。在發(fā)生系統(tǒng)故障的時候,需要根據(jù)日志信息,將那些尚沒有提交的事務(wù)對數(shù)據(jù)庫的影響進行清除,將那些已經(jīng)完成的事務(wù)進行重做。
日志(log)是指數(shù)據(jù)庫事務(wù)對數(shù)據(jù)庫操作歷史的記錄,以便在需要的時候?qū)?shù)據(jù)庫狀態(tài)進行重現(xiàn)。日志是日志記錄的序列,有兩種日志記錄的表示方法:
(1) 以數(shù)據(jù)記錄為單位的日志文件。記錄的內(nèi)容包括: ①事務(wù)開始的標記; ②事務(wù)結(jié)束的標記;③操作記錄,包括事務(wù)標識、操作類型、操作對象ID、更新前的數(shù)據(jù)舊值(稱為前影像before image,BI)、更新后的數(shù)據(jù)新值(稱為后影像after image,AI)等項目。對于插入操作,其BI為空值。
(2) 以數(shù)據(jù)塊為單位的日志文件。記錄的內(nèi)容包括: ①事務(wù)開始的標記; ②事務(wù)結(jié)束的標記; ③操作記錄,包括事務(wù)標識、被更新的數(shù)據(jù)塊的信息等。為了從系統(tǒng)故障或者磁盤故障中恢復(fù)時能夠使用日志,日志必須存放在非易失性存儲器上,而且需要保證這些日志信息是在寫數(shù)據(jù)庫之前已寫入非易失性存儲器的(比如磁盤)。
有了日志文件,恢復(fù)子系統(tǒng)就可以撤銷故障事務(wù)已經(jīng)對數(shù)據(jù)庫進行的修改。具體過程描述如下:
(1)反向掃描日志文件,即從文件的尾部開始掃描日志文件,如果是在事務(wù)結(jié)束標志前遇到的更新操作,肯定是一個故障事務(wù)的操作,就需要進行恢復(fù)。否則,跳過去。
(2)對該操作執(zhí)行撤銷操作(也稱UNDO操作),即用該操作的BI重新寫入數(shù)據(jù)庫。如果是插入操作,相當于執(zhí)行一個刪除操作,如果是刪除操作,相當于執(zhí)行一個插入操作,如果是更新操作,相當于用BI替代當前的值。
(3)繼續(xù)反向掃描過程,查找該事務(wù)的其他更新操作,直到遇到該事務(wù)的開始標志,該事務(wù)恢復(fù)完成。
為了保證數(shù)據(jù)庫是可恢復(fù)的,寫日志文件必須遵循以下先寫日志協(xié)議(write-ahead logging protocol):
(1)先寫日志再寫數(shù)據(jù)庫。由于寫數(shù)據(jù)庫和寫日志是兩個不同的操作,有可能在這兩個操作之間發(fā)生故障。如果先寫數(shù)據(jù)庫再寫日志,那么,在寫完數(shù)據(jù)庫之后寫日志之前發(fā)生的故障,就沒有辦法恢復(fù),因為日志里根本就沒有這個記錄。如果先寫日志再寫數(shù)據(jù)庫,按照日志文件恢復(fù)時只不過是多執(zhí)行一次不必要的UNDO操作,并不會影響到數(shù)據(jù)庫的正確性。
(2) 日志記錄的操作順序要和實際執(zhí)行的操作順序一致。這是因為,不同的執(zhí)行順序,產(chǎn)生的結(jié)果是不一樣的。
先寫日志協(xié)議能夠確保寫入數(shù)據(jù)庫的數(shù)據(jù)一定是提交的事務(wù)的結(jié)果。但是,在實際系統(tǒng)中,為了系統(tǒng)的效率,常常采用延遲寫的技術(shù),也就是將應(yīng)該寫入數(shù)據(jù)庫的數(shù)據(jù)暫存在緩沖區(qū)中,在適當?shù)臅r機再寫到磁盤上去。這樣就有可能在系統(tǒng)癱瘓的時候,數(shù)據(jù)庫丟失了某些已經(jīng)提交的事務(wù)的執(zhí)行結(jié)果。為此,在利用日志進行恢復(fù)時,恢復(fù)子系統(tǒng)需要掃描日志文件,確定哪些事務(wù)需要重做,哪些事務(wù)需要撤銷。如果日志文件較大,這樣的掃描將消耗大量的時間。更為嚴重的是,如果日志較大(意味著經(jīng)歷的時間較長),很多重做操作(也稱REDO操作)其實是不需要做的,因為它們實際上已經(jīng)將更新結(jié)果寫到數(shù)據(jù)庫中了。為了解決這個問題,提出了檢查點技術(shù)(checkpoint)。檢查點就是一個時刻,恢復(fù)子系統(tǒng)在這個時刻強制地刷新數(shù)據(jù)緩沖區(qū)和日志緩沖區(qū)。這樣,當一個事務(wù)是在檢查點之前提交的,那么它對數(shù)據(jù)庫的修改一定已經(jīng)寫回數(shù)據(jù)庫了。這樣,在進行系統(tǒng)故障恢復(fù)或者介質(zhì)故障恢復(fù)的時候就沒有必要做REDO操作了,這大大改善了恢復(fù)的效率。
具體技術(shù)描述如下:
(1)在原來的日志文件中增加一個新的記錄類型—檢查點記錄,另外增加一個“重新開始文件”。檢查點記錄記載了建立檢查點時刻全部活躍事務(wù)的清單,包括事務(wù)的標識和該事務(wù)最近一個日志記錄的地址。重新開始文件用來記錄各個檢查點記錄在日志文件中的地址。
(2)恢復(fù)子系統(tǒng)根據(jù)預(yù)先設(shè)定的原則(例如,每一小時或者日志文件寫滿一半的時候)設(shè)立檢查點。執(zhí)行以下操作: ①刷新日志緩沖區(qū); ②在日志文件中寫檢查點記錄; ③刷新數(shù)據(jù)緩沖區(qū); ④寫重新開始文件,記錄檢查點記錄在日志文件中的位置。
(3)恢復(fù)子系統(tǒng)根據(jù)不同情況采用不同的恢復(fù)策略: ①在檢查點之前提交的事務(wù)。由于這些事務(wù)對數(shù)據(jù)庫的修改已經(jīng)被檢查點強制寫回到數(shù)據(jù)庫中去了,所以不必執(zhí)行REDO操作。②在檢查點之后故障之前提交的事務(wù)。它們對數(shù)據(jù)庫所做的修改可能還在緩沖區(qū)中,所以要執(zhí)行REDO。③在故障時還沒有完成的事務(wù),應(yīng)執(zhí)行UNDO操作。
恢復(fù)子系統(tǒng)首先從重新開始文件中找到最后一個檢查點記錄地址,由該地址在日志文件中找到檢查點記錄。其次,由該檢查點記錄得到檢查點建立時刻所有的活躍事務(wù)的清單(ACTIVE-LIST)。然后,從檢查點開始正向掃描日志文件,如果有新開始的事務(wù),就將該事務(wù)的標識也放進ACTIVE-LIST。如果有提交的事務(wù),就將這個事務(wù)的標識從ACTIVE-LIST移到另一個REDO-LIST隊列,直到遇到日志文件末尾。這個ACTIVE-LIST就是UNDO-LIST。最后,對REDO-LIST中的每個事務(wù)執(zhí)行REDO操作,對UNDO-LIST中的每一個事務(wù)執(zhí)行UNDO操作。
由此可見,檢查點技術(shù)通過強制刷新數(shù)據(jù)緩沖區(qū)和日志緩沖區(qū),建立一個“準一致”的數(shù)據(jù)庫狀態(tài),避免了從日志文件開始進行恢復(fù)的問題,改善了恢復(fù)的效率。
關(guān)鍵詞:數(shù)據(jù),恢復(fù),日志
微信公眾號
版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。