PostgreSQL如何杀死被锁死的进程问题

 更新时间:2024年12月27日 11:43:25   作者:雨临Lewis  
文章总结:文章主要介绍了如何使用PostgreSQL提供的pg_cancel_backend()和pg_terminate_backend()函数来解决数据库表被锁住的问题,以及如何查询哪些表、哪些进程被锁住了

前言

在一次系统迭代后用户投诉说无法成功登陆系统,经过测试重现和日志定位,最后发现是由于用户在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()

  1. 只能关闭当前用户下的后台进程
  2. 向后台发送SIGINT信号,用于关闭事务,此时session还在,并且事务回滚

pg_terminate_backend()

  1. 需要superuser权限,可以关闭所有的后台进程
  2. 向后台发送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(至少我们系统遇到的情况是这样的)。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • postgresql json取值慢的原因分析

    postgresql json取值慢的原因分析

    这篇文章主要介绍了postgresql json取值为何这么慢,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • postgresql 实现replace into功能的代码

    postgresql 实现replace into功能的代码

    这篇文章主要介绍了postgresql 实现replace into功能的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql 赋予用户权限和撤销权限的实例

    Postgresql 赋予用户权限和撤销权限的实例

    这篇文章主要介绍了Postgresql 赋予用户权限和撤销权限的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql合并string_agg函数的实例

    postgresql合并string_agg函数的实例

    这篇文章主要介绍了postgresql合并string_agg函数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 将PostgreSQL的数据实时同步到Doris的技巧分享

    将PostgreSQL的数据实时同步到Doris的技巧分享

    众所周知,在两个毫不相干的数据管理系统之间进行数据同步,特别是实时同步,其复杂程度足以让高级DBA脑瓜疼,本文给大家介绍了将PostgreSQL的数据实时同步到Doris的技巧分享,需要的朋友可以参考下
    2024-03-03
  • PostgreSQL数据类型格式化函数操作

    PostgreSQL数据类型格式化函数操作

    这篇文章主要介绍了PostgreSQL数据类型格式化函数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 在PostgreSQL中设置表中某列值自增或循环方式

    在PostgreSQL中设置表中某列值自增或循环方式

    这篇文章主要介绍了在PostgreSQL中设置表中某列值自增或循环方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL查看版本信息的操作

    PostgreSQL查看版本信息的操作

    这篇文章主要介绍了PostgreSQL查看版本信息的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgres中UPDATE更新语句源码分析

    Postgres中UPDATE更新语句源码分析

    这篇文章主要给大家介绍了关于Postgres中UPDATE更新语句源码分析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • 详解PostgreSQL中实现数据透视表的三种方法

    详解PostgreSQL中实现数据透视表的三种方法

    数据透视表(Pivot Table)是进行数据汇总、分析、浏览和展示的强大工具,可以帮助我们了解数据中的对比情况、模式和趋势,是数据分析师和运营人员必备技能之一,本给大家介绍PostgreSQL中实现数据透视表的三种方法,需要的朋友可以参考下
    2024-04-04

最新评论