我的一个python脚本在Postgres数据库上运行了一些ALTER TABLE查询。发生了一些错误,桌子被锁定了。当我在任何这些表上运行任何查询时,它会告诉我Query Query并没有任何反应。 目前,我只能通过关闭我的系统并重新启动它来删除此锁。请告诉我一个更好的方法。这是一个Windows主机。
答案 0 :(得分:16)
你应该检查锁:
SELECT l.*,a.*
FROM pg_locks l
JOIN pg_stat_activity a USING (pid)
WHERE NOT granted;
您会看到等待会话的列表。以下内容:
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);
将为您提供阻止会话的列表。如果使用psql
, use expanded
output获取每行列数输出,则最好查看此类信息。
我建议你也看看this wiki page这个问题:Postgresql DROP TABLE doesn't work
(虽然它在那里讲DROP TABLE
,但它可能有帮助。)
在您的情况下,我建议识别阻止会话并尝试找出阻止他们的原因。根据我的经验,最典型的情况是 - 有人忘记在COMMIT
之后按下输入并出去吃午饭。如果您确定这不会损害您的系统,则可以终止阻止会话:
SELECT pg_terminate_backend(pid);
答案 1 :(得分:0)
Reference taken from this article. 查找阻止会话:
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;