如何使rsync从标准输入读取源文件(SRC)?

13

我想导出MySQL数据库并使用rsync进行每日备份。

我最初想到的方法类似于mysqldump -ufoo -pbar baz > /var/tmp/baz.sql && rsync /var/tmp/baz.sql /backup/ && rm /var/tmp/baz.sql

然后我开始思考是否可以不使用临时文件/var/tmp/baz.sql,而是直接将mysqldump的输出传输给rsync

更具体地说,我想要的类似于Ubuntu中用于更新apt的GPG密钥的命令行:gpg --export --armor CE49EC21 | sudo apt-key add -,其中管道的接收者支持'- '参数以指示它将从stdin读取。我想知道是否有解决办法来实现类似的功能,尽管我认为rsync没有类似的参数。


2
如果/backup/是本地路径,为什么不直接写入/backup/baz.sql呢? - tripleee
你应该使用 librsync 实现这个(http://librsync.sourcefrog.net/doc/librsync.html#io-callbacks)。 - ArtemGr
1个回答

12

这是不正确的,它不能以这种方式工作。这是因为 rsync 是用来从 A 传输完整文件树到 B

由于 rsync 的工作方式,它无法工作,因为在选择要传输特定文件(或其部分)之前,rsync 计算了几个校验和,并且在仅进行2次迭代(ping-pong步骤)。

这意味着必须多次读取文件。这对于(可能很大的)SQL转储文件来说不起作用,因为必须以某种方式进行缓冲。而这种缓冲取决于用户。

实际存储文件应该是最好的解决方法,尤其是对于那些只有逐渐差异的文件。


我正在设置一个备份系统,该系统维护了几个备份副本,并使用rsync的硬链接功能删除过时的备份。我希望统一所有文件的手段,包括SQL和其他类型的文件。但现在看来最好直接保存SQL文件。 - Sah
@leesah 这可以例如集成在 rsnapshot 中 - 它可以调用生成文件的脚本。然后这些文件可以被包含在同步过程中。 - glglgl
谢谢@glglgl,我会去看看。 - Sah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接