Postgresql

更改表語句等待(幾個小時,在開發機器上),但沒有顯示鎖

  • December 10, 2014

我一直試圖發出一個簡單的:

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”)。

引用自:https://dba.stackexchange.com/questions/84739