我一直试图发出一个简单的:
ALTER TABLE tablename ADD COLUMN id_col character varying (30)
在 Debian 上构建的 Postgres 9.1.13 上的 type 语句。该应用程序仍处于私人测试阶段,因此音量很低,但有些东西阻碍了这一说法。在此Postgres 锁监控帖子之后,并运行查询,
SELECT bl.pid AS blocked_pid,
a.usename AS blocked_user,
kl.pid AS blocking_pid,
ka.usename AS blocking_user,
a.current_query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.procpid = bl.pid
JOIN pg_catalog.pg_locks kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
JOIN pg_catalog.pg_stat_activity ka ON ka.procpid = kl.pid
WHERE NOT bl.granted;
不返回任何结果。
如果我跑,
SELECT * FROM pg_stat_activity
我所看到的只是ALTER TABLE
带有 的语句waiting = t
,以及处于空闲状态的其他几个查询。
我不是 DBA,更像是数据库开发人员,如果我遗漏了一些非常明显的东西,我深表歉意,但我从未在低容量的开发盒上看到过这样的情况,所以不知道如何继续。
根据 wiki 上针对该查询给出的注释,它只显示行级锁。
ALTER TABLE
需要一个表级ACCESS EXCLUSIVE
锁。一个或多个事务将在表上持有较弱的锁,从而阻止ALTER TABLE
获取其锁。您可以通过以下方式识别正在等待的锁:
(在 9.1 及更早版本上将“sa.pid”更改为“sa.procpid”)。
问题原来是一个 shp2pgsql 进程,它在我发布这个问题前几个小时在屏幕中的 shell 脚本中循环运行。它没有出现在 pg_locks 中,也没有出现在 pg_stat_activity 中,因为它是一个单独的进程,然后通过管道传输到 psql 中。杀死屏幕内的这个窗口,允许
ALTER TABLE
语句运行。有问题的声明看起来像这样:这是我已经运行了数百次的东西,我以前从未见过这种行为,所以我仍然不知道为什么,但至少它已经解决了。