在我公司,我们将本地开发数据库快照下载为db.dump.tar.gz文件。压缩是有道理的,但压缩包只包含一个文件(db.dump)。

归档单个文件是否有意义,还是.tar.gz只是这样的惯用法?为什么不只是.gz

评论

我认为这只是一个惯例问题。当人们看到带有gz扩展名的文件时,他们的默认思路是使用tar -zxvf。但是对于那些查看文件名并看到它没有扩展名.tgz的人来说,gzip db dump文件是非常好的。由于我不了解压缩算法的详细信息,因此我不确定tar是否对稀疏文件(如db dump)进行任何压缩,但是对于纯文本文件,直接gzip压缩文件比先进行tar压缩和gzip压缩具有很小的尺寸优势读取文件

对单个文件进行压缩只会在文件的开头和结尾添加一些元数据块。实际文件数据通过tar传递到未压缩的压缩器。因此,对于大文件,普通压缩和去皮重之间的大小差异可以忽略不计。

过去,尝试各种压缩方法时,我发现.tar.gz优于大多数其他常用方法。我记得它优于.tar,但不记得它是否比.gz好。具有讽刺意味的是,Window的.cab格式是我尝试过的最好的方法,这是非常意外的。

@Pharap tar不是压缩算法,它是一种归档格式

@gardenhead嗯,这可以解释为什么它不能很好地工作。

#1 楼

使用.tar.gz代替.gz的优点是,与tar相比,gzip存储的元数据(UNIX权限等)更多。
设置可以更容易地实现。扩展以存储多个文件。
.tar.gz文件非常常见,仅压缩的文件可能会使某些用户感到困惑。
(请参阅MelBurslans评论)

使用tar的开销的体积也很小。

如果不是真的需要,我仍然不建议压缩单个文件。
有很多有用的工具可以直接访问压缩的单个文件(例如zcatzgrep等-也存在于bzip2xz)。

评论


我没有考虑元数据方面。很好的一点

– Gardenhead
16-4-20在13:38

如果看到.gz,我的第一个直觉是tar -zxffoo.gz。记住gzip甚至是一个命令,还需要花费几秒钟的时间。

– bgStack15
16年4月20日在14:26

@ bgStack15 FWIW,您不需要z(或-),大多数现代tars会自动检测到需要解压缩的文件。

–user4443
16年4月20日在18:00

默认情况下,gzip将存储原始文件名和时间戳。解压缩时可以使用-N选项来还原它们。

–罗斯里奇
16年4月22日在4:56

@RossRidge谢谢,我再次删除了有关原始文件名的文本。

– jofel
16年4月22日在8:50

#2 楼

您实际上只问了一半的问题。另一个问题是“为什么要用gzip压缩tar文件?”。答案不只是gzip使文件更小(在大多数情况下):

tar


存储文件名和其他元数据:模式,所有者ID ,组ID,文件大小,修改时间
存储校验和(仅用于标头)

gzip


可以存储原始文件名,但是可选的
对原始数据具有CRC-32校验和
它压缩文件

tar不能确保您的数据没有损坏。仅使用gzip,您将无法恢复用户/组ID,修改时间,也可能无法恢复原始文件名。

组合比单独的命令/格式提供的功能更强大,因为它们可以相互补充。

评论


感谢您的澄清!当我阅读tar维基百科页面时,我误解了描述,以表示校验和适用于整个文件。

– Gardenhead
16年4月21日在14:23

在我看来,这是正确的答案。我还要添加一些其他原因,如果您同意的话,可能需要编辑。 1).tgz相对于.tar或.gz而言,.tgz的管理员无需支付额外费用:它们全都是一个命令。2)出于多种原因,管理员备份,复制,重定位,移动很多文件;数据库备份只是其中之一。无论备份一个文件还是多个文件,他们都可以使用相同的工作流,工具和命令。那么,对于只有一个文件的情况,为什么还要特殊地使用gzip命令的语法呢?

– Dewi Morgan
16-4-22在23:12



#3 楼

使用仅压缩的文本文件有很大的优势-可以使用命令行工具直接访问内容,例如lesszgrepzcat

评论


有趣的一点是,但问题是有关数据库快照的,不太可能是文本文件,而不仅仅是压缩的。

– underscore_d
16-4-20在20:39



