• Postgresql死锁的处理


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

    查了些资料才发现问题的原因,总结如下:

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

     

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

    SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';

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

    • 2.将进程杀掉。

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

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

     

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

    select oid,relname from pg_class where relname='table name';


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

    select pg_cancel_backend('进程ID');

     

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

  • 相关阅读:
    1011. A+B和C (15)
    1010. 一元多项式求导 (25)
    1009. 说反话 (20)
    1007. 素数对猜想 (20)
    1008. 数组元素循环右移问题 (20)
    1006. 换个格式输出整数 (15)
    1005. 继续(3n+1)猜想 (25)
    算法学习(八)
    算法学习(七)
    算法学习(六)
  • 原文地址:https://www.cnblogs.com/xmzzp/p/6323044.html
Copyright © 2020-2023  润新知