IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)Oracle → 數(shù)據(jù)庫(kù)中日志問(wèn)題詳解

數(shù)據(jù)庫(kù)中日志問(wèn)題詳解

時(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)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 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刪除表的幾種方法