Gostaria de particionar uma tabela com mais de 1 milhão de linhas por período. Como isso é comumente feito sem exigir muito tempo de inatividade ou correr o risco de perder dados? Aqui estão as estratégias que estou considerando, mas abertas a sugestões:
A tabela existente é o mestre e os filhos herdam dela. Com o tempo, mova os dados do mestre para o filho, mas haverá um período em que alguns dados estão na tabela mestre e outros nos filhos.
Crie uma nova tabela mestre e filho. Crie uma cópia dos dados na tabela existente nas tabelas filho (para que os dados residam em dois locais). Depois que as tabelas filho tiverem os dados mais recentes, altere todas as inserções daqui para frente para apontar para a nova tabela mestre e excluir a tabela existente.
fonte
DELETE FROM ONLY master_table
é a solução.Respostas:
Como o número 1 exige a cópia de dados do mestre para o filho enquanto ele estiver em um ambiente de produção ativo, eu pessoalmente fui com o número 2 (criando um novo mestre). Isso evita interrupções na tabela original enquanto ela estiver ativamente em uso e, se houver algum problema, eu posso excluir facilmente o novo mestre sem problemas e continuar usando a tabela original. Aqui estão as etapas para fazer isso:
Crie uma nova tabela mestre.
Crie filhos que herdam do mestre.
Copie todos os dados históricos para a nova tabela mestre
Pausar temporariamente novas inserções / atualizações no banco de dados de produção
Copie os dados mais recentes para a nova tabela mestre
Renomeie as tabelas para que new_master se torne o banco de dados de produção.
Inclua a função para instruções INSERT em old_master para que os dados sejam passados para a partição correta.
Adicione gatilho para que a função seja chamada INSERTS
Defina a exclusão de restrição como ON
Reativar UPDATES e INSERTS no banco de dados de produção
Configure trigger ou cron para que novas partições sejam criadas e a função seja atualizada para atribuir novos dados à correção da partição. Consulte este artigo para exemplos de código
Excluir old_master_backup
fonte
vacuum
não atualizar ou ser impedido devido a sessões "inativas na transação".Há uma nova ferramenta chamada pg_pathman ( https://github.com/postgrespro/pg_pathman ), que iria fazer isso para você automaticamente.
Então, algo como o seguinte faria isso.
fonte