2010-03-04 11 views
12

Sto cercando di capire come utilizzare tar + pipes su un Ubuntu Server LTS.shell-scripting: utilizzare una pipe come input per tar

Ho un comando di PostgreSQL (pg_dump) che emette un sacco di SQL sullo standard output:

pg_dump -U myUser myDB 

so come reindirizzare che in un file:

pg_dump -U myUser myDB > myDB.sql 

Al fine per risparmiare spazio su disco, preferisco averlo compresso: posso creare un file tar.gz da my myB.sql e quindi eliminare myDB.sql.

Ma mi stavo chiedendo - esiste un modo per farlo senza creare il file .sql intermedio? Credo che questo potrebbe essere realizzato con le pipe ... comunque non sono un guru della shell, e ne so molto poco (sono in grado di fare ls | more, questo è tutto). Ho provato diverse varianti di pg_dump .. | tar ... ma senza successo.

Come utilizzare una pipe per utilizzare l'output di pg_dump come input per tar? O ho appena sbagliato qualcosa?

risposta

29

Non vedo come "catrame" importi in questo affatto; perché non comprimere semplicemente il file di dump stesso?

pg_dump -U myUser myDB | gzip > myDB.sql.gz 

Poi, per ripristinare:

gzip -cd myDB.sql.gz | pg_restore ... 

Il "tar" utilità è per impacchettare un mucchio di file e directory in un unico file (il nome è una contrazione di "archiviazione su nastro") . Sotto questo aspetto, un file "tar" è un po 'come un file "zip", tranne per il fatto che "zip" implica sempre la compressione mentre "tar" non lo fa.

Nota infine che "gzip" non è "zip". L'utilità "gzip" solo comprime; non fa archivi.

+0

o 'zcat myDB.sql.gz | pg_restore ...' – vezult

+0

grazie! risposta molto informativa! – kikito

+3

http://www.postgresql.org/docs/9.1/static/backup-dump.html Questa documentazione ti fornirà una panoramica completa su questo argomento –

2

tar non comprime, quello che vuoi è gzip o uno strumento di compressione similat

2

Tar prende i nomi di file come input. Probabilmente vuole solo gzip l'uscita pg_dump in questo modo:

pg_dump -U myUser myDB |gzip > myDB.sql.gz 
7

Nel vostro caso d'uso pg_dump crea solo un singolo file che deve essere compressa. Come altri hanno suggerito, in * nix land un archivio è un singolo file che rappresenta un filesystem. In linea con l'ideologia Unix di uno strumento per attività, la compressione è un'attività separata dall'archivio. Poiché un archivio è un file può essere compresso, come qualsiasi altro file. Quindi, dato che hai solo bisogno di comprimere un singolo file, tar non è necessario, come altri hanno giustamente sottolineato.

Tuttavia, il titolo e tag porterà futuri lettori qui che potrebbe essere in attesa del seguente ...


Diciamo che avete una intera cartella piena di backup PostgreSQL per archiviare e comprimere. Questo dovrebbe ancora essere fatto interamente usando tar, come il suo -z o --gzip flag invokes the gzip tool.

Quindi, diciamo anche che è necessario crittografare gli archivi del database in preparazione per spostarli in una soluzione di backup offsite dubbiamente protetta (come un archivio oggetti compatibile S3). Supponiamo che ti piaccia la crittografia dei token pre-condivisi (password) usando il codice AES.

Questa sarebbe una situazione valida in cui si potrebbe desiderare di inviare dati a/da tar.

Archivio -> Compress -> Encrypt

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc 

Decrypt -> Uncompress -> Estratto

openssl enc -aes-256-cbc -in ./out.tar.gz.enc -d | tar xz --null 

Do riferiscono alle GNU tar documentation per details of how le --null opere di bandiera e gli esempi più utili per altre situazioni dove potresti aver bisogno di pipeare i file su tar.