基於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。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- postgresql表死鎖問題的排查方式
- 解決postgresql 數據庫 update更新慢的原因
- pgsql鎖表後kill進程的操作
- Postgresql – 查看鎖表信息的實現
- Postgresql鎖機制詳解(表鎖和行鎖)