pg_dump创建一个包含原始数据库四倍的文件

时间:2013-02-17 12:56:59

标签: postgresql pg-dump

我有一个13GB大小的数据库。 当我使用此命令备份它时:

pg_dump -f out.sql --format=p -b -o -O -x -U postgres mydb

文件out.sql的大小为53GB。它大约是原始数据库大小的4倍。为什么会发生这种情况以及如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

这实际上取决于您保存的数据类型和使用的数据类型,特别是如果您只是将其转储到sql文件中。除了压缩之外,如果您的数据库设计得很好,它应该占用比转储更少的空间。

int数据类型,例如总是使用4个字节 - 本段中的每个字母,空格,句号或逗号大小为1个字节,但每个数字保存为32位int总是4个字节。然而,这允许加上20亿到20亿的数字范围,即可能长达10位的数字。换句话说,如果您按照此处的说明以书面形式转储该信息,则任何超过9999或低于-999的数字的大小实际上都会比保存的格式“更大”,因此如果数据库主要是数字那可以解释这种差异。 (这也意味着数字100及以下或-10及以上的数字在书面形式上实际上会“缩小”,但除此之外,总是有点小(int2) - 如果你真的很挑剔我相信有一个小小的扩展,如果那个字节对你来说意义重大)。

另一个想法可能是一个dna数据库,如果你只有字母ACG和T意味着只有4种可能性,那么你可以只用2位信息保存每个'字母' - 而且一个字节有8位然后你可以有效将所有东西都存储在四分之一的大小。

无论数据库使用什么形式,无论是数字,二进制文件,日期,浮点数,枚举类型......无论如何,如果数据库不是纯文本,那么转储将大于原始数据的可能性。

答案 1 :(得分:1)

如果尺寸很重要,为什么不使用自定义格式? --format = C

默认使用压缩。

答案 2 :(得分:1)

  

我有一个13GB大小的数据库

那是多大? / data /目录的大小是多少?这与转储非常不同。转储是数据的文本表示,可以预期它占用更多空间,二进制表示(例如:时间戳字段占用内部8个字节,在转储中表示为字符串,肯定会超过8字符)。另一方面,二进制数据包含附加信息(更重要的是,索引数据,不会进入转储)。因此,将二进制大小与转储大小进行比较是非常不相关的

答案 3 :(得分:0)

pg_dump mydb -oOxU postgres | bzip2 > out.sql.bz2