我有一个13GB大小的数据库。 当我使用此命令备份它时:
pg_dump -f out.sql --format=p -b -o -O -x -U postgres mydb
文件out.sql的大小为53GB。它大约是原始数据库大小的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