
# 执行业务报错"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. 排查是否存在老事务。 
   ```
   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. 使用如下命令查询集群中老事务信息。
   
   ```
   SELECT * FROM pgxc_running_xacts where xmin::text::bigint < $base+$min and xmin::text::bigint > 0;
   SELECT * FROM pgxc_running_xacts where gxid::text::bigint < $base+$min and gxid::text::bigint > 0;
   ```
   
   
3. 通过pgxc_stat_activity视图查询[步骤2]中的业务，确认后执行如下命令终止对应的线程。
   
   ```
   SELECT pg_terminate_backend(pid) FROM pgxc_running_xacts where xmin::text::bigint <$base+$min  and xmin::text::bigint > 0;
   ```
   ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/note_3.0-zh-cn.png)
   pgxc_running_xacts只能查询CN上的活跃事务。如果报错的是DN，需要到对应DN上使用pg_running_xacts视图进行查询。
   
   
4. 对报错表执行VACUUM FULL FREEZE。
   
   ```
   VACUUM FULL FREEZE table_name;
   ```
   
   
场景二处理步骤：
非VACUUM FULL操作中的报错信息，可以确认系统中存在老事务，按照场景一中的[步骤2]和[步骤3]清理掉后即可，无需再继续执行VACUUM FULL FREEZE。
