Postgresql
更改表語句等待(幾個小時,在開發機器上),但沒有顯示鎖
我一直試圖發出一個簡單的:
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
獲取其鎖。您可以通過以下方式辨識正在等待的鎖:
select * from pg_stat_activity sa inner join pg_locks lwait on (sa.pid = lwait.pid) where sa.waiting = 't' and sa.query like '%ALTER%' and not lwait.granted;
(在 9.1 及更早版本上將“sa.pid”更改為“sa.procpid”)。