sql >> Database >  >> RDS >> PostgreSQL

Postgres:vacuümcommando ruimt dode tupels niet op

Gebruik VACUUM (VERBOSE) om gedetailleerde statistieken te krijgen van wat het doet en waarom.

Er zijn drie redenen waarom dode tupels niet kunnen worden verwijderd:

  1. Er is een langlopende transactie die niet is afgesloten. Je kunt de slechteriken vinden met

    SELECT pid, datname, usename, state, backend_xmin
    FROM pg_stat_activity
    WHERE backend_xmin IS NOT NULL
    ORDER BY age(backend_xmin) DESC;
    

    U kunt een transactie verwijderen met pg_cancel_backend() of pg_terminate_backend() .

  2. Er zijn voorbereide transacties die niet zijn vastgelegd. Je kunt ze vinden met

    SELECT gid, prepared, owner, database, transaction
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    

    Gebruiker COMMIT PREPARED of ROLLBACK PREPARED om ze te sluiten.

  3. Er zijn replicatieslots die niet worden gebruikt. Vind ze met

    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    

    Gebruik pg_drop_replication_slot() om een ​​ongebruikt replicatieslot te verwijderen.



  1. Kan offset-naïeve en offset-bewuste datetimes niet aftrekken

  2. Postgres-fout bij bijwerken van kolomgegevens

  3. PostgreSQL-overerving met JPA, Hibernate

  4. Verschil tussen SET autocommit=1 en START TRANSACTION in mysql (Heb ik iets gemist?)