Ao transferir dados entre dois bancos de dados, gostaria de saber se há alguma desvantagem na seguinte abordagem:
psql -h [HOST1] -U postgres -d [DB1] -c [SQL1] | psql -h [HOST2] -d [DB2] -U postgres -c [SQL2]
Onde
[SQL1]="\copy (SELECT [FIELDS_SUBSET] FROM [TABLE_NAME]) TO STDOUT"
[SQL2]="\copy [NEW_TABLE_NAME]( [FIELDS_SUBSET] ) FROM STDIN"
Basicamente, extraio alguns dados do DB1 para o stdout e, em seguida, leio-os imediatamente do stdin para importar esses dados para o DB2. Ambos os bancos de dados estão em redes diferentes. Essa abordagem elimina a necessidade de um arquivo intermediário.
Neste contexto, gostaria de saber se esta estratégia tem alguma desvantagem se comparada ao uso de arquivos intermediários. Por exemplo, essa abordagem é adequada para transferir grandes volumes de dados (GBs de dados)?
Além disso, usando COPY com STDIN e STDOUT, ainda preciso me preocupar com as advertências do comando COPY? ( Referência )
A desvantagem é que, se a operação falhar no meio do caminho devido a um soluço de rede, uma reinicialização do HOST1 ou algo parecido, você fez muito trabalho no DB2 que precisa ser revertido e repetido. Isso pode explodir seu arquivo WAL e pode levar ao inchaço da tabela se você não limpar a tabela no DB2 antes de repetir a operação. Eu o colocaria em um arquivo de armazenamento local no HOST2 primeiro, a menos que tivesse um bom motivo para não fazê-lo.
A maioria das advertências para as quais você vincula são sobre o PostgreSQL interpretando o formato de dados de uma maneira diferente do Excel, Python, Perl, seres humanos, etc. podem interpretá-lo. Passar do PostgreSQL para o PostgreSQL (com um pipe ou usando um arquivo intermediário) elimina a maioria dessas ressalvas, supondo que você escolha as mesmas opções para \copiar em cada extremidade e tenha a mesma estrutura de tabela. As advertências sobre desempenho e chaves estrangeiras, no entanto, permanecem.