Gaussdb(DWS)老事务排查与查杀

举报
-CHEN111- 发表于 2025/06/06 15:26:08 2025/06/06
【摘要】 老事务排查与查杀

执行业务报错“Can't fit xid into page”

排查集群中是否存在新老事务号差值超过42亿的情况

步骤1:创建事务号查询函数
CREATE OR REPLACE FUNCTION public.pgxc_all_running_xacts()
 RETURNS SETOF pg_running_xacts
 LANGUAGE plpgsql
 NOT FENCED NOT SHIPPABLE
AS $function$                                                                      
DECLARE                                                                    
    row_data pg_running_xacts%rowtype;                                 
    row_name record;                                                   
    query_str text;                                                    
    query_str_nodes text;                                              
    BEGIN                                                              
        --Get all the coordinator node names                       
        query_str_nodes := 'SELECT node_name FROM pgxc_node';
        FOR row_name IN EXECUTE(query_str_nodes) LOOP              
            query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM pg_running_xacts''';
            FOR row_data IN EXECUTE(query_str) LOOP            
                return next row_data;                      
            END LOOP;                                          
        END LOOP;                                                  
        return;                                                    
    END; $function$;
步骤2:排查新老事务号差值42亿以上的老事务
select txid_current() as current,xmin,current-xmin::text::bigint as txid_diff,node,pid from pgxc_all_running_xacts() where xmin::text::bigint !=0 and txid_diff>=4200000000 order by xmin::text::bigint;
步骤3:拼接老事务(事务号与当前最新事务号差值大于1亿,注意:需要将$xmin替换成步骤2中第二列xmin对应值)检查查杀SQL
select 'execute direct on('||node||') ''select pg_terminate_backend('||pid||')'';' killSql,'execute direct on('||node||') ''select query_id,query from pg_stat_activity where pid='||pid||''';' checkSql, txid_current() as current,xmin,node,pid from pgxc_all_running_xacts() where xmin::text::bigint !=0 and current-xmin::text::bigint>=4200000000 and gxid::text::bigint=$xmin order by xmin::text::bigint;
步骤4:
根据步骤2中记录,先执行第二列checkSql对应语句,明确具体业务,业务侧决策是否可以查杀,如果可以查杀,则执行第一列killSql对应语句
步骤5:
此时再执行步骤2语句,明确老事务是否查杀成功,若未成功,则需要kill对应dn实例

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。