在Informix数据库中释放异常的锁资源
Informix数据库释放异常锁资源:
问题
在Informix数据库中,锁的使用和释放是自动完成的。但在某些异常情况下,当前程序退出(正常或异常)后,数据库中相应的会话没有终止,其占用的资源(主要是锁)没有释放,影响了其他用户的使用。
这种情况可能出现在用户表或系统表中,通常是由产品BUG或非常极端的情况引起的。
此时,需要手动终止有问题的会话,以释放其占用的资源。当然,重启数据库自然会释放所有资源,但有时会暂时禁止业务重启。
第一步是确定锁定的资源。
通常,在这种情况下,很容易确定锁定的资源。如果是用户表,操作该表时会报错。如果是系统表,也会直接报告是哪个表,比如:
211:无法读取系统目录(sysprocplan)。
144: ISAM错误:键值被锁定
在上面的信息中,关于存储过程的系统表sysprocplan被锁定。
确定相关表名后,需要查询其内部表号,以便后续处理,如下图:
数据库访问
从systables中选择hex(partnum ),其中tabname= " "
返回的是一个十六进制数,它是IDS中表的ID。
第二步,找到被锁定的用户线索。
运行IDS lock的监控命令onstat -k,确定锁定表的用户线索,如下所示:
$ onstat -k
IBM Informix动态服务器版本9.40.FC6 -在线运行18:13:12 - 38912千字节
锁
地址wtlist所有者lklist类型tblsnum rowid key#/bsiz
10 a13 a590 0 10 AFD 30 c8 0 HDR+S 100002 207 0
在输出中,查找第一步中找到的表号为tblsnum的行。每一行代表一个锁资源的情况,找到对应的所有者,也就是使用这个锁的用户的线索号。
第三步:找到用户线索对应的会话。
通过用户线程监控命令onstat -u进一步搜索对应的会话和用户情况,如下:
$ onstat -u
IBM Informix动态服务器版本9.40.FC6 -在线运行18:20:47 - 38912千字节用户线程
地址标志sessid用户tty等待外出锁n读取n写入
10afd1028 - P - D 1 informix - 0 0 0 28 7
10 AFD 1850-P-F 0 Informix-0 0 0 0 0 0
10afd2078 - P - 5 informix - 0 0 0 0 0
10afd28a0 - P - B 6 informix - 0 0 0 0 0
10 AFD 30 c8 Y-P-17 Informix 4 10 b1f 9548 0 1 157 0
10afd4118 - P - D 9 informix - 0 0 0 0 0
10 AFD 4940Y-P-D 13 Informix-10a 125 F10 0 0 0 0 0
第一列是线索号,对应的第三列是拥有线索的会话号。
第四步,分析原因,采取措施。
有了会话号,你可以进一步分析原因或采取相应的措施,如:
Onstat -g ses,分析会话状态
Onstat -g sql,检查会话的sql状态。
注意,如果会话的数据库项中出现“--”,则表示该会话对应的客户端程序已经退出,但数据库中的会话尚未终止。
或者直接通过onmode -z终止会话,它占用的锁资源全部释放。
位律师回复
0条评论