分类: DB2/Informix
2007-12-06 09:06:01
逻辑日志的类型
可以用informix的日志类型来理解逻辑日志:无日志, 无buffer日志, 有buffer日志, asii日志
无日志:不记录日志,此时当然也不支持事务(可以在大事务时,临时切换到无日志状态以防止长事务发生。)
无buffer日志:也并不是每个操作都直接写到磁盘,而是每个事务完成后马上写。
buffer日志:一般会在buffer满了后才写到磁盘
assii日志:和无buffer处理相似
各日志间的切换命令:
逻辑日志的备份方式
先说一下备份级别,也同样用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会停止其它进程的操作,用所有精力进行回滚。(当达到这个水平时,如果再接受别的进程写入日志,有可能不能完成回滚就已经填满所有日志。回滚也是要写入大量日志的!)
上面就是长事务的原因。所以进行比较大的事务操作时,可以暂时切换到无日志状态。如果不能即时关闭日志记录,可以把日志文件大小加大,都有可能解决上面的问题。另外还有虽的方法,我还要去查看
注意:长日志是指发生在一个日志文件不能备份的情况下,所以增加日志文件个数并不管用,只有适当增加每个日志文件大小