"Can't fit xid into page" Is Reported
Symptom
Scenario 1: Error Can't fit xid into page, now xid is 34181619720, base is 29832807366, min is 3, max is 3. is reported when VACUUM FULL is executed.
Scenario 2: When a non-VACUUM FULL operation is performed, for example, granting function operation permissions to a user, the error message Can't fit xid into page. relation pg_proc", now xid is 34181619720, base is 29832807366, min is 3, max is 3. is displayed.
Possible Causes
An old transaction exists in the system.
Handling Procedure
Handling procedure for scenario 1:
- Check whether there are old transactions.
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)
- If the value of oldestxmin in the query result is close to the xid 34181619720 in the error message and is greater than the values of base+min and base+max, old transactions do not affect the FREEZE operation. In this case, perform Step 4.
- If the value of oldestxmin in the query result is much smaller than base+min, there are old transactions in the system and VACUUM FREEZE does not take effect. In this case, perform Step 2.
- Run the following command to query information about old transactions in the cluster:
1 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;
- Query workloads in Step 2 in the pgxc_stat_activity view and run the following command to stop the corresponding threads:
1SELECT pg_terminate_backend(pid) FROM pgxc_running_xacts where xmin::text::bigint <$base+$min and xmin::text::bigint > 0;
pgxc_running_xacts can only query active transactions on CNs. If the error is reported on a DN, query the pg_running_xacts view on the DN.
- Run the VACUUM FULL FREEZE statement on the table that reports the error.
VACUUM FULL FREEZE table_name;
Handling procedure for scenario 2:
Clear the transactions by referring to Step 2 and Step 3 in scenario 1. You do not need to perform the VACUUM FULL FREEZE operation.