• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    pgsql锁表后kill进程的操作

    如下:

    select * from pg_stat_activity
    

    查询系统中的进程

    如果怀疑哪张表被锁了,可以执行如下sql:

    select oid from pg_class where relname='table_name'
    

    然后将拿到的oid 放入如下sql执行:

    select pg_cancel_backend('oid ');;
    

    搞定!

    此sql是kill作用

    补充:PostgreSQL - 如何杀死被锁死的进程

    前言

    在一次系统迭代后用户投诉说无法成功登陆系统,经过测试重现和日志定位,最后发现是由于用户在ui上进行了某些操作后,触发了堆栈溢出异常,导致数据库里的用户登陆信息表的数据被锁住,无法释放。这个表里存放的是用户的session信息。

    虽然后来解决了问题,但是数据库里这个用户登录信息表里被lock住的数据始终无法释放,这导致用户永远无法登陆成功,需要手动跑SQL把锁去掉才行。

    杀掉指定进程

    PostgreSQL提供了两个函数:pg_cancel_backend()和pg_terminate_backend(),这两个函数的输入参数是进程PID,假定现在要杀死进程PID为20407的进程,使用方法如下:

    select pg_cancel_backend(20407);
    

    --或者执行这个函数也可以:

    select pg_terminate_backend(20407);
    

    这两个函数区别如下:

    pg_cancel_backend()
    

    只能关闭当前用户下的后台进程

    向后台发送SIGINT信号,用于关闭事务,此时session还在,并且事务回滚

    pg_terminate_backend()
    

    需要superuser权限,可以关闭所有的后台进程

    向后台发送SIGTERM信号,用于关闭事务,此时session也会被关闭,并且事务回滚

    那么如何知道有哪些表、哪些进程被锁住了?可以用如下SQL查出来:

    select * from pg_locks a
    join pg_class b on a.relation = b.oid
    join pg_stat_activity c on a.pid = c.pid
    where a.mode like '%ExclusiveLock%';

    这里查的是排它锁,也可以精确到行排它锁或者共享锁之类的。这里有几个重要的column:a.pid是进程id,b.relname是表名、约束名或者索引名,a.mode是锁类型。

    杀掉指定表指定锁的进程

    select pg_cancel_backend(a.pid) from pg_locks a
    join pg_class b on a.relation = b.oid
    join pg_stat_activity c on a.pid = c.pid
    where b.relname ilike '表名' 
    and a.mode like '%ExclusiveLock%';

    --或者使用更加霸道的pg_terminate_backend():

    select pg_terminate_backend(a.pid) from pg_locks a
    join pg_class b on a.relation = b.oid
    join pg_stat_activity c on a.pid = c.pid
    where b.relname ilike '表名' 
    and a.mode like '%ExclusiveLock%';

    另外需要注意的是,pg_terminate_backend()会把session也关闭,此时sessionId会失效,可能会导致系统账号退出登录,需要清除掉浏览器的缓存cookie(至少我们系统遇到的情况是这样的)。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • pgsql之pg_stat_replication的使用详解
    • pgsql 如何删除仍有活动链接的数据库
    • pgsql的UUID生成函数实例
    • pgsql 如何手动触发归档
    • pgsql 实现用户自定义表结构信息获取
    • PGSQL 实现把字符串转换成double类型(to_number())
    • pgsql之create user与create role的区别介绍
    上一篇:Postgresql锁机制详解(表锁和行锁)
    下一篇:PostgreSQL使用IP无法连接的解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    pgsql锁表后kill进程的操作 pgsql,锁表,后,kill,进程,的,