3

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

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

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

4

4 回答 4

2

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

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

另一个想法可能是一个 dna 数据库,如果你只有字母 ACG 和 T 意味着只有 4 种可能性,那么你可以将每个“字母”保存在 2 位信息中 - 因为一个字节有 8 位,那么你可以有效地将所有内容存储在四分之一的大小。

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

于 2013-02-18T00:26:48.253 回答
1

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

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

于 2013-02-17T13:14:03.323 回答
1

如果大小很重要,为什么不使用自定义格式?--格式=c

它默认使用压缩。

于 2013-02-17T13:06:56.093 回答
0
pg_dump mydb -oOxU postgres | bzip2 > out.sql.bz2
于 2013-02-17T13:06:08.657 回答