Encadeando comandos mysqldumps para gerar um único arquivo gzipado

1

Digamos que eu tenha essa série de comandos

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=$dbpass2

Como colocar todas as suas saídas (assumindo que o nome da saída é $ dbhost. $ dbname.sql) e colocá-lo dentro de um arquivo chamado backupfile.sql.gz usando apenas uma linha de código?

Editar : De comentários a respostas abaixo, @arvinsim realmente quer um arquivo archive compactado contendo os despejos SQL em arquivos separados, não um arquivo SQL compactado.

    
por arvinsim 10.05.2013 / 06:43

2 respostas

2

Em seu comentário à resposta do @ tink você quer arquivos separados nos arquivos .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
  • Como uma alternativa para o nome do arquivo de saída, usaria backupfile.sql.tgz , portanto, é mais claro para os usuários experientes que esse é um arquivo tar compactado
  • Você pode acrescentar rm \$dbhost1.\$dbname*.sql para se livrar dos arquivos intermediários
  • Você pode usar zip como alternativa ao tar compactado.
  • Eu não tenho certeza porque você quer isso como um one-liner. Se você quer apenas emitir um comando, você deve colocar as linhas no script e extrair de lá.
  • Com as ferramentas 'normais' usadas para algo assim ( tar , zip ), não estou ciente de contornar os arquivos intermediários.

Adendo

Se você realmente não deseja arquivos intermediários (e supondo que a saída caiba na memória) você pode tentar algo como o seguinte programa em Python. Você pode escrever isso como um oneliner ( python -c "from subprocess import checkout; from cStr.... ), mas eu realmente não recomendo isso.

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)

Dependendo da regularidade do seu banco de dados e dos nomes de 'saída', você pode melhorar ainda mais isso.

    
por 10.05.2013 / 08:18
3
( 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

Ou como uma linha:

( 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
    
por 10.05.2013 / 07:06