语句等锁超时排查解决方法
在平时使用数据库时,可能会出现语句执行不出来,一段时间后报等锁超时的问题。
如下我们执行一条drop语句一直处于该状态,并未返回drop成功或失败的结果,直到20分钟后语句报等锁超时错误。
从执行语句的CN日志中可以看出
1.语句等锁超时了。
2.持锁的线程是281470339382768,对应的语句是statement <select count(*) from aaa;>。
3.执行失败的语句是drop table aaa cascade。
我们可以发现aaa这个表被其他语句使用了,无法被drop。
可以通过持锁语句关键字找出语句执行的CN,杀掉持锁语句再执行目标语句即可,如下:
select * from pgxc_stat_activity where query like '%aaa%' and query not like '%pgxc_stat_activity%';(红色字体手动替换为对应关键字)
连接CN_5005节点CN,执行select pg_terminate_backend(pid); 返回t,可重新执行目标语句。若执行成功,说明持锁语句全被清除,若仍无法执行出结果,可参考如下操作。
1.通过活跃视图查出执行语句的query_id。
2.通过query_id找到等待视图等锁的实例,如下图是在等cn_5005。
3.连接对应实例,执行select * from pg_locks where pid = 281469917855216 对应等待视图的tid;granted为f的是等锁状态,t为持锁状态;如下图等锁的relation为26850。
4.在执行select * from pg_locks where relation = 26850;可以发现该实例有两个语句持锁。
5.select * from pg_stat_activity where pid in (281470171610608, 281470339382768);替换为granted为t的pid。
6.对应持锁语句已经找到,找到持锁语句下发的CN,select pg_terminate_backend(pid),目标语句执行成功。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~
- 点赞
- 收藏
- 关注作者
评论(0)