首页 > 学技术 > 技术网文 > Informix > 正文

[保留] 【原创】找出表被谁锁住了


来源 chinaunix.net 酷勤网整理

如果您执行SQL语句时候出现下面的错误提示:
   244: Could not do a physical-order read to fetch next row.
   113: ISAM error:  the file is locked.
毫无疑问,您要访问的表被别人锁住了。
   
如果您的使用了 set lock mode to wait 语句,onstat -u 命令可以报告出会话在等待锁资源的信息(

标志位“L”),如:
c0000000379015e8 L--PR-- 4626     informix tJ       c0000000006e45f0 20   1     0        0   
超时后报错:
   244: Could not do a physical-order read to fetch next row.
   154: ISAM error: Lock Timeout Expired   

那么,怎么样找出是谁锁住了这个表呢?介绍一个小技巧,执行下面SQL语句:

   DATABASE sysmaster;
   SELECT owner FROM syslocks WHERE tabname="表名";

得到的owner就是加锁的会话号SID,于是我们就可以使用 onstat -g ses SID 命令查看该会话的信息,

包括是哪个用户、执行了什么SQL语句。还可以通过DBA身份使用 onmode -z 命令杀断该会话。



 czw1413_cn 回复于:2004-02-10 10:54:57

顶一下~~~~~~~~~


 圣手again 回复于:2004-02-10 21:53:11

我有此这样的代码,到时贴出来看看


 chenjiakai 回复于:2004-02-11 00:39:18

用IBM的ISA工具一下子就搞定了。


 hseng 回复于:2004-02-11 08:39:38

up


 satoni 回复于:2004-02-11 12:45:24

我也顶一下。。。


 czw1413_cn 回复于:2004-02-11 13:40:04

建议楼主在发表主题的时候不要使用“原创“


 amiescort 回复于:2004-02-11 19:37:47

引用:原帖由 "czw1413_cn"]建议楼主在发表主题的时候不要使用“原创“
 发表:


呵呵,打击别人的积极性呢
不过方法真的不错,比我的好多了:
1、发现锁表(以tea为例)。
2、在systables中找出tea对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。


 cruelsun 回复于:2004-02-11 19:50:56

to 版主:
   对不起,下次不敢了。呵呵 ~

to amiescort  :
   我以前的做法跟你说的差不多,前天查了官方文档,发现了这个系统表,一试才知道有这种用法。

to chenjiakai :
   谢谢提醒,ISA以前也用过,还不知道有这个功能呢。


 czw1413_cn 回复于:2004-02-11 21:11:13

to amiescort:
这绝不是打击,只是觉得没有必要
问题在标题里说明白就可以了
to all:
希望大家多发帖子,大家互相帮助,互相学习


 bigsunflower 回复于:2004-03-22 13:10:43

DATABASE sysmaster; 
SELECT owner FROM syslocks WHERE tabname="表名"; 
好像并不管用,syslocks中的tabname 对应的名字都为sysdatabases
而不是对应的表名阿
??


 volcanosh 回复于:2004-03-22 13:31:22

是不是能编个脚本?那样就方便多了




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=256257
转载请注明作者名及原文出处



收藏本页到: