如果遇到数据库锁表,通常需要用如下方法处理:
查看表的partnum情况:
oncheck -pt shjz_mzb:baf01|grep -i partnum
这个里面包含了多个分区的partnum,也包含了索引的partnum。
Partition partnum 12584018 Partition partnum 12584029 Partition partnum 12584019 Partition partnum 12584024 Partition partnum 12584025 Partition partnum 12584031 Partition partnum 12584026 Partition partnum 12584027 Partition partnum 12584030 Partition partnum 12584028 |
把每个partnum转成十六进制如下:
因为lock table里面记录的是十六进制,而不是十进制。
Partition partnum 12584018 C0045C Partition partnum 12584029 C0045D Partition partnum 12584019 C00453 Partition partnum 12584024 C00458 Partition partnum 12584025 C00459 Partition partnum 12584031 C0045F Partition partnum 12584026 C0045A Partition partnum 12584027 C0045B Partition partnum 12584030 C0045E Partition partnum 12584028 C0045C |
根据partnum查看锁表的情况:
onstat -k |grep -iE 'C0045C|C0045D|C00453|C00458|C00459|C0045F|C0045A|C0045B|C0045E|C0045C'|sort -nrk 6 |
通过上图可以可以发现:
owner:表示当前哪个会话拿着锁,会话的sid可以通过onstat -u|grep 96edab28来查看
会话的具体操作可以通过onstat –g ses $sid来查看
type:HDR+X 表示独占锁
tblsnum:表示表的partnum的十六进制,也就是对那个表进行加锁
rowid:表示在哪个数据行上加锁,每行数据会有一个rowid
上图可以看到都是对rowid=1336802的该行数据进行加锁,但是partnum不一样,也就是表,每个索引树都需要锁住的。
根据owner找到sesion sid之后,onmode -z sid就可以杀掉会话,释放锁了。