時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
日志是日志記錄的一個(gè)序列。在多事務(wù)的數(shù)據(jù)庫(kù)系統(tǒng)中,每個(gè)事務(wù)有若干個(gè)操作步驟。每個(gè)日志記錄記載有關(guān)某個(gè)事務(wù)已做的某些情況。幾個(gè)事務(wù)的行為可以是"交錯(cuò)的",因此可能是一個(gè)事務(wù)的某個(gè)步驟被執(zhí)行,并且其效果被記錄到日志中,接著執(zhí)行另外一個(gè)事務(wù)的某個(gè)步驟并記入日志,接著可能接著做第一事務(wù)的下一個(gè)步驟,也可能執(zhí)行另外一個(gè)事務(wù)的某個(gè)步驟。依次類推。事務(wù)的交錯(cuò)執(zhí)行使日志更復(fù)雜,因?yàn)閮H在事務(wù)結(jié)束后記載事務(wù)的全過(guò)程是不夠的。
如果系統(tǒng)崩潰,恢復(fù)管理器就被激活,檢查日志以重建數(shù)據(jù)庫(kù)的一致性狀態(tài)。恢復(fù)時(shí),有些事務(wù)的工作將會(huì)重做,它們寫(xiě)到數(shù)據(jù)庫(kù)的新值會(huì)重寫(xiě)一次。而另外一些事務(wù)的工作將被撤消,數(shù)據(jù)庫(kù)被恢復(fù),將仿佛這些事務(wù)從來(lái)沒(méi)執(zhí)行過(guò)一樣。
Undo日志是日志類型的一種,這類日志僅僅進(jìn)行第二類修復(fù)。對(duì)于要被撤消的事務(wù),因?yàn)椴荒芸隙ㄋ鼘?duì)數(shù)據(jù)庫(kù)的修改是否已經(jīng)寫(xiě)到磁盤(pán)中,所以對(duì)于該事務(wù)的所有更新都將被撤消,數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)發(fā)生以前的狀態(tài)。
1.日志記錄
日志只允許以附加的方式寫(xiě)入數(shù)據(jù)。日志塊最初在主存中創(chuàng)建,像數(shù)據(jù)塊一樣也由緩沖區(qū)管理,在確當(dāng)?shù)臅r(shí)刻,日志塊會(huì)從緩沖區(qū)寫(xiě)入到磁盤(pán)。
關(guān)于undo記錄形式有四種:
1) : 這一記錄表示事務(wù)T開(kāi)始
2) : 事務(wù)T已經(jīng)完成。
3) : 事務(wù)T不能成功執(zhí)行。
4) : 事務(wù)T改變了數(shù)據(jù)庫(kù)元素X的值,元素X原來(lái)的值為v。
2.undo日志規(guī)則
要想讓undo日志能使我們從系統(tǒng)故障中恢復(fù),事務(wù)必須遵循兩條規(guī)則。
規(guī)則1)如果事務(wù)T改變了數(shù)據(jù)庫(kù)元素X,那么形如的日志記錄必須在X的新值寫(xiě)到磁盤(pán)前寫(xiě)到磁盤(pán)
規(guī)則 2)如果事務(wù)提交,則其COMMIT日志記錄必須在事務(wù)改變的所有數(shù)據(jù)庫(kù)元素已寫(xiě)到磁盤(pán)后再寫(xiě)到磁盤(pán),但應(yīng)盡快。
簡(jiǎn)單概括,undo日志系統(tǒng)順序如下:
1) 指明所改變數(shù)據(jù)庫(kù)元素的日志記錄
2) 改變的數(shù)據(jù)庫(kù)元素自身
3) COMMIT日志記錄。
3.應(yīng)用
對(duì)于前面所舉的例子(A轉(zhuǎn)帳50元給B帳號(hào)),如果使用了undo日志系統(tǒng),則相關(guān)的工作流程如表2如下。
我們可以看到FLUSH LOG這個(gè)命令。該命令的用于強(qiáng)制將還沒(méi)有刷盤(pán)日志記錄寫(xiě)到磁盤(pán)上。對(duì)于步驟8執(zhí)行之前,三個(gè)undo記錄(,,)是存儲(chǔ)在緩沖區(qū)中的(這樣描述是為將問(wèn)題簡(jiǎn)單化),執(zhí)行步驟8之后,三條undo記錄便寫(xiě)入了磁盤(pán)日志文件。在步驟12再次執(zhí)行FLUSH LOG命令時(shí),只將未刷盤(pán)的日志記錄寫(xiě)入磁盤(pán)。
#p#副標(biāo)題#e#
步驟9、10,在前面已經(jīng)描述過(guò),是將數(shù)據(jù)庫(kù)元素的修改從緩沖區(qū)寫(xiě)入到磁盤(pán)文件,因?yàn)閃RITE操作僅僅是將修改反應(yīng)到緩沖區(qū)中(這樣描述也是為了將問(wèn)題簡(jiǎn)單化)。
關(guān)注步驟8,執(zhí)行完步驟8之后,將滿足undo的規(guī)則1(如果事務(wù)T改變了數(shù)據(jù)庫(kù)元素X,那么形如的日志記錄必須在X的新值寫(xiě)到磁盤(pán)前寫(xiě)到磁盤(pán))。在我們真正將數(shù)據(jù)庫(kù)元素A與B的修改反應(yīng)到磁盤(pán)前,我們已經(jīng)將它們對(duì)應(yīng)的與寫(xiě)入到磁盤(pán)日志文件。
關(guān)注步驟11與步驟12,執(zhí)行它們將滿足undo的規(guī)則2(如果事務(wù)提交,則其COMMIT日志記錄必須在事務(wù)改變的所有數(shù)據(jù)庫(kù)元素已寫(xiě)到磁盤(pán)后再寫(xiě)到磁盤(pán),但應(yīng)盡快)。我們已經(jīng)將數(shù)據(jù)庫(kù)元素A與B的修改反應(yīng)到磁盤(pán)上,接著可以寫(xiě)入來(lái)表示事務(wù)T的成功執(zhí)行,但是該日志記錄還在緩沖區(qū)中,所以我們?cè)诓襟E12執(zhí)行FLUSH LOG進(jìn)行日志刷盤(pán)。
4.使用undo日志進(jìn)行數(shù)據(jù)庫(kù)的恢復(fù)
現(xiàn)在假設(shè)系統(tǒng)故障發(fā)生了。有可能給定事務(wù)的某些數(shù)據(jù)庫(kù)更新已經(jīng)寫(xiě)到磁盤(pán)上,而同一事務(wù)的另外一些更新尚未到達(dá)磁盤(pán)。如果這樣,事務(wù)的執(zhí)行就不是原子的,數(shù)據(jù)庫(kù)狀態(tài)就可能不一致。這時(shí)候,我們就有必要使用日志將數(shù)據(jù)庫(kù)恢復(fù)到一致的狀態(tài)。
恢復(fù)管理的第一個(gè)任務(wù)就是將事務(wù)劃分為已經(jīng)提交事務(wù)和未提交事務(wù)。如果在日志中,根據(jù)undo的規(guī)則2,事務(wù)T所做的全部改變?cè)诖酥耙呀?jīng)寫(xiě)到磁盤(pán)上,因此當(dāng)故障發(fā)生時(shí),該事務(wù)T不可能導(dǎo)致數(shù)據(jù)庫(kù)的不一致?tīng)顟B(tài)。
然而,假設(shè)在日志中,只有記錄,而沒(méi)有與之相匹配的記錄。那么就有可能在崩潰前,事務(wù)的某些修改已經(jīng)反應(yīng)到磁盤(pán)上,而另外一些修改可能未發(fā)生或者還在緩沖區(qū)中。這種情況下,T是一個(gè)未完成的事務(wù),因?yàn)楸仨毐怀废?。也就是說(shuō),T所做的任何修改都必須恢復(fù)為原來(lái)的值。Undo的規(guī)則1使該想法可以成為可能,因?yàn)樵谛薷臄?shù)據(jù)刷盤(pán)之前,日志文件中已經(jīng)保存了修改數(shù)據(jù)的原先值。對(duì)于,只需要將X的值恢復(fù)為v就行了(我們不必檢查數(shù)據(jù)庫(kù)中X現(xiàn)有值是否為v)。
日志中可能有一些未提交的事務(wù),并且甚至可能有一些未提交的事務(wù)修改了X,所以恢復(fù)時(shí)采用從日志文件尾向前掃描。在掃描過(guò)程中記住所有有或記錄的事務(wù)T。同時(shí)在隨后的掃描中,如果它看見(jiàn),則:
1) 如果T的COMMIT記錄已被掃描到,則什么也不做。
2) 否則,將數(shù)據(jù)庫(kù)中元素X的值改為v。在做完這些操作后,為以前未中止且未完成的每個(gè)事務(wù)T寫(xiě)入一個(gè)日志記錄,然后刷新日志。
對(duì)于表2,作如下分析:
1)崩潰在第12步后發(fā)生。因?yàn)槿罩居涗浺呀?jīng)寫(xiě)入日志文件。當(dāng)恢復(fù)時(shí),不需要處理T事務(wù)。
2)崩潰發(fā)生在11步和12步之間。日志中記錄了三條記錄:、以及。當(dāng)恢復(fù)管理進(jìn)行向后掃描時(shí),首先遇到記錄,于是它將B在磁盤(pán)上的值存為500。接著它遇到記錄,于是它將A在磁盤(pán)上的值存為1000。最后記錄被寫(xiě)到日志中且日志被刷新。
3)崩潰發(fā)生在第8步和第11步之間。情況2一樣。
4)崩潰發(fā)生在第8步之前。日志系統(tǒng)中只有一條記錄:。記錄被寫(xiě)到日志中且日志被刷新。(實(shí)際上,在實(shí)際系統(tǒng)中,可能其他的事務(wù)執(zhí)行FLUSH LOG操作,而將事務(wù)T的日志記錄寫(xiě)入磁盤(pán)中,如果是這樣的話,日志中可能已經(jīng)寫(xiě)入和,對(duì)于這種情況,執(zhí)行情況2的恢復(fù)就行。實(shí)際上這些細(xì)節(jié)不影響undo的恢復(fù)效用,為了簡(jiǎn)單起見(jiàn),忽視這些情況)。
5.靜態(tài)檢查點(diǎn)
正如我們所看到的那樣,恢復(fù)時(shí)需要檢查整個(gè)日志。當(dāng)采用undo類型的日志時(shí),一旦日志記錄被寫(xiě)入日志文件,事務(wù)T的日志記錄就可以忽視了。但是此時(shí)事務(wù)T卻不能截?cái)嗳罩?,因?yàn)槭聞?wù)是交替執(zhí)行的,如果這時(shí)將日志截?cái)?,可能丟失活動(dòng)著的事務(wù)的日志記錄
解決該問(wèn)題的方法是周期性地對(duì)日志做檢查點(diǎn)。步驟如下:
1)停止接受新的事務(wù)
2)等待所有當(dāng)前的活動(dòng)事務(wù)提交或終止,并且在日志文件中寫(xiě)COMMIT或ABORT記錄。
3)將日志刷新到磁盤(pán)
4)寫(xiě)入日志記錄,并再次刷新記錄。
5)重新開(kāi)始接受新事務(wù)。
當(dāng)恢復(fù)事,掃描到日志時(shí),就不需要繼續(xù)掃描日志記錄了。
例如:假設(shè)日志開(kāi)始時(shí)是這樣的:
這時(shí)候,我們做一個(gè)檢查點(diǎn)。等待事務(wù)T1和事務(wù)T2都完成,才在日志文件中寫(xiě)記錄。檢查點(diǎn)做完后,可以接受新的事務(wù),這里為事務(wù)T3,T3執(zhí)行了一些操作,此時(shí)系統(tǒng)崩潰了。
恢復(fù)時(shí),從文件尾部開(kāi)始掃描,因?yàn)門(mén)3是未完成事務(wù),則將磁盤(pán)上F的值存為前值30、磁盤(pán)上E的值存為前值25。當(dāng)掃描到日志記錄時(shí),我們知道沒(méi)有必要檢查以前的日志記錄了,并且數(shù)據(jù)庫(kù)狀態(tài)的恢復(fù)已經(jīng)完成。
關(guān)鍵詞標(biāo)簽:數(shù)據(jù)庫(kù)日志問(wèn)題
相關(guān)閱讀
熱門(mén)文章
Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法
oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例
誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件
為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法