Postgresql

pg_class 鎖的原因除了 DROP TABLE

  • February 10, 2019

我確實在 PostgreSQL 11 上遇到過以下情況:

  1. 帶有未知語句的事務會ACCESS SHAREpg_class.
  2. 另一個連接想要執行DROP TABLE,導致ACCESS EXCLUSIVE鎖定pg_class。此操作被阻止,因為操作 #1 仍然持有鎖。
  3. 此後,任何與數據庫的新連接都將永遠等待,因為它也需要訪問pg_class

繼續進行的唯一方法是終止操作#1 或#2。

雖然我可以通過手動鎖定表來重現這種情況,但我找不到導致pg_class操作 #1 鎖定的原因的解釋。也就是說,pg_stats_activity僅將 a 顯示SELECT為目前查詢,即idle in transaction. 但是,我懷疑這不是創建鎖的語句。

因此,非常感謝任何有關可能導致ACCESS SHARE鎖定異常的pg_class輸入。DROP TABLE

更新atm 也不清楚為什麼DROP TABLE要鎖定pg_class

這種情況是由一個長時間執行的事務引起的,該事務SELECT首先執行pg_class。這會導致ACCESS SHARE鎖定。

通常,DROP TABLE不會導致ACCESS EXCLUSIVE鎖定,但在這種情況下,會載入一個使用更多限制性鎖定的 PG 擴展。

目前情況的解決方案是將長期執行的事務移出SELECTpg_class

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