【问题标题】:List and kill all dead lock queries in PostgresSQL列出并终止 PostgresQL 中的所有死锁查询
【发布时间】:2019-07-25 04:02:15
【问题描述】:

我想在 PostgreSQL 中清理我的数据库进程,因为很少有查询处于死锁状态,因此整个数据库都变慢了。

所以我想知道列出所有死锁查询并定期清理它们的最佳做法。

我从 PgAdmin 那里得到了这个观点。

【问题讨论】:

  • 定义是什么让会话在您的视图中陷入僵局。正常的死锁会自动解决。
  • 如果您无法检测(并列出)死锁,您怎么知道是死锁?
  • 我添加了图片
  • 如果发生死锁,Postgres 会自动终止涉及的事务之一。您看到的是“正常”锁,而不是死锁

标签: sql postgresql locking deadlock


【解决方案1】:

正如a_horse_with_no_name 所评论的,您在pgadmin 中看到的是常规锁,而不是死锁

来自the Postgres documentation

PostgreSQL 提供了多种锁模式来控制对表中数据的并发访问。在 MVCC 未提供所需行为的情况下,这些模式可用于应用程序控制的锁定。此外,大多数 PostgreSQL 命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。

pgadmin 中的屏幕可能基于the pg_lock system view

锁发生在任何数据库的正常进程中。您不想终止定期生成锁的会话,因为这会以各种方式影响您的应用程序和数据库。相反,您可能想要识别(可能使用pg_lock 视图)、分析和优化导致问题的查询。


谈到死锁的概念:这是使用锁时可能发生的一种特定的异常情况,两个会话相互等待另一个会话。它们通常指示应用程序逻辑中的问题。

大多数 RDBMS 会自动识别并解决这种阻塞情况,Postgres is no exception:

PostgreSQL 自动检测死锁情况并通过中止其中一个事务来解决它们,允许其他事务完成。 (究竟哪个事务将被中止很难预测,不应依赖。)

【讨论】:

    【解决方案2】:

    以下是一些对您有帮助的查询:https://wiki.postgresql.org/wiki/Lock_Monitoring

    查询可能需要一些微不足道的调整才能工作。查询有点长,这里就不贴了,只知道db表pg_catalog.pg_lockspg_catalog.pg_stat_activity中有锁和查询状态信息。

    您可以像普通表一样查询和连接它们以构建您要查找的内容。

    请注意,尽管最好的情况是使用此信息来诊断和追溯“死锁”的来源,而不是从数据库中强制取消查询。

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多