Gostaria de particionar uma tabela com mais de 1 milhão de linhas por intervalo de datas. Como isso é feito normalmente sem exigir muito tempo de inatividade ou correr o risco de perder dados? Aqui estão as estratégias que estou considerando, mas aberto 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 de tempo em que alguns dos dados estarão na tabela mestra e outros nos filhos.
Crie uma nova tabela mestre e filhas. Crie uma cópia dos dados na tabela existente nas tabelas filhas (para que os dados residam em dois locais). Depois que as tabelas filhas tiverem os dados mais recentes, altere todas as inserções para apontar para a nova tabela mestre e exclua a tabela existente.
Como o nº 1 requer a cópia de dados do mestre para o filho enquanto ele está em um ambiente de produção ativo, eu pessoalmente fui com o nº 2 (criar um novo mestre). Isso evita interrupções na tabela original enquanto ela estiver em uso ativo e, se houver algum problema, posso excluir facilmente o novo mestre sem problemas e continuar usando a tabela original. Aqui estão os passos para fazê-lo:
Crie uma nova tabela mestra.
Crie filhos que herdam do mestre.
Copie todos os dados históricos para a nova tabela mestra
Pausar temporariamente novas inserções/atualizações no banco de dados de produção
Copie os dados mais recentes para a nova tabela mestra
Renomeie as tabelas para que new_master se torne o banco de dados de produção.
Adicione função para instruções INSERT em old_master para que os dados sejam passados para a partição correta.
Adicionar gatilho para que a função seja chamada em INSERTS
Definir exclusão de restrição como ATIVADO
Reative UPDATES e INSERTS no banco de dados de produção
Configure o gatilho ou cron para que novas partições sejam criadas e a função seja atualizada para atribuir novos dados à partição correta. Consulte este artigo para exemplos de código
Excluir old_master_backup
Existe uma nova ferramenta chamada pg_pathman ( https://github.com/postgrespro/pg_pathman ) que faria isso para você automaticamente.
Então, algo como o seguinte faria isso.