-a -d
调整数据库隔离级别,例如使用 dirty read;将数据库表的缺省页级锁修改为行级锁;设置锁等待时间;调整应用 SQL,提高执行效率,尽量快的完成事务处理,释放资源;如果需要快速处理锁冲突的情况,在确定锁的实际拥有者以后可以确定是否应该终止其操作,执行 onmode –z
长事务
故障现象:
在数据库日志里面出现发现长事务的提示,受影响的事务处于回滚状态,个别情况下会导致整个数据库实例的其他数据库会话都停止执行。
故障分析:
当一个活动事务它所占用的逻辑日志个数的比例达到或超过 LTXHWM 所设定的值,数据库就会判定该事务为一个长事务,对该事务进行回滚操作,如果这个时候逻辑日志的使用个数仍然持续上涨达到或超过 LTXEHWM 所设定的值,则数据库会停止其他会话的正常运转,全力保证该长事务的回滚操作。
故障处理:
根据数据库日志里面所提供的信息可以很方便的发现具体是那一个事务造成了长事务。系统在将某个事务判定为长事务以后就会自动对其进行回滚操作。事后可以有针对性的调整应用将大的事务划分为小事务进行提交;避免一个活动事务长时间没有后续的操作;提供充足的逻辑日志空间,这里所指出的不仅是空间的总量需要增加,逻辑日志的个数也是应该增加的,因为判断的标准是以逻辑日志的使用个数所占比例来确定的。在 INFORMIX 9.3X 以后的版本中可以通过动态增加逻辑日志的手段避免由于长事务带来的一些不良影响,在长事务回滚过程中如果逻辑日志空间被消耗完毕,如果 DYNAMIC_LOGS 设置为 2,数据库服务器会自动在最后创建的逻辑日志所存在的 dbspace 上查找空余空间,按照最后创建的逻辑日志的大小自动在当前逻辑日志之后新增逻辑日志,如果不能满足需要则会创建失败,需要管理员手工添加。
数据库 chunk 出现异常,I/O 失败 故障现象: 数据库日志中出现 chunk IO 错误,使用 onstat –d 观察 chunk flag 的状态是 down 的状态,数据库操作中不能操作包含在这些 chunk 中的数据,如果使用到这些数据可能会返回错误,严重情况下会导致数据库宕机。例如: onstat –d … Dbspaces 554241a0 2 0x1 2 2 N D informix datadbs … 54dd2610 2 2 0 25000 23964 PD-- /home/informix/940/dsk/data_chk1 故障分析: 由于发生 IO 错误,数据库不能正常的操作包含在受影响 chunk 中的数据,所有的操作请求都将失败。这可能是由于磁盘设备出现问题、chunk 所使用的设备不存在、使用的链接设备不存在、设备的权限错误等可能性。 故障处理: 根据前面所列出的可能性逐一进行检查。一个快速确定存储设备是否可用的办法是:使用 dd 命令实际读取该设备,这里需要强调的是只能做读取操作,不能写入,严禁在 of 设备项指定为 chunk 路径,因此我们也只能验证其存储设备是否可读,例如: dd if=/home/informix/940/dsk/data_chk1 of=/dev/null bs=2048k 在确定所有硬件或设置都已经恢复正常以后,可以首先尝试使用 onspaces –s 进行恢复,如果还不能恢复成功,请联系 IBM 相关人员技术支持。 回页首 不能插入数据 故障现象: 在向数据库表插入数据的时候报没有空间或不能创建新的 extent,其返回错误码可能是: -131 ISAM error: no free disk space. -136 ISAM error: no more extents. -271 Could not insert new row into the table. 故障分析:
由于表所存在的 dbspaces 上没有足够的连续空间来创建新的 extent;达到每个单片表的 extents 个数上限;达到每个单片表记录数的上限,以上 3 种可能都会导致不能插入数据情况的发生。
故障处理:
在出现这种问题以后,首先应该查看应用日志、应用程序,也可以通过查看当前正在执行并返回错误的 SQL 以确定到底是哪张表不能插入数据。在定位受到影响的表以后应该确定表所存在的 dbspace 是否有足够的连续空闲空间,如果没有请相应的增加 chunk 空间以扩充其数据库存储空间。在确认存在足够的连续空闲空间以后再检查是否达到后续的 2 个上限,可以使用一些脚本工具或数据库命令来实现这一点。在确认问题的原因以后,理想的解决方法是为数据库表提供更多的使用空间,例如增加 chunk、将表进行重建、将表进行合理的分片等;应急的处理原则是:小批量、小批量地删除部分数据,尽量将需要处理的数据限制在较小的范围内,通过多次的操作来达到删除数据的目的,避免出现大事务、长时间不能完成的情况出现。