postgresql死結處理

來源:互聯網
上載者:User

標籤:end   連結   ant   sed   can   現象   users   roc   ase   

緣起

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

原因

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

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

select oid,relname from pg_class where relname=‘all_data‘;

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

2.將進程殺掉。

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

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

 

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

 

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

殺掉進程

select pg_cancel_backend(‘進程ID‘);

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

總結
select locktype,database,pid,relation ,mode from pg_locks where relation=上面oid;select * from pg_stat_activity where pid = 上面pidselect pg_terminate_backend(上面pid);
刪除資料庫說被連結

異常

db_v43=> drop database test_db;ERROR:  database "test_db" is being accessed by other usersDETAIL:  There is 1 other session using the database.

解決

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=‘資料庫名‘ AND pid<>pg_backend_pid(); 

然後就可以刪除資料庫了

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.