第一步 查詢因鎖表而等待的任務或者語句
--當發現任務長時間無法結束時很大概率是因爲別的進程(很大概率是某些長時間持有資源不釋放的異常程序訪問進程)持有了其訪問資源的鎖,而處在等待lock狀態 select pid,* from pg_catalog.pg_stat_activity where waiting_reason = 'lock'
第二步 查詢哪些進程持有鎖而導致任務等待
查詢任務所要訪問的資源oid,然後根據oid查詢其上的鎖情況,然後根據pid查詢哪個客戶端和語句引起的 select oid,relname,* from pg_class where relname in ('tablename'); select pid,mode,* from pg_locks where relation = oid; select pid,usename,client_addr,query,* from pg_catalog.pg_stat_activity where pid = pid; 另注1:輔助查詢分析鎖衝突 select pid,* from pg_catalog.pg_stat_activity where query like '%tablename%' 另注2:輔助查詢分析鎖衝突 select * from gp_toolkit.gp_locks_on_relation glor where lorrelname like '%tablename%'
第三步 kill非正常佔用資源的pid,釋放資源上的鎖
select pg_cancel_backend(pid); 或 select pg_terminate_backend(pid);