zoukankan      html  css  js  c++  java
  • informix 日志详解

    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数据刷新到硬盘上是随逻辑日志的的备份而写下去的。

    不知道说清楚了没有


  • 相关阅读:
    C# 管理IIS7(转)
    KeyDown,KeyPress和KeyUp详解(转)
    C#中事件的声明与使用
    在类中使用SERVER
    什么是强类型,强类型集合
    配置sql server 2000以允许远程访问
    如何使textbox只能输入数字和小数点
    在BUTTON中触发GRIDVIEW的方法
    多个GRIDVIEW同时导入到一个EXCEL文件中
    ajax3.5的BUG
  • 原文地址:https://www.cnblogs.com/SuperXJ/p/2340910.html
Copyright © 2011-2022 走看看