cdcd007 发表于 2007-05-21 14:26

[原创]数据库锁表的解决流程,请求加精

1。找到被锁表的partnum:selecthex(partnum) from systableswheretabname = ”tabalname”;

2。onstat -k|grep partnum 找到该锁的owner;

3。onstat -u | grep owner 找到用户会话session号;

4。onmode -z sesid 杀掉该session;

5。如果第4步失败,则进一步onstat -g ses | grep sesid 找到该发起该会话的pid;

6。kill pid 或 kill -9 pid;

7。特殊情况:在第2步中,如果发现锁的owner为0,则检查:
   
    onstat -x
    onstat -G
    看是否存在全局事务,若有全局事务,则继续以下步骤:

         select hex(tx_addr) trans_addr,hex(tx_lklist) lock_addr from systrans where hex(tx_addr) like '%c000000007674c58%';
         需要说明的是,c000000007674c58是使用onstat -x 或 onstat -G得到的全局事务的地址。
         上面SQL语句提供出该全局事务对应的锁地址,这时如果得到的锁地址与锁表的锁地址相同的话,你就必需从应用端(通常是三层结构的中间件)发命令让该全局事务回滚或提交,否则该锁会被一直持有,直到你执行oninit -i。

shanshl 发表于 2007-05-25 15:28

不会吧,要执行oninit -i 整个实例都被初始化了,没有备份的话,就等着哭吧,:)

czw1413_cn 发表于 2007-05-26 23:09

lianyong 发表于 2007-05-27 09:48

最后一句慎行之。。。

白云 发表于 2007-06-14 10:22

请求加精

查锁
select
      dbsname,
      b.tabname,
      rowidr,
      keynum,
      e.txt         type,
      d.sid         owner,
      g.username      ownername,
      f.sid         waiter,
      h.username      waitname
from
      syslcktab       a,
      systabnames   b,
      systxptab       c,
      sysrstcb      d,
      sysscblst       g,
      flags_text      e,
      outer ( sysrstcb f , sysscblst h)
where
                b.dbsname <> "sysmaster"
      and   a.partnum = b.partnum
      and   a.owner   = c.address
      and   c.owner   = d.address
      and   a.wtlist= f.address
        and   d.sid   = g.sid
        and   e.tabname = 'syslcktab'
        and   e.flags   = a.type
        and   f.sid   = h.sid
      and   b.tabname='xxxxx'   (如不加这句 查所有锁)

onmode -z sessid
页: [1]
查看完整版本: [原创]数据库锁表的解决流程,请求加精