锁表排查
方式一
1、查询当前锁表的相关信息
Greenplum提供了一个视图(gp_toolkit.gp_locks_on_relation)用来查看当前的锁信息情况,执行查询如下:
select * from gp_toolkit.gp_locks_on_relation ;
通过活动查询视图来看一下所有查询目前的状态:(状态可能是active–正在执行,状态也可能是idle–执行完成 )
select * from pg_stat_activity;
2、通过活动查询视图来看一下该查询目前的状态:
(pg_stat_activity表的pid字段关联gp_locks_on_relation 表的字段lorpid )
select pid,a.* from pg_stat_activity a where a.pid in (select lorpid from gp_toolkit.gp_locks_on_relation );
3、关闭导致死锁的事务
注意:系统表存在一个事务进程,会一直锁着部分系统表,关闭时请注意pid是不是属于自己启动的事务
如果是查询,使用:select pg_cancel_backend(pid);
如果是其他:使用:select pg_terminate_backend(pid);
方式二
查询因为锁表而等待的语句
----因为锁表而等待的语句
select
*
from
pg_stat_activity
where
waiting_reason = 'lock'
--and datname='apldb'
;
锁表查询
--锁表查询
select
distinct b.pid
from
pg_class a,
pg_locks b
where
a.oid = b.relation
--and a.relname='table_name'
;
--此处查询结果中的pid包含系统表,杀会话的时候请注意,查询是最好添加表名称
--如果查询所有,请使用下面的sql
select
a.relname, b.pid
from
pg_class a,
pg_locks b
where
a.oid = b.relation
--and a.relname='table_name'
;
锁表处理
--如果是查询,使用:
select pg_cancel_backend(pid);
--如果是其他:使用
select pg_terminate_backend(pid);
杀掉所有其他无用会话
--杀掉hxods下gpadmin用户所有不活跃的无效的会话
select pg_terminate_backend(pid) from pg_stat_activity WHERE datname='hxods' and usename = 'gpadmin' and state = 'idle';