在postgres中导出为CSV并使用GZIP压缩

Suj*_*jit 24 compression postgresql backup gzip

我需要将一个大表导出到csv文件并压缩它.

我可以使用来自postgres的COPY命令导出它 -

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

然后可以使用gzip压缩它 -

gzip -c foo_table.csv > foo.gz

这种方法的问题是,在得到最终的压缩文件之前,我需要创建这个中间的csv文件,它本身就很庞大.

在csv中有导出表的方法并一步压缩文件吗?

此致,Sujit

Joe*_*ams 45

诀窍是COPY将其输出发送到stdout,然后通过gzip管道输出:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz
Run Code Online (Sandbox Code Playgroud)

  • 可以使用pigz(多线程gzip)代替gzip来实现更快的压缩.通常gzip是瓶颈. (4认同)

mli*_*ner 7

在@ Joey的回答中进一步扩展,下面增加了对手册中可用的更多功能的支持.

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

如果你的表名中有大写字母(祸害就在你身上),你需要\"在表名之前和之后.

我添加的第二件事是列列表.

另请注意文档:

此操作不如SQL COPY命令有效,因为所有数据都必须通过客户端/服务器连接.对于大量数据,SQL命令可能更可取.


abh*_*kla 7

您可以根据文档直接使用https://www.postgresql.org/docs/9.4/sql-copy.html

COPY foo_table to PROGRAM 'gzip > /tmp/foo_table.csv' delimiters',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)