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

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

數(shù)據(jù)庫中日志問題詳解

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

  日志是日志記錄的一個序列。在多事務(wù)的數(shù)據(jù)庫系統(tǒng)中,每個事務(wù)有若干個操作步驟。每個日志記錄記載有關(guān)某個事務(wù)已做的某些情況。幾個事務(wù)的行為可以是"交錯的",因此可能是一個事務(wù)的某個步驟被執(zhí)行,并且其效果被記錄到日志中,接著執(zhí)行另外一個事務(wù)的某個步驟并記入日志,接著可能接著做第一事務(wù)的下一個步驟,也可能執(zhí)行另外一個事務(wù)的某個步驟。依次類推。事務(wù)的交錯執(zhí)行使日志更復(fù)雜,因為僅在事務(wù)結(jié)束后記載事務(wù)的全過程是不夠的。

  如果系統(tǒng)崩潰,恢復(fù)管理器就被激活,檢查日志以重建數(shù)據(jù)庫的一致性狀態(tài)。恢復(fù)時,有些事務(wù)的工作將會重做,它們寫到數(shù)據(jù)庫的新值會重寫一次。而另外一些事務(wù)的工作將被撤消,數(shù)據(jù)庫被恢復(fù),將仿佛這些事務(wù)從來沒執(zhí)行過一樣。

  Undo日志是日志類型的一種,這類日志僅僅進(jìn)行第二類修復(fù)。對于要被撤消的事務(wù),因為不能肯定它對數(shù)據(jù)庫的修改是否已經(jīng)寫到磁盤中,所以對于該事務(wù)的所有更新都將被撤消,數(shù)據(jù)庫恢復(fù)到事務(wù)發(fā)生以前的狀態(tài)。

  1.日志記錄

  日志只允許以附加的方式寫入數(shù)據(jù)。日志塊最初在主存中創(chuàng)建,像數(shù)據(jù)塊一樣也由緩沖區(qū)管理,在確當(dāng)?shù)臅r刻,日志塊會從緩沖區(qū)寫入到磁盤。

  關(guān)于undo記錄形式有四種:

  1) : 這一記錄表示事務(wù)T開始

  2) : 事務(wù)T已經(jīng)完成。

  3) : 事務(wù)T不能成功執(zhí)行。

  4) : 事務(wù)T改變了數(shù)據(jù)庫元素X的值,元素X原來的值為v。

  2.undo日志規(guī)則

  要想讓undo日志能使我們從系統(tǒng)故障中恢復(fù),事務(wù)必須遵循兩條規(guī)則。

  規(guī)則1)如果事務(wù)T改變了數(shù)據(jù)庫元素X,那么形如的日志記錄必須在X的新值寫到磁盤前寫到磁盤

  規(guī)則 2)如果事務(wù)提交,則其COMMIT日志記錄必須在事務(wù)改變的所有數(shù)據(jù)庫元素已寫到磁盤后再寫到磁盤,但應(yīng)盡快。

  簡單概括,undo日志系統(tǒng)順序如下:

  1) 指明所改變數(shù)據(jù)庫元素的日志記錄

  2) 改變的數(shù)據(jù)庫元素自身

  3) COMMIT日志記錄。

  3.應(yīng)用

  對于前面所舉的例子(A轉(zhuǎn)帳50元給B帳號),如果使用了undo日志系統(tǒng),則相關(guān)的工作流程如表2如下。

  我們可以看到FLUSH LOG這個命令。該命令的用于強(qiáng)制將還沒有刷盤日志記錄寫到磁盤上。對于步驟8執(zhí)行之前,三個undo記錄(,,)是存儲在緩沖區(qū)中的(這樣描述是為將問題簡單化),執(zhí)行步驟8之后,三條undo記錄便寫入了磁盤日志文件。在步驟12再次執(zhí)行FLUSH LOG命令時,只將未刷盤的日志記錄寫入磁盤。

