informix資料庫中物理日誌和邏輯日誌兩種非常重要的磁碟構件

lenx2000發表於2012-06-12

1.物理日誌

    物理日誌(physical log)由一片連續的磁碟空間。其主要目的是為系統進行快速恢復提供原始資料映像。
物理日誌以頁為單位進行分配和釋放,它所儲存的內容被稱為before images(顧名思義,資料原來的面貌即修改前資料映像)。
當共享記憶體中的某個頁要被修改之前(第一次被修改),系統先將其修改前資料映像(before images)放到物理日誌中儲存起來。
這樣,在使用者的整個操作完全成功以前,他所修改的所有資料頁的修改前映像都被儲存著,一旦出現問題,
系統可以根據物理日誌中的before images進行快速恢復。需要注意的是,只在資料頁第一次被修改以前其before image才會被儲存,
在before image被寫入以後和其被釋放之前的這一段過程中,所有對該頁進行的修改都不再寫before image了。當使用者寫該頁這個操作對應的邏輯日誌被釋放時,
其before image也就可以釋放了。


2.邏輯日誌
    邏輯日誌(logical logs)是由若干塊獨立的磁碟空間構成,每一塊都是連續的磁碟空間。一個Informix Dynamic Server系統的邏輯日誌塊數至少要有三塊,
最大資料可以由管理員配置(不能超過32767塊)。
記邏輯日誌的目的是將對系統的每個操作、每個修改都儲存起來,以便系統出現問題的時候可以根據其內容進行重做(REDO)或事務不能繼續進行下去的時候進行回滾(UNDO)。
邏輯日誌記錄的內容主要包括事務的每一步操作機器對系統產生的影響、DDL語句和檢查點(checkpoint)記錄。
3.物理日誌由系統維護,通常無需維護。

4.邏輯日誌的維護。

邏輯日誌的備份方式

先說一下備份級別,也同樣用informix的概念來理解
備份級別分為 0, 1, 2
0:完全備份
1:自上一次完全備份,進行增量
2:自上一次增量進行增量

備份方式有兩種:自動、連續
所謂自動並不是想像中的自動,它執行一次後會結束,這樣就要有指令碼或人工定時去備份邏輯日誌,不然會被填滿。
可以用命令:ontape -a 來切換到自動備份
而連續才是想像中自動的意思,他不會停止,只要日誌滿了就會去備份。通常如果不想去費心思管理邏輯日誌,可以設定為連續。
可以用命令:ontape -c 來切換到連續備份

informix中邏輯日誌的工作流程

    informix邏輯日誌一般有多個。建立多個日誌的原因我想是考慮到效率。當多個程式需要記錄日誌時,可以同時向多個日誌檔案中寫。
    在informix配置檔案中logfiles指定邏輯日誌檔案的個數(最少為3個,最大為X個)。logsize指定每個邏輯日誌檔案的大小。
(總邏輯日誌空間為:logsize*logfiles) 這裡的配置只在informix例項初始化時才起作用,即oninit -i 。
當然在使用過程中如果有需求要改變邏輯日誌的個數或大小不能透過oninit -i 來實現。onparams可以對邏輯日誌檔案進行動態的新增,更改大小,刪除,移動等操作。

buffer中邏輯日誌什麼時候寫入日誌檔案

上面,說到我們會建立多個日誌檔案用來記錄邏輯日誌,但並不是每產生一次操作記錄就向日志檔案中寫,那樣io太多。而是在記錄在buffer中。當達到一定限度時再寫入日誌檔案,
那麼什麼時候buffer會寫入檔案中呢?
1. buffer滿了   用來記錄邏輯日誌的buffer的大小由onconfig檔案中的logbuff決定,當buffer寫滿後會寫入日誌檔案。這兒可以看到設定合適的   
logbuff大小還是對效果有影響的。如果過小,buffer很快被寫滿,就要做一次io, 寫入日誌檔案。這樣會造成過多的IO。
如果過大,常時間buffer中的資料不寫入日誌檔案,如果有意外發生,造成較大的不可恢復。同時點用太多記憶體有可能影響整體效能。

邏輯日誌寫滿了怎麼辦?

  當邏輯日誌寫滿後,資料庫就會被塞住,而不能進行任何操作。所以不能讓邏輯日誌寫滿。那麼就要保證邏輯日誌檔案可以迴圈使用。
下面是一種方案:當某邏輯日誌檔案寫滿後,將邏輯日誌進行備份,然後再把這個日誌檔案裝置為可用。
informix也是這麼做的,系統執行時,可以讓日誌檔案寫滿後進行連續備份,這樣就可以迴圈使用日誌檔案了。
那麼備份到哪呢?在onconfig檔案中,LTAPEDEV指定備份的磁帶,我現在設定成/dev/null 其實是不備份的,但讓informix以為已經備份,
以至系統可以向下正常執行。當然,如果我指定到備份裝置,就可以備份了。
  如果把備份裝置指定到/dev/null ,那麼備份方式將自動為連續備份。
  如果把備份裝置指到了具體的磁帶機,那麼可以用ontape -c來設定備份方式為連續備份

