• Alvaro Herrera's avatar
    Improve vacuum code to track minimum Xids per table instead of per database. · d4cef0aa
    Alvaro Herrera authored
    To this end, add a couple of columns to pg_class, relminxid and relvacuumxid,
    based on which we calculate the pg_database columns after each vacuum.
    
    We now force all databases to be vacuumed, even template ones.  A backend
    noticing too old a database (meaning pg_database.datminxid is in danger of
    falling behind Xid wraparound) will signal the postmaster, which in turn will
    start an autovacuum iteration to process the offending database.  In principle
    this is only there to cope with frozen (non-connectable) databases without
    forcing users to set them to connectable, but it could force regular user
    database to go through a database-wide vacuum at any time.  Maybe we should
    warn users about this somehow.  Of course the real solution will be to use
    autovacuum all the time ;-)
    
    There are some additional improvements we could have in this area: for example
    the vacuum code could be smarter about not updating pg_database for each table
    when called by autovacuum, and do it only once the whole autovacuum iteration
    is done.
    
    I updated the system catalogs documentation, but I didn't modify the
    maintenance section.  Also having some regression tests for this would be nice
    but it's not really a very straightforward thing to do.
    
    Catalog version bumped due to system catalog changes.
    d4cef0aa
pg_class.h 5.68 KB