我在其中一个Informix环境中遇到问题,我无法在表上获得独占锁以添加检查约束。
错误消息
SQL错误(-242):无法打开数据库表() ISAM错误:非独占访问。
我的第一个想法是有一个会话使用该表,所以我等到一天结束时最小化使用情况并再次尝试相同的结果。
然后我检查了该表上的锁,但该表上根本没有任何锁,事实上现在该数据库中根本没有锁。
然后我转向桌面上的复制,但问题仍然存在。
现在我完全没有关于如何解决这个问题的想法,我宁愿不重新启动服务器或杀死连接到它的所有会话。
答案 0 :(得分:3)
我刚刚解决了这个问题 有一些脏读的会话等待从表中读取 由于知道了表名,我可以使用
从systables中获取十六进制的partnumSELECT 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 ----------------------------------------------------------
我当然掩盖了环境中的数据,但你应该得到漂移。