Объединение в цепочку mysqldumps управляет для вывода единственного gzipped файла

Похож mark-modified-lines включен в Вашей оболочке. Попытайтесь отключить его в ~/.inputrc:

set mark-modified-lines Off

Детали в man bash.

1
10.05.2013, 12:13
2 ответа

В Вашем комментарии к ответу @tink Вы хотите отдельные файлы в .gz файлы:

mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1 > '/var/tmp/$dbhost1.$dbname1.sql' ; mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1 > '/var/tmp/$dbhost1.$dbname2.sql' ; mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2 > '/var/tmp/$dbhost1.$dbname3.sql' ; mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2 > '/var/tmp/$dbhost1.$dbname4.sql' ; cd /var/tmp; tar cvzf backupfile.sql.gz \$dbhost1.\$dbname*.sql
  • Как альтернатива для выходного имени файла я использовал бы backupfile.sql.tgz таким образом, это более ясно опытным пользователям, это - файл tar, который сжат
  • Можно добавить rm \$dbhost1.\$dbname*.sql избавиться от промежуточных файлов
  • Вы могли использовать zip как альтернатива сжатому tar.
  • Я не уверен, почему Вы хотите это как остроту. Если Вы просто хотите дать одну команду, необходимо поместить строки в сценарий и экс-милый оттуда.
  • С 'нормальными' инструментами, используемыми для чего-то вроде этого (tar, zip), я не знаю о хитрости промежуточных файлов.

Приложение

Если Вы действительно не хотите промежуточные файлы (и предположение, что вывод умещается в памяти), Вы могли попробовать что-то как следующая программа Python. Можно записать это как остроту ( python -c "from subprocess import checkout; from cStr....), но я действительно не рекомендую это.

from subprocess import check_output
from cStringIO import StringIO
import tarfile

outputdata = [
    ('$dbhost1.$dbname1.sql', '$dbname1'),
    ('$dbhost1.$dbname2.sql', '$dbname2'),
    ('$dbhost1.$dbname3.sql', '$dbname3'),
    ('$dbhost1.$dbname4.sql', '$dbname4'),
]

with tarfile.open('/var/tmp/backupfile.sql.tgz', 'w:gz') as tgz:
    for outname, db in outputdata:
        cmd = ['mysqldump', '--opt', '--databases']
        cmd.append(db)
        cmd.extend(['--host=$dbhost1', '--user=$dbuser1', '--password=$dbpass1'])
        out = check_output(cmd)
        buf = StringIO(out)
        buf.seek(0)
        tarinfo = tarfile.TarInfo(name=outname)
        tarinfo.size = len(out)
        tgz.addfile(tarinfo=tarinfo, fileobj=buf)

В зависимости от того, насколько регулярный Ваша база данных и 'выходные' имена - Вы, может далее изменить к лучшему это.

2
27.01.2020, 23:17
  • 1
    я не нахожу способ сделать это без промежуточных файлов также. –  slm♦ 10.05.2013, 09:22
  • 2
    , который я вижу, так в основном эта промежуточная функция файла, вероятно, не поддерживается затем. Я просто не хотел создавать файлы, потому что вывод сценария не всегда собирается совпасть с существующим рабочим каталогом, и сценарий не может иметь разрешения произвести в существующем рабочем каталоге. –  arvinsim 10.05.2013, 09:28
  • 3
    Вы имеете в виду, делают это без промежуточного файла? Если это - то, что Вы просите, чтобы я думал, что ответ нет. –  slm♦ 10.05.2013, 09:34
  • 4
    @arvinsim я изменил остроту для записи в /var/tmp (и промежуточные файлы и окончательный результат .tgz). А-ч –  Anthon 10.05.2013, 09:34
  • 5
    @slm я договариваюсь о 'нет' без промежуточного имени файла для постоянного клиента ('tar', 'zip') инструменты, с некоторым программированием его, может однако быть сделан относительно легко. –  Anthon 10.05.2013, 10:30
( mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; \
  mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; \
  mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2; \
  mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbp \
 ) | gzip > backupfile.sql.gz

Или как одна строка:

( mysqldump --opt --databases $dbname1 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; mysqldump --opt --databases $dbname2 --host=$dbhost1 --user=$dbuser1 --password=$dbpass1; mysqldump --opt --databases $dbname3 --host=$dbhost2 --user=$dbuser2 --password=$dbpass2; mysqldump --opt --databases $dbname4 --host=$dbhost2 --user=$dbuser2 --password=$dbp) | gzip > backupfile.sql.gz
3
27.01.2020, 23:17
  • 1
    @slm: спасибо за редактирование, но он попросил одну строку; D –  tink 10.05.2013, 08:15
  • 2
    Хм, кажется, что заархивированный файл только содержит backupfile.sql. Действительно ли возможно что содержание backupfile.sql.gz отдельные дампы, где имя $dbhost.$dbname.sql? Таким образом в моем примере, backupfile.sql.gz должен содержать $dbhost1.$dbname1.sql, $dbhost1.$dbname2.sql, $dbhost2.$dbname3.sql и $dbhost2.$dbname4.sql –  arvinsim 10.05.2013, 08:28
  • 3
    @arvinsim: нет. Я рекомендую читать на понятиях позади gzip и bzip2; в отличие от zip они не производят архив многих файлов, они сжимают файлы индивидуально. Плюс этот запрос является ортогональным к Вашему начальному вопросу. –  tink 10.05.2013, 09:06
  • 4
    , который я вижу, таким образом, это не возможно с gzip только. Могло бы быть лучше к tar затем gzip. –  arvinsim 10.05.2013, 09:12

Теги

Похожие вопросы