PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres:comando vácuo não limpa tuplas mortas


Use VACUUM (VERBOSE) para obter estatísticas detalhadas do que está fazendo e por quê.

Existem três razões pelas quais as tuplas mortas não podem ser removidas:

  1. Há uma transação de longa duração que não foi fechada. Você pode encontrar os bad boys com
    SELECT pid, datname, usename, state, backend_xmin
    FROM pg_stat_activity
    WHERE backend_xmin IS NOT NULL
    ORDER BY age(backend_xmin) DESC;
    

    Você pode se livrar de uma transação com pg_cancel_backend() ou pg_terminate_backend() .

  2. Existem transações preparadas que não foram comprometidas. Você pode encontrá-los com
    SELECT gid, prepared, owner, database, transaction
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    

    Usuário COMMIT PREPARED ou ROLLBACK PREPARED para fechá-los.

  3. Existem slots de replicação que não são usados. Encontre-os com
    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    

    Use pg_drop_replication_slot() para excluir um slot de replicação não utilizado.