GP如何處理鎖引起的任務阻塞

第一步 查詢因鎖表而等待的任務或者語句

--當發現任務長時間無法結束時很大概率是因爲別的進程(很大概率是某些長時間持有資源不釋放的異常程序訪問進程)持有了其訪問資源的鎖,而處在等待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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章