標籤: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死結處理