大家都知道informix是需要日志的,但各日志都做什么用,各有什么意義等等,我們在下面做一個探討:
首先需要說明的是informix的日志有兩種:一種是物理日志,用來存放數(shù)據(jù)的前映象;另一種是邏輯日志,用來存放所有事物的操作過程。
在初始化的配置中,物理日志和邏輯日志的不是存放在根的磁盤空間的。默認(rèn)的大小物理日志2M,邏輯日志6個,每個日志文件2M。但在實際的生產(chǎn)環(huán)境中,這兩個參數(shù)一般是需要調(diào)整的。
從informix的本身的建議來說,要求邏輯日志的大小一般是要求一天的業(yè)務(wù)量,邏輯日志滾一圈,物理日志/邏輯日志=1/3。但是有的數(shù)據(jù)量很大的業(yè)務(wù)系統(tǒng),這樣做是不可能的,要做適當(dāng)?shù)恼{(diào)整。
物理日志文件的個數(shù)僅為1,邏輯日志文件的個數(shù)最小為3,最大為32767。關(guān)于物理日志和邏輯日志的改變,我們可以使用onparams命令來完成。
C:Informix>onparams --
Usage: onparams -a -d <DBspace> [-s <size>] [-i] |
-d -l <log file number> [-y] |
-p -s <size> [-d <DBspace>] [-y]
-a - Add a logical log file
-i - Insert after current log
-d - Drop a logical log file
-p - Change physical log size and location
-y - Automatically responds "yes" to all prompts
上面是onparams的幫助文件,下面我們首先來改變物理日志的位置和大小:
C:Informix>onparams -p -s 40000 -d phydbs -y
Shutting down, please wait ...
Initializing, please wait ...
Recovering, please wait ...
可以通過onstat –l 中的phybegin來查看物理日志當(dāng)前存在了哪個chunk上。Physize來查看當(dāng)前物理日志文件大大小,單位是頁。在這之前我們創(chuàng)建了phydbs,并指定了他大小。我們在-s后指定物理日志文件的大小,在-d后指定物理日志文件的位置。接著我們來做邏輯日志位置和大小的改變:
C:Informix>onparams -a -d logdbs -s 30000 -i
Logical log successfully added.
然后用onstat –l來查看新加的邏輯日志:
C:Informix>onstat -l
IBM Informix Dynamic Server Version 9.40.TC2E1 -- Quiescent -- Up 00:08:10 -- 25728 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 0 8 8 7 1.14
phybegin physize phypos phyused %used
3:53 10000 12 0 0.00
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-3 0 8 37 14 14 2.6 1.0
Subsystem numrecs Log Space used
OLDRSAM 37 2628
address number flags uniqid begin size used %used
0CB37CA8 1 U-B---- 1 1:763 500 500 100.00
0CB37CE8 2 U-B---- 2 1:1263 500 500 100.00
0CB37D28 3 U-B---- 3 1:1763 500 500 100.00
0CB37D68 4 U-B---- 4 1:2263 500 500 100.00
0CB37DA8 5 U-B---- 5 1:2763 500 284 56.80
0CB37DE8 6 U---C-L 6 1:3263 500 315 63.00
0CED8B98 12 A------ 0 2:37553 7500 0 0.00
0CED8B58 11 A------ 0 2:30053 7500 0 0.00
0CED8B18 10 A------ 0 2:22553 7500 0 0.00
0CED8AD8 9 A------ 0 2:15053 7500 0 0.00
0CED8A98 8 A------ 0 2:7553 7500 0 0.00
0CED8A58 7 A------ 0 2:53 7500 0 0.00
12 active, 12 total
可以發(fā)現(xiàn)新加的邏輯日志狀態(tài)都是A,先做0級備份ontape –s –L 0之后用onstat –l可以發(fā)現(xiàn)所有日志的flag位都變成了F狀態(tài)。然后用onmode –l切換邏輯日志到新加的邏輯日志,用onmode –c強制做檢查點操作。最后用onparams –d –l log_file_num –y來刪除原來的邏輯日志文件。這樣就完成了informix日志的遷移。
在onstat –l中,flag位表示了邏輯日志的狀態(tài),
A表示新加了還不能使用的日志
F表示空閑的可以使用的日志,一般是在0級備份之后才有這樣的狀態(tài)
U表示已經(jīng)使用的邏輯日志
L表示當(dāng)前的日志文件包含一個檢查點
C表示正在使用當(dāng)前的日志文件
B表示已經(jīng)備份的日志文件
一般在新增或刪除日志文件之后都要做0級備份。
在onconfig文件中,LOGFILES指定了IDS邏輯日志的個數(shù),LOGSIZE指定了邏輯日志的大小,PHYSDBS指定了物理日志的位置,PHYSFILE指定了物理日志大小。LTAPEDEV指定了邏輯日志備份的位置,LTAPEBLK指定了每個block塊的大小,LTAPESIZE指定了備份文件的大小。
下面我們討論數(shù)據(jù)庫的日志模式:
無日志
無緩沖日志
緩沖日志
ansi模式
我們可以通過ontape 來改變?nèi)罩镜哪J?/p>
采用無日志的方式時,所有的DML語句都不寫日志,也就是說此時,數(shù)據(jù)庫不支持事物。當(dāng)數(shù)據(jù)庫恢復(fù)系統(tǒng)備份的時候,無日志的數(shù)據(jù)庫不能完全恢復(fù)。因為在備份中只記錄了備份時的狀態(tài),備份后的數(shù)據(jù)庫的變化必須從邏輯日志中恢復(fù),所以這些改變是不可恢復(fù)的。
緩沖日志:所有的DML語句都寫入log buffer,當(dāng)log buffer寫滿的時候,就開始寫入磁盤。這樣就可以大大減少磁盤的I/O,從而提高數(shù)據(jù)庫的性能。但是在系統(tǒng)發(fā)生問題恢復(fù)的時候,緩沖區(qū)內(nèi)的數(shù)據(jù)將丟失。這些數(shù)據(jù)是不可能恢復(fù)的。
無緩沖日志模式:所有的 DML語句在發(fā)生的時候是寫到緩沖里的,但事物commit之后就立刻寫回磁盤,這樣在系統(tǒng)發(fā)生問題就保證了數(shù)據(jù)丟失的最少,但是增加了磁盤的I/O,所以數(shù)據(jù)庫的性能會受到一定的影響。
Ansi模式:此模式和無緩沖日志模式具有相同的日志緩沖處理方法,但是此模式是不可逆的。
另外BLOB日志的處理也是十分特別的,他不需要物理日志,不寫前映象。BLOB頁是直接寫磁盤的,不經(jīng)過共享內(nèi)存的處理。任何BLOB空閑映象的改變都將記錄到邏輯日志中,所有的blob spaces數(shù)據(jù)刷新到硬盤上是隨邏輯日志的的備份而寫下去的。


