2010-03-04 4 views
12

Я пытаюсь найти способ использовать tar + трубы на сервере Ubuntu LTS.shell-scripting: используйте трубу в качестве входа для tar

Я получил команду PostGreSQL (pg_dump), который выводит множество SQL на стандартный вывод:

pg_dump -U myUser myDB 

Я знаю, как перенаправить в файл:

pg_dump -U myUser myDB > myDB.sql 

Для того, для сохранения некоторого дискового пространства, я бы скорее сжал его: я могу сделать tar.gz-файл из этого myDB.sql, а затем удалить myDB.sql.

Но мне было интересно - есть ли способ сделать это без создания промежуточного файла .sql? Я считаю, что это может быть достигнуто с помощью труб ... однако я не гуру-оболочка и мало знаю о них (я могу сделать ls | more, вот и все). Я пробовал несколько вариантов pg_dump .. | tar ..., но безуспешно.

Как использовать трубку для вывода вывода pg_dump в качестве входа для tar? Или я просто получил что-то не так?

ответ

29

Я не вижу, как «смола» фигурирует в этом вообще; почему бы просто не сжать сам файл дампа?

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

Тогда для восстановления:

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

«ТАРы» утилита для пакетирования кучи файлов и каталогов в единый файл (название является сокращением «архива ленты») , В этом отношении «tar» -файл похож на «zip-файл», за исключением того, что «zip» всегда подразумевает сжатие, а «tar» - нет.

Обратите внимание, что «gzip» не является «zip». Утилита «gzip» только компрессы; он не архивирует.

+0

или 'zcat myDB.sql.gz | pg_restore ...' – vezult

+0

спасибо! очень информативный ответ! – kikito

+3

http://www.postgresql.org/docs/9.1/static/backup-dump.html Эта документация предоставит вам общий обзор по этой теме –

2

tar не сжимает, что вы хотите gzip или similat инструмент сжатия

2

Tar принимает имена файлов в качестве входных данных. Вы, наверное, просто хотите GZIP вывод pg_dump так:

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

В вашем случае использования pg_dump создает только один файл, который должен быть сжат. Как намекают другие, в * nix land архив - это один файл, представляющий файловую систему. В соответствии с идеологией unix один инструмент на задание, сжатие - отдельная задача из архива. Поскольку архив - это файл, он может быть сжат, как и любой другой файл. Поэтому, поскольку вам нужно всего лишь сжать один файл, tar не нужен, как уже указывали другие.

Однако, ваш заголовок и теги принесет будущим читателям здесь, которые могли бы ожидать следующих ...


Допустим, у вас есть целая папка, полная резервных копий PostgreSQL для архивирования и сжатия. Это должно быть сделано полностью с использованием tar, в качестве его -z или --gzip flag invokes the gzip tool.

Итак, давайте также скажем, что вам необходимо зашифровать свои архивы баз данных, готовясь к их перемещению в сомнительно защищенное решение для резервного копирования (например, хранилище объектов, совместимое с S3). И давайте предположим, что вам нравится шифрование с использованием общего ключа (пароля) с использованием шифрования AES.

Это была бы допустимая ситуация, когда вы могли бы отправлять данные в и из tar.

Архив -> Сжать -> Шифровать

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

Расшифровать -> распаковывать -> Extract

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

Do относится к GNU tar documentation для details of how--null флага работ на и более полезные примеры для других ситуаций где вам может потребоваться передать файлы tar.