在两个数据库之间传输数据时,我想知道以下方法是否有任何缺点:
psql -h [HOST1] -U postgres -d [DB1] -c [SQL1] | psql -h [HOST2] -d [DB2] -U postgres -c [SQL2]
在哪里
[SQL1]="\copy (SELECT [FIELDS_SUBSET] FROM [TABLE_NAME]) TO STDOUT"
[SQL2]="\copy [NEW_TABLE_NAME]( [FIELDS_SUBSET] ) FROM STDIN"
基本上,我从 DB1 提取一些数据到标准输出,然后我立即从标准输入读取它,以便将这些数据导入 DB2。两个数据库位于不同的网络中。这种方法消除了对中间文件的需要。
在这种情况下,我想知道与使用中间文件相比,这种策略是否有任何缺点。例如,这种方法是否适合传输大量数据(GB 数据)?
此外,通过将 COPY 与 STDIN 和 STDOUT 一起使用,我还需要担心 COPY 命令警告吗?(参考)
缺点是,如果由于网络中断、HOST1 重新启动或类似原因导致操作在中途失败,那么您在 DB2 上做了很多需要回滚和重复的工作。如果在重复操作之前不清理 DB2 中的表,这可能会破坏您的 WAL 存档,并且可能导致表膨胀。我会先将它假脱机到 HOST2 上的本地存储文件,除非我有充分的理由不这样做。
您链接到的大多数警告都是关于 PostgreSQL 以不同于 Excel、Python、Perl、人类等可能解释它的方式解释数据格式的。假设您在每一端选择相同的选项来 \copy 并具有相同的表结构,那么从 PostgreSQL 到 PostgreSQL(使用管道或使用中间文件)消除了大部分警告。然而,关于性能和外键的警告仍然存在。