PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres:il comando vacuum non ripulisce le tuple morte

Usa VACUUM (VERBOSE) per ottenere statistiche dettagliate su cosa sta facendo e perché.

Ci sono tre ragioni per cui le tuple morte non possono essere rimosse:

  1. C'è una transazione di lunga durata che non è stata chiusa. Puoi trovare i ragazzacci con

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

    Puoi sbarazzarti di una transazione con pg_cancel_backend() o pg_terminate_backend() .

  2. Ci sono transazioni preparate che non sono state commesse. Li puoi trovare con

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

    Utente COMMIT PREPARED o ROLLBACK PREPARED per chiuderli.

  3. Ci sono slot di replica che non vengono utilizzati. Trovali con

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

    Usa pg_drop_replication_slot() per eliminare uno slot di replica inutilizzato.