zoukankan      html  css  js  c++  java
  • postgresql死锁处理

    postgresql 死锁处理

    缘起

    遇到一个奇怪的现象,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(); 

    然后就可以删除数据库了

    善战者,求之于势,不责于人,故能择人而任势
  • 相关阅读:
    PHP 求多个数组的笛卡尔积,适用于求商品规格组合 【递归思想, 类似广度优先搜索】【原创】
    CCF推荐期刊会议
    SCI分区
    值和指针接收者的区别
    程序员练级攻略
    保险
    golang 有缓冲channel和无缓冲channel
    后台学习路线
    golang之反射
    atomic和mutex
  • 原文地址:https://www.cnblogs.com/love666/p/6675037.html
Copyright © 2011-2022 走看看