当前位置:   article > 正文

PostgreSQL 锁表

postgresql 锁表

PostgreSQL 锁表解决

解决

一、

碰到的问题:Navicat删除表是一直转圈
出现问题的原因:短时间多次对同一张表进行查询造成表死锁
解决思路:通过查询进程把锁住的pid查出来然后解锁:
1、查询正在运行的进程
//datname为数据库名称
select * from pg_stat_activity WHERE datname='aaa' 

select * from pg_stat_activity where state = 'active'
  • 1
  • 2
  • 3
  • 4
2、查看等待中的进程
//wait_event_type = 'Lock' 表示锁表线程
select * from pg_stat_activity WHERE datname='aaa' and wait_event_type = 'Lock'
  • 1
  • 2
3、释放锁定
//多个同时执行,返回结果为f
select pg_cancel_backend('上面查到的pid');
select pg_cancel_backend('上面查到的pid');
select pg_cancel_backend('上面查到的pid');
  • 1
  • 2
  • 3
  • 4

二、

执行完之后还有部分未解锁,原因为:

postgresql 在执行drop table和truncate table时候需要先申请排它锁 ACCESS EXCLUSIVE,获取这把锁之后才可以继续执行。但是如果同时这张表上还有操作正在进行,比如select操作,那么很不幸只有等待这个查询操作完成以后,drop table和truncate table才能获取这张表上的ACCESS EXCLUSIVE锁,后续的操作才能继续执行。

如下的SQL可以将正在运行的SQL杀掉
select
    pg_terminate_backend(pid),
    query
from
    pg_stat_activity
where
    query ~* 'order_table'
    and pid <> pg_backend_pid();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 杀掉后就可以进行删表的操作
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/236761
推荐阅读
相关标签
  

闽ICP备14008679号