informix日志分為邏輯日志和物理日志
命令 Onstat -l 可以看到如下結果:
[seal@HBAPQ151 db]$ onstat -l | more
IBM Informix Dynamic Server Version 10.00.UC9 -- On-Line -- Up 325 days 13:47:33 -- 725956 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-2 0 2048 1400465 20291 69.02
phybegin physize phypos phyused %used
2:53 4950000 1420965 0 0.00
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-3 0 2048 6458617 1407655 36782 4.6 38.3
Subsystem numrecs Log Space used
OLDRSAM 6458617 2798583036
address number flags uniqid begin size used %used
3d10c2b8 4 U-B---- 103 3:53 100000 2410 2.41
3d10c300 5 U-B---- 104 3:100053 100000 2192 2.19
3d10c348 6 U-B---- 105 3:200053 100000 1923 1.92
3d10c390 7 U-B---- 106 3:300053 100000 2525 2.52
3d10c3d8 8 U-B---- 107 3:400053 100000 2703 2.70
3d10c420 9 U-B---- 108 3:500053 100000 3422 3.42
物理日志記錄數據庫物理變化,即變化的數據信息,而邏輯設備記錄邏輯的變化,比如insert, update等動作,但不是記錄具體數據,那個由物理日志完成。
informix邏輯日志一般有多個。建立多個日志的原因我想是考慮到效率。當多個進程需要記錄日志時,可以同時向多個日志文件中寫。另外邏輯日志有Buffer的概念,對數據庫的操作會先寫buffer,buffer滿了才會寫入邏輯日志。所以Buffer不能太大也不能太小。
inofrmix當邏輯日志文件寫滿后,將邏輯日志進行備份,然后再把這個邏輯日志文件設為可用。這樣就可以循環使用了。U-B---- 中的B就表示have backuped。邏輯日志備份到哪里呢?
/db/informix/etc/onconfig.std 中有一個 LTAPEDEV=/dev/null 這里我們設置為不備份。邏輯日志的大小和個數等參數也在onconfig.std 里面配置
長事務
先說一下引起長事務的原因,一個邏輯日志文件中包括一個沒有結束的事務時,這個日志文件是不能被備份的。如果一個事務特別長,那么就有可能把所有日志文件都寫滿。如果所有日志被寫滿是很麻煩的。informix會控制當日志寫入量達到一定程度時,就報告這個事務為長事務,然后進行回滾,以防止日志被寫滿。
這兒就有兩個高水位線的概念,在onconfig文件中HTXHWM 這是一個百分比,當已經使用日志量達到這個總日志量的這個百分比時,就報告長事務。開始回滾,期間別的操作還可以進行(寫入日志),但當達到另一個水准線時LTXEHWM informix會停止其它進程的操作,用所有精力進行回滾。(當達到這個水平時,如果再接受別的進程寫入日志,有可能不能完成回滾就已經填滿所有日志。回滾也是要寫入大量日志的!)
上面就是長事務的原因。所以進行比較大的事務操作時,可以暫時切換到無日志狀態。如果不能即時關閉日志記錄,可以把日志文件大小加大,都有可能解決上面的問題。另
注意:長日志是指發生在一個日志文件不能備份的情況下,所以增加日志文件個數並不管用,只有適當增加每個日志文件大小
我們可以通過ontape 來改變日志的模式
采用無日志的方式時,所有的DML語句都不寫日志,也就是說此時,數據庫不支持事物。當數據庫恢復系統備份的時候,無日志的數據庫不能完全恢復。因為在備份中只記錄了備份時的狀態,備份后的數據庫的變化必須從邏輯日志中恢復,所以這些改變是不可恢復的。
緩沖日志:所有的DML語句都寫入log buffer,當log buffer寫滿的時候,就開始寫入磁盤。這樣就可以大大減少磁盤的I/O,從而提高數據庫的性能。但是在系統發生問題恢復的時候,緩沖區內的數據將丟失。這些數據是不可能恢復的。
無緩沖日志模式:所有的 DML語句在發生的時候是寫到緩沖里的,但事物commit之后就立刻寫回磁盤,這樣在系統發生問題就保證了數據丟失的最少,但是增加了磁盤的I/O,所以數據庫的性能會受到一定的影響。
Ansi模式:此模式和無緩沖日志模式具有相同的日志緩沖處理方法,但是此模式是不可逆的。
另外BLOB日志的處理也是十分特別的,他不需要物理日志,不寫前映象。BLOB頁是直接寫磁盤的,不經過共享內存的處理。任何BLOB空閑映象的改變都將記錄到邏輯日志中,所有的blob spaces數據刷新到硬盤上是隨邏輯日志的的備份而寫下去的。
不知道說清楚了沒有