2010-10-20 25 views
20

Tôi cần xuất một bảng lớn sang tệp csv và nén nó.Xuất sang CSV và Nén bằng GZIP trong postgres

Tôi có thể xuất nó sử dụng lệnh COPY từ postgres như -

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

Và sau đó có thể nén nó bằng gzip như -

gzip -c foo_table.csv > foo.gz

Vấn đề với phương pháp này là, tôi cần phải tạo tệp csv trung gian này, bản thân nó rất lớn, trước khi tôi nhận được tệp nén cuối cùng của mình.

Có cách nào xuất bảng trong csv và nén tệp trong một bước không?

Kính trọng, Sujit

+0

Nếu nó không nhất thiết phải là CSV, bạn có thể sử dụng pg_dump, như trong: 'pg_dump -Z 5' –

Trả lời

37

Bí quyết là để làm cho COPY gửi sản lượng của nó để stdout, sau đó ống đầu ra thông qua gzip:

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

hoàn hảo, nó đã hoạt động! – Sujit

+2

người ta có thể sử dụng pigz (gzip đa luồng) thay vì gzip để nén nhanh hơn. Thông thường gzip là nút chai. – sivann

5

Mở rộng một chút trên @ câu trả lời của Joey, dưới đây thêm hỗ trợ cho một vài tính năng khác có sẵn trong the manual.

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

Nếu bạn có chữ cái viết hoa trong tên bảng của bạn (xin bạn đừng), bạn cần \" trước và sau tên bảng.

Điều thứ hai tôi đã thêm là danh sách cột.

Cũng lưu ý từ các tài liệu:

hoạt động này là không hiệu quả như lệnh SQL COPY bởi vì tất cả dữ liệu phải đi qua các kết nối client/server. Đối với một lượng lớn dữ liệu, lệnh SQL có thể thích hợp hơn.