添加检查约束时无法获得独占访问权限

时间:2014-01-03 13:07:10

标签: informix

我在其中一个Informix环境中遇到问题,我无法在表上获得独占锁以添加检查约束。

  

错误消息

     

SQL错误(-242):无法打开数据库表()   ISAM错误:非独占访问。

我的第一个想法是有一个会话使用该表,所以我等到一天结束时最小化使用情况并再次尝试相同的结果。
然后我检查了该表上的锁,但该表上根本没有任何锁,事实上现在该数据库中根本没有锁。
然后我转向桌面上的复制,但问题仍然存在。
现在我完全没有关于如何解决这个问题的想法,我宁愿不重新启动服务器或杀死连接到它的所有会话。

2 个答案:

答案 0 :(得分:3)

我刚刚解决了这个问题 有一些脏读的会话等待从表中读取 由于知道了表名,我可以使用

从systables中获取十六进制的partnum
SELECT HEX(partnum) FROM systables where tabname = <table>

然后我使用 onstat -g opn | grep 获取连接到表的线程ID(结果中第一个名为tid的列) 从那里我可以使用 onstat -g ath | grep 获取rsam线程控制块地址(结果中的第三列rtscb,在第五列中可以查看状态)并将其与 onstat -u |一起使用grep 获取会话ID(结果中的第三列称为sessid) 然后,我使用 onmode -z 的会话ID来终止活动会话

答案 1 :(得分:1)

很棒的答案 - 也值得查看以下内容

onstat -g stm | grep -E "TABLENAME|^session"

这将检查准备好的SQL语句缓存,并返回所有会话和任何提及的TABLENAME

session 79412526   ----------------------------------------------------------

session 79412418   ----------------------------------------------------------

session 79412200   ----------------------------------------------------------

c00000042e5eeff0 30624       SELECT COUNT(*) FROM TABLENAME

session 79411988   ----------------------------------------------------------

c0000004167b1230 30624       SELECT COUNT(*) FROM TABLENAME

session 79411978   ----------------------------------------------------------

我当然掩盖了环境中的数据,但你应该得到漂移。