【问题标题】:Unable to obtain exclusive access when adding a check constraint添加检查约束时无法获得独占访问
【发布时间】:2014-01-03 13:07:09
【问题描述】:

我在我的一个 Informix 环境中遇到了一个问题,我无法在表上获得排他锁来添加检查约束。

错误信息

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

我的第一个想法是有一个会话使用该表,所以我等到一天结束以尽量减少使用并再次尝试,结果相同。
然后我检查了该表上的锁,但该表上根本没有任何锁,实际上该数据库中现在根本没有锁。
然后我关闭了表上的复制,但问题仍然存在。
现在我对如何解决这个问题一无所知,我宁愿不重新启动服务器或终止与其连接的所有会话。

【问题讨论】:

    标签: informix


    【解决方案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   ----------------------------------------------------------
      

      我当然屏蔽了我们环境中的数据,但你应该明白这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 2016-08-05
        • 2021-04-25
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多