链接 mysqldumps 命令以输出单个 gzip 压缩文件

链接 mysqldumps 命令以输出单个 gzip 压缩文件

假设我有这一系列命令

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 的替代品。
  • 我不知道你为什么想把它作为一句台词。如果您只想发出一个命令,您应该将这些行放入脚本中并从那里执行。
  • 使用用于此类操作的“普通”工具(tarzip),我不知道绕过中间文件。

附录

如果您确实不需要中间文件(并假设输出适合内存),您可以尝试类似以下 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)

根据您的数据库和“输出”名称的规律性,您可以进一步改进。

相关内容