Informix杀掉死锁的方法和查看死锁的sql语句(转)作者:星星博客园 来源:博客园 发布时间:2011-01-21 10:01 阅读:60 次 原文链接 [收藏]
Informix锁表产生的原因,要么是多个用户同时访问数据库导致该问题,要么是因为某个进程死了以后资源未释放导致的。如果是前一种情况,可以考虑将 数据库表的锁级别改为行锁,来减少撞锁的机会;或在应用程序中,用set lock mode wait 3这样的语句,在撞锁后等待若干秒重试。如果是后一种情况,可以在数据库端用onstat -g ses/onstat -g sql/onstat -k等命令找出锁表的进程,用onmode -z命令结束进程;如果不行,就需要重新启动数据库来释放资源。
1:$ onstat -k | grep HDR+X
获得sessid,其中HDR+X 为排他锁,HDR 头,X 互斥 ,sessid 是会话标识符编号。
2:$ onstat -g ses sessid
根据sessid得到进程pid,其中pid 是与此会话的前端关联的进程标识。
(可通过$ onstat -g sql sessid 命令查看执行的sql语句)
3:$ ps -ef |grep pid
由此,我们可得到锁表的进程,可根据实际锁表进程的重要程度的具体情况采取相映处理方法:
对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sesid 的方法杀掉锁表session:
$ onmode –z sessid
否则也