假设我有这一系列命令
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
如何仅使用一行代码将它们的所有输出(假设输出名称为 $dbhost.$dbname.sql)放入一个名为 backupfile.sql.gz 的文件中?
编辑:从下面的评论到答案,@arvinsim 实际上想要一个压缩的档案文件包含单独文件中的 SQL 转储,而不是一压缩的 SQL 文件。
答案1
( 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
答案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 程序的操作。你可以把它写成一个oneliner(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)
根据您的数据库和“输出”名称的规律性,您可以进一步改进。