Como duplicar uma enorme tabela do postgres?

29

Eu tenho uma enorme tabela de postgres (10 GB de dados - registros de 160 milhões). A tabela é estática e não há operações de gravação executadas. Quero duplicá-lo, executar gravações, reindexá-lo e, com uma única transação rápida, excluir o antigo e renomear o novo para o nome original.

Qual é a maneira mais rápida de duplicar uma tabela tão grande?

Milovan Zogovic
fonte

Respostas:

55

Geralmente, a maneira mais rápida de duplicar uma tabela é simplesmente:

CREATE TABLE table2 AS SELECT * FROM table1;

INSERTs paralelos podem ser mais rápidos, mas apenas com um subsistema de disco muito rápido (quando os dados são intercalados em muitas unidades). Caso contrário, isso será mais lento.

Depois de concluir a modificação table2, ele poderá receber o novo nome com:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

O DROP TABLEcomando precisa de um bloqueio exclusivo, que afeta os leitores simultâneos de uma maneira que você pode antecipar:

  • DROP aguardará a conclusão de qualquer leitura pendente na tabela de outras transações.
  • Enquanto isso, qualquer nova transação que tente ler essa tabela será colocada em espera e falhará, pois o original table1não existe mais. O erro seria "não foi possível abrir relação com o OID oid "

Para evitar o segundo problema, você pode renomear table1 para, em old_table1 vez de soltá-lo, e depois soltá-lo apenas mais tarde fora da transação, quando esses leitores terminarem. Portanto, a sequência acima se tornaria:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Daniel Vérité
fonte
2
Obrigado cara. Este é exatamente o tipo de explicação que eu estava procurando. Obrigado novamente!
Milovan Zogovic
Se houver índices definidos na tabela2, eles ainda funcionarão depois que a tabela for renomeada?
BamaPookie
1
@BamaPookie confira este para o esquema completo, incluindo índices, restrições e padrões wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel