码迷,mamicode.com
首页 > 其他好文 > 详细

4.26

时间:2016-05-01 01:07:20      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

缘起

遇到一个奇怪的现象,select和delete表时正常执行,但truncate和drop表时会一直运行,也不报错。

原因

"drop table " 和 "truncate table " 需要申请排它锁 "ACCESS EXCLUSIVE ", 执行这个命令卡住时,说明此时这张表上还有操作正在进行,比如查询等,
那么只有等待这个查询操作完成,"drop table" 或"truncate table"或者增加字段的SQL 才能获取这张表上的 "ACCESS EXCLUSIVE" 锁 ,操作才能进行下去。

1.检索出死锁进程的ID。

select oid,relname from pg_class where relname=cdb_all_iu_data;

检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程。找到对应的【procpid 】列的值。

2.将进程杀掉。

SELECT pg_cancel_backend(‘死锁那条数据的procpid值 ‘);

结果:运行完后,再次更新这个表,sql顺利执行。

 

如果pg_stat_activity 没有记录,则查询pg_locks是否有这个对象的锁

 

select locktype,pid,relation,mode,granted,* from where relation= ‘上面查询出来的oid‘;

杀掉进程

select pg_cancel_backend(‘进程ID‘);

另外pg_terminate_backend()函数也可以杀掉进程。

总结

select oid,relname from pg_class where relname=cdb_all_iu_data;
select locktype,database,pid,relation ,mode from pg_locks where relation=上面oid;
select * from pg_stat_activity where pid = 上面pid
select pg_terminate_backend(上面pid);

4.26

标签:

原文地址:http://www.cnblogs.com/kaituorensheng/p/5434358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!