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.