暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

gp 无法 drop 表

收到业务侧在某集群无法正常 drop 表的情况。就是执行 drop 语句这条会话会卡在那里,也没有任何报错提示。


遇到这种情况第一时间想的是会不会两条调度同时对一张表执行 dml 操作导致的冲突,也就是锁表。于是第一时间查看当前会话。


select * from pg_stat_activity where current_query <> ‘<IDLE>’::text;


加上 where 条件可以去除空闲会话。


但是 drop 的时候集群空闲,只有这一个会话。


那会不会是在 segment 节点的锁冲突导致呢,因为 greenplum 数据库中的每个 segment 节点都是相当于一个独立的 pg 数据库,完全可能出现这种情况。


但是这样的会话怎么定位?生产集群有几十台主机几百个实例总不能一个一个实例登录吧。


这里有个方法,在 gp 数据库中所有执行的调度中会在 Linux 层面显示 sess_id。


+



上图不是问题会话,如果在 segment 节点有残留会话会在 idle 的位置显示 waiting。


找到残留会话就需要登录那个实例


PGOPTIONS="-c gp_session_role=utility" psql -hip -p 端口号 -d 实例名


然后查看所有的会话


select * from pg_stat_activity where current_query <> ‘<IDLE>’::text;


注意看会话开始执行的时间,一般残留会话都是几天前的会话。或者看有没有调度使用到了 drop 的表。直接清理。


select pg_terminate_backend(‘procpid’);


这样就解决了这个问题。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论