#p#副標(biāo)題#e#

  步驟9、10,在前面已經(jīng)描述過,是將數(shù)據(jù)庫元素的修改從緩沖區(qū)寫入到磁盤文件,因為WRITE操作僅僅是將修改反應(yīng)到緩沖區(qū)中(這樣描述也是為了將問題簡單化)。

  關(guān)注步驟8,執(zhí)行完步驟8之后,將滿足undo的規(guī)則1(如果事務(wù)T改變了數(shù)據(jù)庫元素X,那么形如的日志記錄必須在X的新值寫到磁盤前寫到磁盤)。在我們真正將數(shù)據(jù)庫元素A與B的修改反應(yīng)到磁盤前,我們已經(jīng)將它們對應(yīng)的與寫入到磁盤日志文件。

  關(guān)注步驟11與步驟12,執(zhí)行它們將滿足undo的規(guī)則2(如果事務(wù)提交,則其COMMIT日志記錄必須在事務(wù)改變的所有數(shù)據(jù)庫元素已寫到磁盤后再寫到磁盤,但應(yīng)盡快)。我們已經(jīng)將數(shù)據(jù)庫元素A與B的修改反應(yīng)到磁盤上,接著可以寫入來表示事務(wù)T的成功執(zhí)行,但是該日志記錄還在緩沖區(qū)中,所以我們在步驟12執(zhí)行FLUSH LOG進(jìn)行日志刷盤。

  4.使用undo日志進(jìn)行數(shù)據(jù)庫的恢復(fù)

  現(xiàn)在假設(shè)系統(tǒng)故障發(fā)生了。有可能給定事務(wù)的某些數(shù)據(jù)庫更新已經(jīng)寫到磁盤上,而同一事務(wù)的另外一些更新尚未到達(dá)磁盤。如果這樣,事務(wù)的執(zhí)行就不是原子的,數(shù)據(jù)庫狀態(tài)就可能不一致。這時候,我們就有必要使用日志將數(shù)據(jù)庫恢復(fù)到一致的狀態(tài)。

  恢復(fù)管理的第一個任務(wù)就是將事務(wù)劃分為已經(jīng)提交事務(wù)和未提交事務(wù)。如果在日志中,根據(jù)undo的規(guī)則2,事務(wù)T所做的全部改變在此之前已經(jīng)寫到磁盤上,因此當(dāng)故障發(fā)生時,該事務(wù)T不可能導(dǎo)致數(shù)據(jù)庫的不一致狀態(tài)。

  然而,假設(shè)在日志中,只有記錄,而沒有與之相匹配的記錄。那么就有可能在崩潰前,事務(wù)的某些修改已經(jīng)反應(yīng)到磁盤上,而另外一些修改可能未發(fā)生或者還在緩沖區(qū)中。這種情況下,T是一個未完成的事務(wù),因為必須被撤消。也就是說,T所做的任何修改都必須恢復(fù)為原來的值。Undo的規(guī)則1使該想法可以成為可能,因為在修改數(shù)據(jù)刷盤之前,日志文件中已經(jīng)保存了修改數(shù)據(jù)的原先值。對于,只需要將X的值恢復(fù)為v就行了(我們不必檢查數(shù)據(jù)庫中X現(xiàn)有值是否為v)。

  日志中可能有一些未提交的事務(wù),并且甚至可能有一些未提交的事務(wù)修改了X,所以恢復(fù)時采用從日志文件尾向前掃描。在掃描過程中記住所有有或記錄的事務(wù)T。同時在隨后的掃描中,如果它看見,則:

  1) 如果T的COMMIT記錄已被掃描到,則什么也不做。

  2) 否則,將數(shù)據(jù)庫中元素X的值改為v。在做完這些操作后,為以前未中止且未完成的每個事務(wù)T寫入一個日志記錄,然后刷新日志。

  對于表2,作如下分析:

  1)崩潰在第12步后發(fā)生。因為日志記錄已經(jīng)寫入日志文件。當(dāng)恢復(fù)時,不需要處理T事務(wù)。

  2)崩潰發(fā)生在11步和12步之間。日志中記錄了三條記錄:、以及。當(dāng)恢復(fù)管理進(jìn)行向后掃描時,首先遇到記錄,于是它將B在磁盤上的值存為500。接著它遇到記錄,于是它將A在磁盤上的值存為1000。最后記錄被寫到日志中且日志被刷新。

  3)崩潰發(fā)生在第8步和第11步之間。情況2一樣。

  4)崩潰發(fā)生在第8步之前。日志系統(tǒng)中只有一條記錄:。記錄被寫到日志中且日志被刷新。(實際上,在實際系統(tǒng)中,可能其他的事務(wù)執(zhí)行FLUSH LOG操作,而將事務(wù)T的日志記錄寫入磁盤中,如果是這樣的話,日志中可能已經(jīng)寫入和,對于這種情況,執(zhí)行情況2的恢復(fù)就行。實際上這些細(xì)節(jié)不影響undo的恢復(fù)效用,為了簡單起見,忽視這些情況)。

  5.靜態(tài)檢查點(diǎn)

  正如我們所看到的那樣,恢復(fù)時需要檢查整個日志。當(dāng)采用undo類型的日志時,一旦日志記錄被寫入日志文件,事務(wù)T的日志記錄就可以忽視了。但是此時事務(wù)T卻不能截斷日志,因為事務(wù)是交替執(zhí)行的,如果這時將日志截斷,可能丟失活動著的事務(wù)的日志記錄

  解決該問題的方法是周期性地對日志做檢查點(diǎn)。步驟如下:

  1)停止接受新的事務(wù)

  2)等待所有當(dāng)前的活動事務(wù)提交或終止,并且在日志文件中寫COMMIT或ABORT記錄。

  3)將日志刷新到磁盤

  4)寫入日志記錄,并再次刷新記錄。

  5)重新開始接受新事務(wù)。

  當(dāng)恢復(fù)事,掃描到日志時,就不需要繼續(xù)掃描日志記錄了。

  例如:假設(shè)日志開始時是這樣的:

  這時候,我們做一個檢查點(diǎn)。等待事務(wù)T1和事務(wù)T2都完成,才在日志文件中寫記錄。檢查點(diǎn)做完后,可以接受新的事務(wù),這里為事務(wù)T3,T3執(zhí)行了一些操作,此時系統(tǒng)崩潰了。

  恢復(fù)時,從文件尾部開始掃描,因為T3是未完成事務(wù),則將磁盤上F的值存為前值30、磁盤上E的值存為前值25。當(dāng)掃描到日志記錄時,我們知道沒有必要檢查以前的日志記錄了,并且數(shù)據(jù)庫狀態(tài)的恢復(fù)已經(jīng)完成。

關(guān)鍵詞標(biāo)簽:數(shù)據(jù)庫日志問題

相關(guān)閱讀

文章評論
發(fā)表評論

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

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法