添加检查约束时无法获得独占访问
Posted
技术标签:
【中文标题】添加检查约束时无法获得独占访问【英文标题】:Unable to obtain exclusive access when adding a check constraint 【发布时间】:2014-01-03 13:07:09 【问题描述】:我在我的一个 Informix 环境中遇到了一个问题,我无法在表上获得排他锁来添加检查约束。
错误信息
SQL 错误 (-242): 无法打开数据库表 ()。 ISAM 错误:非独占访问。
我的第一个想法是有一个会话使用该表,所以我等到一天结束以尽量减少使用并再次尝试,结果相同。 然后我检查了该表上的锁,但该表上根本没有任何锁,实际上该数据库中现在根本没有锁。 然后我关闭了表上的复制,但问题仍然存在。 现在我对如何解决这个问题一无所知,我宁愿不重新启动服务器或终止与其连接的所有会话。
【问题讨论】:
【参考方案1】:我刚刚解决了这个问题。 有一些带有脏读的会话在等待从表中读取时卡住了。 由于知道表名,我可以使用
从 systables 中获取十六进制部分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 来终止活动会话
【讨论】:
【参考方案2】:很好的答案 - 也值得检查以下内容
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 ----------------------------------------------------------
我当然屏蔽了我们环境中的数据,但你应该明白这一点。
【讨论】:
以上是关于添加检查约束时无法获得独占访问的主要内容,如果未能解决你的问题,请参考以下文章
因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法