Postgresql死結的處理

來源:互聯網
上載者:User

標籤:

今天遇到一個奇怪的現象,select和delete表時正常執行,但truncate和drop表時會一直運行,也不報錯。

查了些資料才發現問題的原因,總結如下:

"drop table " 和 "truncate table " 需要申請排它鎖 "ACCESS EXCLUSIVE ", 執行這個命令卡住時,說明此時這張表上還有操作進行中,比如查詢等,
那麼只有等待這個查詢操作完成,"drop table" 或"truncate table"或者增加欄位的SQL 才能擷取這張表上的 "ACCESS EXCLUSIVE" 鎖 ,操作才能進行下去。

 

1.檢索出死結進程的ID。

SELECT * FROM pg_stat_activity WHERE datname=‘死結的資料庫ID ‘;

檢索出來的欄位中,【wating 】欄位,資料為t的那條,就是死結的進程。找到對應的【procpid 】列的值。

2.將進程殺掉。

SELECT pg_cancel_backend(‘死結那條資料的procpid值 ‘);

結果:運行完後,再次更新這個表,sql順利執行。

 

如果pg_stat_activity 沒有記錄,則查詢pg_locks是否有這個對象的鎖

select oid,relname from pg_class where relname=‘table name‘;


select locktype,pid,relation,mode,granted,* from pg_locks where relation= ‘上面查詢出來的oid‘;

 

select pg_cancel_backend(‘進程ID‘);

 

 另外pg_terminate_backend()函數也可以殺掉進程。

Postgresql死結的處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.