Postgres数据库已锁定:查询永远运行

use*_*637 11 postgresql

我的一个python脚本在Postgres数据库上运行了一些ALTER TABLE查询.发生了一些错误,桌子被锁定了.当我在任何这些表上运行任何查询时,它会告诉我Query Query并没有任何反应.目前,我只能通过关闭我的系统并重新启动它来删除此锁.请告诉我一个更好的方法.这是一个Windows主机.

vye*_*rov 23

你应该检查锁:

SELECT l.*,a.*
  FROM pg_locks l
  JOIN pg_stat_activity a USING (pid)
 WHERE NOT granted;
Run Code Online (Sandbox Code Playgroud)

您将看到等待会话的列表.以下内容:

SELECT l.*,a.*
  FROM pg_locks l
  JOIN pg_stat_activity a USING (pid)
 WHERE granted
   AND (database,relation) IN (SELECT database,relation
                                 FROM pg_locks WHERE NOT granted);
Run Code Online (Sandbox Code Playgroud)

将为您提供阻止会话列表.如果使用psql,请使用expandedoutput来获取每行输出,以便更好地查看此类信息.

我建议你也看一下这个wiki页面和这个问题:Postgresql DROP TABLE不起作用 (虽然它在DROP TABLE那里说话,但它可能有帮助).

在您的情况下,我建议您确定阻止会话并尝试找出阻止他们的原因.根据我的经验,最典型的情况是 - 有人忘记按下输入后COMMIT出去吃午饭.如果你确定这不会伤害你的系统,你可以杀死阻塞会话:

SELECT pg_terminate_backend(pid);
Run Code Online (Sandbox Code Playgroud)


Anv*_*esh 6

参考资料取自这篇文章。 查找阻塞会话:

    SELECT 
        pl.pid as blocked_pid
        ,psa.usename as blocked_user
        ,pl2.pid as blocking_pid
        ,psa2.usename as blocking_user
        ,psa.query as blocked_statement
    FROM pg_catalog.pg_locks pl
    JOIN pg_catalog.pg_stat_activity psa
        ON pl.pid = psa.pid
    JOIN pg_catalog.pg_locks pl2
    JOIN pg_catalog.pg_stat_activity psa2
        ON pl2.pid = psa2.pid
        ON pl.transactionid = pl2.transactionid 
            AND pl.pid != pl2.pid
    WHERE NOT pl.granted;
Run Code Online (Sandbox Code Playgroud)