PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres :la commande vacuum ne nettoie pas les tuples morts

Utilisez VACUUM (VERBOSE) pour obtenir des statistiques détaillées sur ce qu'il fait et pourquoi.

Il y a trois raisons pour lesquelles les lignes mortes ne peuvent pas être supprimées :

  1. Il existe une transaction de longue durée qui n'a pas été fermée. Vous pouvez trouver les mauvais garçons avec

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

    Vous pouvez vous débarrasser d'une transaction avec pg_cancel_backend() ou pg_terminate_backend() .

  2. Il existe des transactions préparées qui n'ont pas été validées. Vous pouvez les trouver avec

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

    Utilisateur COMMIT PREPARED ou ROLLBACK PREPARED pour les fermer.

  3. Il existe des emplacements de réplication qui ne sont pas utilisés. Trouvez-les avec

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

    Utilisez pg_drop_replication_slot() pour supprimer un emplacement de réplication inutilisé.