Recuperar espaço de armazenamento por meio de limpeza
O Controle de Simultaneidade de Várias Versões (MVCC) do PostgreSQL ajuda a preservar a integridade dos dados salvando uma cópia interna das linhas atualizadas ou excluídas até que uma transação seja confirmada ou revertida. Essas cópias, também chamadas de tuplas, podem causar sobrecarga na tabela se não forem limpas regularmente. As instâncias do PostgreSQL ordenam as transações por seus IDs de transação, e o PostgreSQL usa o MVCC baseado em ID de transação para controlar a visibilidade da tupla e fornecer isolamento de transações. Cada transação estabelece um snapshot dos dados e cada tupla tem uma versão. Tanto o snapshot quanto a versão são baseados no ID da transação.
Para limpar os dados, o utilitário VACUUM
executa quatro funções principais no PostgreSQL:
-
VACUUM
: remove versões de linha expiradas, disponibilizando o espaço para reutilização. -
VACUUM FULL
: fornece desfragmentação completa removendo versões de linha inativas e compactando as tabelas, reduzindo o tamanho e aumentando a eficiência. -
VACUUM FREEZE
: protege contra problemas de conclusão do ID da transação marcando as versões mais antigas da linha como congeladas. -
VACUUM ANALYZE
: remove versões de linhas inativas e atualiza as estatísticas de planejamento de consultas do banco de dados. É uma combinação das funçõesVACUUM
eANALYZE
. Para obter mais informações sobre comoANALYZE
funciona no Aurora PostgreSQL Limitless Database, consulte ANALYZE.
Assim como no MVCC, a limpeza no Aurora PostgreSQL é baseada no ID da transação. Se houver uma transação em andamento no início da limpeza, as linhas que ainda estiverem visíveis para essa transação não serão removidas.
Para obter mais informações sobre o utilitário VACUUM
, consulte VACUUMVACUUM
no Aurora PostgreSQL Limitless Database, consulte VACUUM.
Tópicos
AUTOVACUUM
O Aurora PostgreSQL usa os utilitários VACUUM
e AUTOVACUUM
para remover tuplas desnecessárias. O mecanismo subjacente de AUTOVACUUM
e VACUUM
manual é o mesmo; a única diferença é a automação.
AUTOVACUUM
no Aurora PostgreSQL e no Aurora PostgreSQL Limitless Database é uma combinação dos utilitários VACUUM
e ANALYZE
. AUTOVACUUM
determina quais bancos de dados e tabelas limpar, de acordo com uma regra predefinida, como a porcentagem de tuplas inativas e o número de inserções.
Por exemplo, AUTOVACUUM
"acorda" periodicamente para realizar a limpeza. O intervalo é controlado pelo parâmetro autovacuum_naptime
. O valor padrão é 1 minuto. Os valores padrão dos parâmetros de configuração AUTOVACUUM
e VACUUM
são os mesmos do Aurora PostgreSQL Limitless Database e do Aurora PostgreSQL.
O daemon AUTOVACUUM
, se habilitado, emite comandos ANALYZE
automaticamente sempre que o conteúdo de uma tabela for suficientemente alterado. No Aurora PostgreSQL Limitless Database, AUTOVACUUM
emite ANALYZE
em roteadores e fragmentos.
Para obter mais informações sobre o daemon AUTOVACUUM
e os parâmetros de armazenamento de tabela associados a AUTOVACUUM
, consulte The autovacuum daemon
Limpeza baseada em tempo no Aurora PostgreSQL Limitless Database
O Aurora PostgreSQL Limitless Database é um sistema distribuído, o que significa que várias instâncias podem estar envolvidas em uma transação. Portanto, a visibilidade baseada em ID de transação não se aplica. Em vez disso, o Aurora PostgreSQL Limitless Database usa visibilidade baseada em tempo, porque os IDs de transação não são "unificados" entre instâncias, mas o tempo pode ser "unificado" entre instâncias. Cada snapshot de transação e cada versão de tupla obedece ao tempo em vez do ID da transação. Mais especificamente, um snapshot de transação tem um horário de início de snapshot e uma tupla tem um horário de criação (quando INSERT
ou UPDATE
acontece) e um horário de exclusão (quando DELETE
acontece).
Para manter a consistência de dados nas instâncias do grupo de fragmentos de banco de dados, o Aurora PostgreSQL Limitless Database precisa garantir que a limpeza não remova nenhuma tupla que ainda esteja visível para qualquer transação ativa no grupo de fragmentos de banco de dados. Portanto, a limpeza no Aurora PostgreSQL Limitless Database também é baseada em tempo. Outros aspectos do VACUUM
permanecem os mesmos, incluindo que, para executar VACUUM
em uma tabela específica, o usuário deve ter acesso a essa tabela.
nota
É altamente recomendável que você não deixe transações abertas por longos períodos.
A limpeza baseada em tempo consome mais memória do que a limpeza baseada em ID de transação.
O exemplo a seguir ilustra como funciona a limpeza baseada em tempo.
-
Uma tabela de clientes é distribuída em quatro fragmentos.
-
A transação 1 começa com uma leitura repetível e tem como alvo apenas um fragmento (fragmento 1). Essa transação permanece aberta.
A transação 1 é mais antiga do que as transações iniciadas depois dela.
-
A transação 2 começa mais tarde, exclui todas as tuplas de uma tabela e, em seguida, é confirmada.
-
Se
AUTOVACUUM
ouVACUUM
manual tentar limpar tuplas inativas (inativas devido à transação 2), ele não removerá nada.Isso vale não apenas para o fragmento 1, mas também para os fragmentos 2–4, porque a transação 1 ainda pode precisar acessar essas tuplas. Elas ainda estão visíveis para a transação 1 por causa do MVCC.
A última etapa é realizada por meio da sincronização, para que todos os fragmentos estejam cientes da transação 1, mesmo que a transação 1 não afete todos eles.
Usar estatísticas de banco de dados para limpeza
Para obter informações sobre tuplas que talvez você precise limpar, use a visualização limitless_stat_all_tables, que funciona de forma semelhante a pg_stat_all_tables
SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';
Da mesma forma, para estatísticas de banco de dados, use limitless_stat_database em vez de pg_stat_database
Para verificar o uso do disco da tabela, use a função limitless_stat_relation_sizes, que funciona de forma semelhante a pg_relation_size
SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');
Para acompanhar o progresso de uma operação VACUUM
no Aurora PostgreSQL Limitless Database, use a visualização limitless_stat_progress_vacuum em vez de pg_stat_progress_vacuum
SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;
Para ter mais informações, consulte Visualizações do Aurora PostgreSQL Limitless Database e Funções do Aurora PostgreSQL Limitless Database.
Diferenças no comportamento de limpeza entre o Aurora PostgreSQL e o Aurora PostgreSQL Limitless Database
Algumas outras diferenças entre o Aurora PostgreSQL e o Aurora PostgreSQL Limitless Database na forma como a limpeza funciona são as seguintes:
-
O Aurora PostgreSQL executa operações
VACUUM
em IDs de transação até a transação mais antiga em andamento. Se não houver nenhuma transação em andamento no banco de dados,VACUUM
executará a operação até a última transação. -
O Aurora PostgreSQL Limitless Database sincroniza o snapshot de tempo mais antigo a cada 10 segundos. Portanto,
VACUUM
talvez não realize a operação em nenhuma transação que tenha sido executada nos últimos 10 segundos.
Para obter informações sobre o suporte a VACUUM
no Aurora PostgreSQL Limitless Database, consulte VACUUM em Referência do Aurora PostgreSQL Limitless Database.