基於postgresql數據庫鎖表問題的解決

查詢是否鎖表瞭

select oid from pg_class where relname=’可能鎖表瞭的表’

select pid from pg_locks where relation=’上面查出的oid’

如果查詢到瞭結果,表示該表被鎖 則需要釋放鎖定

select pg_cancel_backend(上面查到的pid)

補充:PostgreSQL 解決鎖表、死鎖問題

1.– 查詢ACTIVITY的狀態等信息

SELECT T
 .PID,
 T.STATE,
 T.QUERY,
 T.WAIT_EVENT_TYPE,
 T.WAIT_EVENT,
 T.QUERY_START  
FROM
 PG_STAT_ACTIVITY T
WHERE
 T.DATNAME = '數據庫用戶名';

上面查詢結果中:pid就是ACTIVITY的唯一標識,state就是活動狀態,query就是正在執行的sql語句,query——start就是開始執行的時間。

2.– 查詢死鎖的ACTIVITY

SELECT T
 .PID,
 T.STATE,
 T.QUERY,
 T.WAIT_EVENT_TYPE,
 T.WAIT_EVENT,
 T.QUERY_START  
FROM
 PG_STAT_ACTIVITY T 
WHERE
 T.DATNAME = '數據庫用戶名' 
 AND T.WAIT_EVENT_TYPE = 'Lock';

3.將第二條查詢語句的pid字段的數字值記錄下來,執行下面的查詢語句可以解鎖:

— 通過pid解鎖對應的ACTIVITY

select PG_CANCEL_BACKEND(‘6984’);

上面的查詢語句,執行瞭pg_cancel_backend()函數,該函數是取消後臺操作,回滾未提交事物的用途。

4.解決idle in transaction

select pg_terminate_backend (‘21967’)

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: