今天遇到一個奇怪的現象,select和delete表時正常執行,但truncate和drop表時會一直運行,也不報錯。sql
查了些資料才發現問題的緣由,總結以下:數據庫
"drop table " 和 "truncate table " 須要申請排它鎖 "ACCESS EXCLUSIVE ", 執行這個命令卡住時,說明此時這張表上還有操做正在進行,好比查詢等,
那麼只有等待這個查詢操做完成,"drop table" 或"truncate table"或者增長字段的SQL 才能獲取這張表上的 "ACCESS EXCLUSIVE" 鎖 ,操做才能進行下去。
函數
1.檢索出死鎖進程的ID。spa
SELECT * FROM pg_stat_activity WHERE datname='死鎖的數據庫ID ';對象
檢索出來的字段中,【wating 】字段,數據爲t的那條,就是死鎖的進程。找到對應的【procpid 】列的值。進程
2.將進程殺掉。it
SELECT pg_cancel_backend('死鎖那條數據的procpid值 ');io
結果:運行完後,再次更新這個表,sql順利執行。table
若是pg_stat_activity 沒有記錄,則查詢pg_locks是否有這個對象的鎖class
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()函數也能夠殺掉進程。