您应该检查锁:
SELECT l.*,a.*
FROM pg_locks l
JOIN pg_stat_activity a USING (pid)
WHERE NOT granted;
您会看到一个列表waiting会议。以及以下内容:
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);
会给你一个清单blocking会议。如果你使用psql, use expanded output http://www.postgresql.org/docs/current/interactive/app-psql.html要获得每行列的输出,最好查看此类信息。
以下 SQL 脚本 https://github.com/dataegret/pg-utils/blob/master/sql/locktree.sql将显示阻塞树(如果有阻塞会话),每个分支顶部的会话(是的,通常有多个分支)将是阻塞会话。
我建议你也看看这个维基页面 https://wiki.postgresql.org/wiki/Lock_dependency_information和这个问题:Postgresql DROP TABLE 不起作用 https://stackoverflow.com/questions/10317114/postgresql-drop-table-doesnt-work(虽然它谈到DROP TABLE
在那里,它可能会有所帮助)。
对于您的情况,我建议您确定blocking会议并尝试找出答案why他们正在阻止。根据我的经验,最典型的案例是有人忘记按 Enter 键COMMIT
然后出去吃午饭。如果你确定这不会损害你的系统,你可以杀死blocking会议:
SELECT pg_terminate_backend(pid);