postgresql死锁处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了postgresql死锁处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1645字,纯文字阅读大概需要3分钟。
内容图文
缘起
遇到一个奇怪的现象,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=‘all_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 locktype,database,pid,relation ,mode from pg_locks where relation=上面oid; select * from pg_stat_activity where pid = 上面pid select pg_terminate_backend(上面pid);
删除数据库说被链接
异常
db_v43=> drop database test_db; ERROR: database "test_db" is being accessed by other users DETAIL: There is 1 other session using the database.
解决
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=‘数据库名‘ AND pid<>pg_backend_pid();
然后就可以删除数据库了
postgresql死锁处理
标签:end 链接 ant sed can 现象 users roc ase
本文系统来源:http://www.cnblogs.com/love666/p/6675037.html
内容总结
以上是互联网集市为您收集整理的postgresql死锁处理全部内容,希望文章能够帮你解决postgresql死锁处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。