2010-10-20 42 views
20

我需要將大表導出爲csv文件並對其進行壓縮。導出爲CSV並使用Postgres中的GZIP壓縮

我可以用COPY命令從Postgres的出口像 -

COPY foo_table to '/tmp/foo_table.csv' delimiters',' CSV HEADER;

然後就可以使用gzip喜歡它壓縮 -

gzip -c foo_table.csv > foo.gz

這種方法的問題是,我需要創建這個中間的csv文件,這本身是巨大的,在我得到我的最終壓縮文件之前。

有沒有辦法在csv中導出表並在一個步驟中壓縮文件?

問候, Sujit

+0

如果它不一定是CSV,你可以使用pg_dump,如:'pg_dump -Z 5' – 2010-10-20 19:58:31

回答

37

訣竅就是讓COPY,然後通過管道將輸出通過的gzip其輸出發送到stdout:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \ 
    | gzip > foo_table.csv.gz 
+0

完美,它工作! – Sujit 2010-10-20 20:23:00

+2

可以使用pigz(多線程gzip)代替gzip來實現更快速的壓縮。通常gzip是瓶頸。 – sivann 2015-01-12 15:05:20

5

擴大對@喬伊的回答了一下,下面增加了對支持the manual中提供了更多功能。

psql -c "COPY \"Foo_table\" (column1, column2) TO stdout DELIMITER ',' CSV HEADER" \ 
    | gzip > foo_table.csv.gz 

如果你在你的表名大寫字母(禍哉到你),你前和表名後需要\"

我添加的第二件事是列出列表。

而且從文檔注意:

此操作不象SQL COPY命令這樣高效,因爲所有數據必須通過客戶端/服務器連接。對於大量數據,SQL命令可能更可取。