PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres:Der Vakuumbefehl bereinigt keine toten Tupel

Verwenden Sie VACUUM (VERBOSE) um detaillierte Statistiken darüber zu erhalten, was es tut und warum.

Es gibt drei Gründe, warum tote Tupel nicht entfernt werden können:

  1. Es gibt eine lange laufende Transaktion, die noch nicht abgeschlossen wurde. Du kannst die bösen Jungs finden mit

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

    Sie können eine Transaktion mit pg_cancel_backend() loswerden oder pg_terminate_backend() .

  2. Es gibt vorbereitete Transaktionen, die nicht festgeschrieben wurden. Sie finden sie mit

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

    Benutzer COMMIT PREPARED oder ROLLBACK PREPARED um sie zu schließen.

  3. Es gibt Replikationsslots, die nicht verwendet werden. Finden Sie sie mit

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

    Verwenden Sie pg_drop_replication_slot() um einen unbenutzten Replikationsslot zu löschen.