文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 数据库使用/ 执行业务报错“Can't fit xid into page”
更新时间:2024-07-01 GMT+08:00

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

问题现象

场景一:执行VACUUM FULL时报错“Can't fit xid into page, now xid is 34181619720, base is 29832807366, min is 3, max is 3.”。

场景二:其他非VACUUM FULL操作,例如业务场景中给用户赋予函数的操作权限时,报错信息“Can't fit xid into page. relation "pg_proc", now xid is 34181619720, base is 29832807366, min is 3, max is 3.”。

原因分析

系统中存在老事务导致上述报错。

处理方法

场景一处理步骤:

  1. 排查是否存在老事务。

    1
    2
    3
    4
    5
    SELECT * FROM pgxc_gtm_snapshot_status();
         xmin    |    xmax     |      csn     | oldestxmin   |   xcnt | running_xids
    -------------+-------------+--------------+--------------+--------+---------------
     34730350588 | 34730350588 |  34730350553 | 34730350553  |    0
    (1 row)
    
    • 如果查询结果中oldestxmin与报错中xid“34181619720”十分接近,且大于base+min和base+max, 说明系统中老事务不会影响freeze作业,可直接执行步骤4
    • 如果查询结果中oldestxmin小于base+min,且小很多,说明系统中存在老事务,且导致vacuum freeze执行未产生作用,需继续执行步骤2

  2. 使用如下命令查询集群中老事务信息。

    1
    SELECT * FROM pgxc_running_xacts where xmin::text::bigint < $base+$min and xmin::text::bigint > 0;
    

  3. 通过pgxc_stat_activity视图查询步骤2中的业务,确认后执行如下命令终止对应的线程。

    1
    SELECT pg_terminate_backend(pid) FROM pgxc_running_xacts where xmin::text::bigint <$base+$min  and xmin::text::bigint > 0;
    

    pgxc_running_xacts只能查询CN上的活跃事务。如果报错的是DN,需要到对应DN上使用pg_running_xacts视图进行查询。

  4. 对报错表执行VACUUM FULL FREEZE。

    VACUUM FULL FREEZE table_name;

  5. 登录GaussDB(DWS)管理控制台,查看vacuum_freeze_min_age参数,如果设置值为50亿,则按照以下方式重新设置为20亿:

    在集群列表中找到所需集群,单击集群名称,进入“集群详情”页面。单击“参数修改”页签,修改vacuum_freeze_min_age参数值,然后单击“保存”。

场景二处理步骤:

非VACUUM FULL操作中的报错信息,可以确认系统中存在老事务,按照场景一中的步骤2步骤3清理掉后即可,无需再继续执行VACUUM FULL FREEZE。