14

我试图找出一种在 Ubuntu Server LTS 上使用 tar+pipes 的方法。

我有一个 postgresql 命令 ( pg_dump),它在标准输出上输出大量 sql:

pg_dump -U myUser myDB

我知道如何将其重定向到文件:

pg_dump -U myUser myDB > myDB.sql

为了节省一些磁盘空间,我宁愿将它压缩:我可以从那个 myDB.sql 中创建一个 tar.gz 文件,然后删除 myDB.sql。

但我想知道 - 有没有办法在不创建中间 .sql 文件的情况下做到这一点?我相信这可以通过管道来完成……但是我不是贝壳大师,对它们知之甚少(我能做到ls | more,仅此而已)。我尝试了几种变体,pg_dump .. | tar ...但没有成功。

如何使用管道将 tar 的输出pg_dump用作 tar 的输入?还是我只是弄错了什么?

4

4 回答 4

32

我根本看不出“焦油”是如何影响这一点的。为什么不压缩转储文件本身呢?

pg_dump -U myUser myDB | gzip > myDB.sql.gz

然后,要恢复:

gzip -cd myDB.sql.gz | pg_restore ...

“tar”实用程序用于将一堆文件和目录捆绑到一个文件中(名称是“tape archive”的缩写)。在这方面,“tar”文件有点像“zip”文件,只是“zip”总是意味着压缩,而“tar”则没有。

最后请注意,“gzip”不是“zip”。“gzip”实用程序只是压缩;它不制作档案。

于 2010-03-04T13:18:10.437 回答
7

在您的用例pg_dump中,仅创建一个需要压缩的文件。正如其他人所暗示的那样,在 *nix 领域,档案是代表文件系统的单个文件。为了与每个任务一个工具的 Unix 意识形态保持一致,压缩是与归档分开的任务。由于存档是一个文件,因此它可以像任何其他文件一样被压缩。因此,由于您只需要压缩单个文件,因此 tar 没有必要,正如其他人已经正确指出的那样。

但是,您的标题和标签会将未来的读者带到这里,他们可能会期待以下内容......


假设您有一个完整的 PostgreSQL 备份文件夹来存档和压缩。这仍然应该完全使用 tar 来完成,因为它的-zor--gzip标志会调用 gzip 工具

因此,我们还假设您需要加密您的数据库存档,以准备将它们移至安全可靠的异地备份解决方案(例如与 S3 兼容的对象存储)。假设您喜欢使用 AES 密码的预共享令牌(密码)加密。

这将是一种有效的情况,您可能希望通过管道将数据传入和传出 tar。

存档 -> 压缩 -> 加密

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc

解密 -> 解压缩 -> 提取

openssl enc -aes-256-cbc -in ./out.tar.gz.enc -d | tar xz --null

请参阅GNU tar 文档了解有关--null标志如何工作的详细信息,以及可能需要将文件通过管道传输到 tar 的其他情况的更多有用示例。

于 2012-07-14T20:55:24.420 回答
2

tar不压缩,你要的是gzip还是类似的压缩工具

于 2010-03-04T13:18:55.240 回答
2

Tar 将文件名作为输入。您可能只想像这样 gzip pg_dump 输出:

pg_dump -U myUser myDB |gzip > myDB.sql.gz
于 2010-03-04T13:19:58.030 回答