Freezing and transaction ID wraparound
In this recipe, we will be discussing a few other aspects of the VACUUM
process.
Getting ready
As we discussed in the previous recipe, each row in PostgreSQL contains xmin
and xmax
values in its header, which define the transaction status. For each implicit/explicit transaction, PostgreSQL allots a number to that transaction as a transaction ID. As transaction ID is a number, which should have its boundaries like the maximum and minimum values it should allow, since we cannot generate an infinite amount of numbers.
As any number should be a definite value, PostgreSQL chooses a 4-byte integer as a definite number for these transaction IDs. That is, the maximum transaction ID we can generate with 4 bytes is 2^32 ~ 4294967296, which is 4 billion transaction IDs. However, PostgreSQL is capable enough to handle the unlimited number of transactions with the 4-byte integer, by rotating the transaction IDs from 1 to 2^31 ~ 2147483648. That is, if PostgreSQL reaches...