Postgresql

使用 PostgreSQL COPY 命令到標準輸出然後立即從標準輸入讀取它的含義

  • September 9, 2018

在兩個數據庫之間傳輸數據時,我想知道以下方法是否有任何缺點:

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(使用管道或使用中間文件)消除了大部分警告。然而,關於性能和外鍵的警告仍然存在。

引用自:https://dba.stackexchange.com/questions/217099