[原创]数据库锁表的解决流程,请求加精
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。 不会吧,要执行oninit -i 整个实例都被初始化了,没有备份的话,就等着哭吧,:) 最后一句慎行之。。。 请求加精
查锁
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]