2010-10-20 6 views
20

Ich muss eine große Tabelle in CSV-Datei exportieren und komprimieren.Export in CSV und komprimieren mit GZIP in Postgres

Ich kann es exportieren von Postgres COPY-Befehl wie -

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

Und dann kann es mit gzip komprimieren wie -

gzip -c foo_table.csv > foo.gz

Das Problem bei diesem Ansatz ist, dass ich müssen diese Zwischen-csv-Datei erstellen, die selbst riesig ist, bevor ich meine endgültige komprimierte Datei bekomme.

Gibt es eine Möglichkeit, die Tabelle in CSV zu exportieren und die Datei in einem Schritt zu komprimieren?

Grüße, Sujit

+0

Wenn es nicht unbedingt CSV sein muss, könnten Sie pg_dump verwenden, wie in: 'pg_dump -Z5' –

Antwort

37

Der Trick COPY schicken seine Ausgabe an stdout zu machen, dann leiten Sie die Ausgabe durch gzip:

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

perfekt, es hat funktioniert! – Sujit

+2

kann man putz (Multithreaded gzip) anstelle von gzip für schnellere Komprimierung verwenden. Normalerweise ist gzip der Flaschenhals. – sivann

5

ein bisschen auf @ Joey Antwort erweitern, fügt unter Unterstützung für ein paar weitere Funktionen in the manual.

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

Wenn Sie Großbuchstaben in der Tabelle Namen haben (woe auf sie sein), müssen Sie die \" vor und nach dem Tabellennamen.

Die zweite Sache, die ich hinzugefügt habe, ist Spaltenauflistung.

Beachten Sie auch aus der Dokumentation:

Dieser Vorgang ist nicht so effizient wie der SQL-Befehl COPY, da alle Daten über die Client/Server-Verbindung passieren muss. Bei großen Datenmengen ist der SQL-Befehl möglicherweise vorzuziehen.