下面一段是關於日誌狀態的說明:
先對下面的一段進行一些說明,number一共到9說明有9個邏輯日誌,size為12500說明生個邏輯日誌檔案大小10M。 used當然是已經使用過了多少。
可以看到大部已經使用完。不用害怕,這是很正常的。可以看到%used為100%的flags為U-B  U雖然說明已經滿了,但B卻說明了已經備份過了,可以進行迴圈使用。
如果當前使用的日誌檔案滿了後,會自動切換到下一個U-B上。
第8個日誌檔案flags為U---C-L  說明這個是當前正在使用的日誌檔案。使用onmode -l可以切換到下一個日誌檔案,切換後再用onstat -l檢視,
可以看到第9個日誌檔案變為U---C狀態,說明已經在使用下一個了,而它的%usered則為0。也驗證了U-B狀態會迴圈使用的說明。
還有一點要注意,即使在當前使用的日誌後面有沒有滿的日誌,informix也不會跳過當前使用的日誌去寫入下面的日誌檔案,
只有當前日誌滿了後才切換到下一個(或用onmode -l強制轉到下一個)

address   number   flags     uniqid    begin        size     used    %used
8352f680  1       U-B----  11544    1061e7      12500    12500   100.00%
8352f69c  2       U-B----  11545    1092bb      12500    12500   100.00%
8352f6b8  3       U-B----  11546    10c38f      12500    12500   100.00%
8352f6d4  4       U-B----  11547    10f463      12500    12500   100.00%
8352f6f0  5       U-B----  11548    112537      12500    12500   100.00%
8352f70c  6       U-B----  11549    11560b      12500    12500   100.00%
8352f728  7       U-B----  11550    6135e6      12500    12500   100.00%
8352f744  8       U---C-L  11551    6166ba      12500    10616    84.93%
8352f760  9       U-B----  11530    61978e      12500    12500   100.00%
邏輯日誌檔案的狀態顯示包括兩個區域:
number:標識單個邏輯日誌檔案的logid。
flags:標明相應邏輯日誌檔案的狀態。flags狀態標誌有七個位置,但僅第一,三,五,七位置
有標誌值。
第一個位置上,可能出現A,F,U三個標誌中的一個;
第三個位置上,標誌B可能出現也可能也可能不出現;
第五個位置上,可能為標誌C也可能為空;
第七個位置上,可能是標誌L也可能為空;

位置    標誌     含義
1       A       Added,新增加的邏輯日誌檔案,僅當建立一個(根dbspace的)0級archive
後才能使用。
1       F       Free,該邏輯日誌檔案空閒並可以使用。
1       U       Used,該邏輯日誌檔案正在使用而未釋放,OnLine恢復時還需要該檔案(回
滾一個事務或找到上一個檢查點記錄)
3       B       Backed-UP,該邏輯日誌檔案已備份。
5       C       Current,該邏輯日誌檔案是當前正在填充的邏輯日誌檔案。
7       L       Last,該邏輯日誌檔案包含有最近一次檢查點記錄,在新的檢查點記錄寫入
另一個日誌檔案之前,該檔案及後面的邏輯日誌檔案不能釋放。


所有狀態標誌的可能組合
狀態標誌       邏輯日誌檔案的狀態
A------       上次0級archive以來新增加的邏輯日誌檔案,暫時不能使用
F------       空閒
U------       正在使用,還沒有備份
U-B----       日誌已備份,恢復時還需要
U-B---L       日誌已備份,包含上次檢查點記錄,恢復時還需要此檔案
U---C--       當前日誌檔案
U---C-L       當前日誌檔案,幷包含上次檢查點記錄


長事務

先說一下引起長事務的原因,一個邏輯日誌檔案中包括一個沒有結束的事務時,這個日誌檔案是不能被備份的。如果一個事務特別長,那麼就有可能把所有日誌檔案都寫滿。
如果所有日誌被寫滿是很麻煩的。informix會控制當日志寫入量達到一定程度時,就報告這個事務為長事務,然後進行回滾,以防止日誌被寫滿。

這兒就有兩個高水位線的概念,在onconfig檔案中HTXHWM  這是一個百分比,當已經使用日誌量達到這個總日誌量的這個百分比時,就報告長事務。開始回滾,
期間別的操作還可以進行(寫入日誌),但當達到另一個水準線時LTXEHWM informix會停止其它程式的操作,用所有精力進行回滾。(當達到這個水平時,
如果再接受別的程式寫入日誌,有可能不能完成回滾就已經填滿所有日誌。回滾也是要寫入大量日誌的!)

上面就是長事務的原因。所以進行比較大的事務操作時,可以暫時切換到無日誌狀態。如果不能即時關閉日誌記錄,可以把日誌檔案大小加大,
都有可能解決上面的問題。另外還有雖的方法,我還要去檢視

注意:長日誌是指發生在一個日誌檔案不能備份的情況下,所以增加日誌檔案個數並不管用,只有適當增加每個日誌檔案大小

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11134849/viewspace-732579/,如需轉載,請註明出處,否則將追究法律責任。

相關文章