Recuperar espaço de armazenamento por meio de limpeza - Amazon Aurora

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ções VACUUM e ANALYZE. Para obter mais informações sobre como ANALYZE 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 VACUUM na documentação do PostgreSQL. Para obter mais informações sobre o suporte a VACUUM no Aurora PostgreSQL Limitless Database, consulte VACUUM.

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 e Storage parameters na documentação do PostgreSQL.

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.

  1. Uma tabela de clientes é distribuída em quatro fragmentos.

  2. 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.

  3. A transação 2 começa mais tarde, exclui todas as tuplas de uma tabela e, em seguida, é confirmada.

  4. Se AUTOVACUUM ou VACUUM 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. O exemplo a seguir consulta a visualização.

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, e limitless_stat_activity em vez de pg_stat_activity.

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. O exemplo a seguir consulta a função.

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. O exemplo a seguir consulta a visualização.

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.