LINUX.ORG.RU
решено ФорумAdmin

Как заархивировать вывод mysqldump совместно с обычными файлами?

 


1

1

Нужна запись типа tar cjf - file1.txt file2.txt `mysqldump ...` Т.е. без предварительного дампа базы в файл, ибо все это уходит в пайп по ssh и создавать файл дампа большой БД не хочется.

Подскажите как такое провернуть?

tar -cj file1.txt file2.txt <(mysqldump ...)

Два комментария:

  • tar -f - — масло масляное, по умолчанию (если файл не указывать) tar и так пишет в стандартный вывод;
  • <(...) — башовая конструкция «подстановка процесса»: запускает процесс и подставляет имя файла-пайпа, из которого можно читать стандартный вывод этого процесса.
intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

tar -f - — масло масляное

мне без него не понятно, приходится вспоминать. Я привык -f, наверное ты тоже.

тоже вставлю комментарий: тут может лучше mysqldump | tar, что-бы засунуть между ними ssh. Но два лишних файла передать так не получится. Не знаю, надо оно.

emulek ()
Ответ на: комментарий от intelfx

а оно заархивирует файл пайпа или содержимое пайпа?

anonymous ()

`mysqldump ...` Т.е. без предварительного дампа базы в файл, ибо все это уходит в пайп по ssh и создавать файл дампа большой БД не хочется.

не, tar так не умеет.

ЗЫЖ передавай ты двумя командами:

mysqldump|ssh|cat>dump.sql
tar -cjf- file1 faile2|ssh|tar -xvvf -
как-то так

emulek ()
Последнее исправление: emulek (всего исправлений: 2)
Ответ на: комментарий от emulek

Видимо да, две команды - такое подойдет решение. Там только наоборот - клиент по ssh подключается к серверу и запустив скрипт архивации забирает его выхлоп и пишет в файл.

Просто я думал может недостаточно изучил bash, хотя как вы думаете, такое прокатит?

mkfifo fifo.sql ; mysqldump > fifo.sql ; tar cjf - file1.txt file2.txt fifo.sql

ведь нет чегото такого?

`mysqldump...` as file.txt

serega386 ()
Ответ на: комментарий от intelfx

У меня такая конструкция:

tar -cj file1.txt file2.txt <(mysqldump ...)

создаёт архив, в котором лежит файл-пайп (/dev/fd/63), но без содержимого. Gnu tar 1.28.

mky ★★★★★ ()

Вобщем вот такой конструкцией удовлетворился:

ssh root@host.ru «tar cjf - /var/www» > sites.tar.bz2
ssh root@host.ru «mysqldump -u root -p123 basename | bzip2 -cz» > base.sql.bz2
serega386 ()
Ответ на: комментарий от intelfx

Посмотрел, походу Dimez'у делать было нечего :-)

Сейчас думаю, вобще, возможно ли выдать на stdout архив в формате tar не зная размера записываемого туда файла (получая данные из stdin/pipe). Если не путаюсь, то в начале tar-архива лежит блок, где описываются все файлы (имя и размер).

Получается, что чтобы начать писать tar-архив нужно, либо прочиать и где-то сохранить входящие с stdin данные (в памяти или временном файле), либо писать tar-архив в файл на диске (с произвольным доступом) и потом править заголовочный блок. Но во втором случае уже не получится создать tar.gz и прочие сжатые архивы.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.