informix数据库中物理日志和逻辑日志两种非常重要的磁盘构件。

1.物理日志

物理日志(physicallog)由一片连续的磁盘空间。其主要目的是为系统进行快速恢复提供原始数据映像。物理日志以页为单位进行分配和释放,它所存储的内容被称为beforep_w_picpaths(顾名思义,数据原来的面貌即修改前数据映像)。当共享内存中的某个页要被修改之前(第一次被修改),系统先将其修改前数据映像(beforep_w_picpaths)放到物理日志中保存起来。这样,在用户的整个操作完全成功以前,他所修改的所有数据页的修改前映像都被保存着,一旦出现问题,系统可以根据物理日志中的beforep_w_picpaths进行快速恢复。需要注意的是,只在数据页第一次被修改以前其before p_w_picpath才会被保存,在beforep_w_picpath被写入以后和其被释放之前的这一段过程中,所有对该页进行的修改都不再写beforep_w_picpath了。当用户写该页这个操作对应的逻辑日志被释放时,其before p_w_picpath也就可以释放了。

2.逻辑日志
逻辑日志(logicallogs)是由若干块独立的磁盘空间构成,每一块都是连续的磁盘空间。一个Informix DynamicServer系统的逻辑日志块数至少要有三块,最大数据可以由管理员配置(不能超过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 这是一个百分比,当已经使用日志量达到这个总日志量的这个百分比时,就报告长事务。开始回滚,期间别的操作还可以进行(写入日志),但当达到另一个水准线时LTXEHWMinformix会停止其它进程的操作,用所有精力进行回滚。(当达到这个水平时,如果再接受别的进程写入日志,有可能不能完成回滚就已经填满所有日志。回滚也是要写入大量日志的!)

上面就是长事务的原因。所以进行比较大的事务操作时,可以暂时切换到无日志状态。如果不能即时关闭日志记录,可以把日志文件大小加大,都有可能解决上面的问题。另外还有虽的方法,我还要去查看

注意:长日志是指发生在一个日志文件不能备份的情况下,所以增加日志文件个数并不管用,只有适当增加每个日志文件大小