@underscore_d我所有的数据库转储(主要是mysql和pgsql)都是文本转储,部分是因为如果某些东西使转储部分损坏,它们更易于保存,部分是因为我可以使用常用工具进行预处理(sed ,awk,perl等),如果需要的话。即比二进制转储更可靠,更有用。需要权衡的是,文本转储往往更大(谁在乎呢?磁盘空间很便宜,并且我们拥有良好的压缩能力),而还原则要慢得多(但是如果将还原打包在事务中,则还原速度会慢得多)。

–cas
16年4月21日在0:32

这些工具相对于简单地将解压缩器的输出管道传输到普通工具中有什么优势?

– CodesInChaos
16年4月23日在20:16

#4 楼

我想说的是,人们可能没有意识到他们可以在没有tar的情况下使用gzip / bzip2 / xz。可能是因为它们来自DOS / Windows背景,通常将压缩和归档以单一格式(ZIP,RAR等)集成在一起。

虽然使用tar可能有一点优势在某些情况下,由于元数据的存储或添加额外文件的能力,也存在一些缺点。使用纯gzip / bzip2 / xz文件,您可以对其进行解压缩并将解压缩后的数据直接传输到另一个工具(例如您的数据库)中,而不必将解压缩后的数据作为文件存储在磁盘上。使用tarball会更困难。

评论


使用GNU tar,只需-O开关即可输出到stdout,所以我不会说要困难得多!

–氢化物
16-4-20在20:28



对于使用tgz扩展名的文件,第一段似乎很合理。但是,OP的案例使用的是tar.gz-如果这些假设的Win / DOS前用户与我一样,则他们在查看此类文件时首先说的是:“为什么有2个扩展名?”。然后他们用谷歌搜索并迅速得到答案,这特别说明了tar和压缩是不同的。 ;-)

– underscore_d
16-4-20在20:42



#5 楼

在某些情况下,使用tar可能具有重要的区别:除了@jofel在其答案中提到的“元数据”之外,tar还将文件名记录在档案中。提取档案时,无论档案叫什么名称,都将得到原始文件名。

您的tar档案及其包含的文件具有相关的名称db.dump.tar.gzdb.tar,但是假设您将其重命名tar文件到20-Apr-16.dump.tgz或其他。用tar xvfz解开它,然后得到db.dump。为了进行比较,将20-Apr-16.dump.gz解压缩,然后得到20-Apr-16.dump。 (编辑:正如评论中指出的那样,gzip还会记录文件名;但是在解压缩时通常不使用它)。一个tar归档文件还可以包含一个相对路径名,该相对路径名将提取的文件放在子目录中。

您的用例将决定是否需要这种文件名持久性,甚至是需要这种持久性,或者实际上是不希望的。但是可以肯定的是,不管压缩方式如何,tar存档的传输方式与常规文件不同。

评论


gzip还会记录原始文件名。

–psusi
16年4月21日在0:59

对。该名称在gzip标头中是可选的-显然,如果压缩命令的流输出,将不会有一个名称-并且大多数工具在默认情况下不会将其还原(例如,在以下情况下必须显式使用gzip --name)解压缩),但您不必使用tar来获取文件名的持久性。

–里程
16-4-21的3:12

感谢您指出这一点,我还不知道。但是,由于这不是默认行为,因此可以说明这一点:以tar格式分发文件会保留原始文件名(可能还有相对路径),而无需收件人的干预。不能分发(g)压缩文件。

–alexis
16-4-21在14:33



#6 楼

除了所有其他答案之外,我最近遇到了一种脚本情况,即只需要一个文件,但是前一位员工编写了脚本,并可能生成多个文件。因此,将文件脱焦并压缩后再传输并扩展。

当过程发展到可以制作4.3 GB文件的程度时,它会翻转并制作一个.dump.001文件。 .dump文件。所有脚本都保持正常运行。

这是定义的主动sysadmin惰性!

#7 楼

我会压缩单个文件,以复制它以保留时间戳(在下载中很容易忽略)。文件权限和所有权不太重要:下载是一个术语,适用于集成程度不高的系统。

无论是否已压缩,压缩文件以加快下载速度都是一种标准做法-并避免用完磁盘空间。

#8 楼

Tar对于一直没有写入正式文件系统的多个文件特别有用。如果出于某种原因有时仅写入一个文件,则没有任何实际意义。我可以将.tar.gz直接dd到/ dev / sdx而不用考虑分区或文件系统。它也可能是磁带。

之所以这样做,是因为脚本或过程是从遗产代码中复制的。当然,如果只有一个文件,则无需tar,但这为增强多个文件留有余地……