Postgres pg_dump导出文件大小超过pg_database_size

7
我有一个客户使用pg_dump备份的文件大小接近700GB,而pg_database_size只有195GB。我已经运行了VACUUM FULL,但结果仍然一样。
这可能怎么可能?据我所知,由于压缩,转储文件应该更小。
我使用的是PostgreSQL 9.5版本。起初我认为这是一个错误,然后我使用了PostgreSQL 10的二进制文件,但结果仍然一样。
我们使用常规命令进行备份。
pg_dump -U username -d dbname > dbname.sql

可能出现了什么问题?


3
你的数据库中是否有许多巨大的文本(或者JSON或JSONB)值?这些值在数据库中以压缩方式储存,但在SQL转储时显然不会被压缩。同样的情况也适用于bytea列,由于需要为二进制值进行编码,在SQL转储时将使用两倍的空间。 - user330315
此外,vacuum full 对于 pg_dump 的逻辑转储没有影响。如果您的表格过度膨胀,它可能会减小从 pg_basebackup 进行的文件级备份的大小。 - Jeremy
2个回答

6

由于以下原因,pg_dump文件可以比数据库大小小:

  1. pg_dump不会转储索引块,它只存储索引的定义。
  2. 如果您的数据库有大型对象(如boats),则数据库的大小将会更大。

如果您的SQL Dump比数据库更大,则可能是由于TEXT / JSONB / JSON / BYTEA等数据类型的数据较大,在PG中进行了压缩。


问题是为什么转储文件比数据库 - user330315
2
啊!明白了!唯一可能的原因是JSON/JSONB/TEXT/BYTEA。它们在数据库中被压缩和烤过。 - Vibhor Kumar

2
据我所知,由于压缩,Dump文件应该更小。您的pg_dump命令行显示它是纯文本格式,并且没有请求任何压缩。您也没有显示输出通过压缩程序进行管道操作。因此,没有应用压缩。默认情况下,自定义格式使用压缩,但普通格式不使用压缩。另一方面,数据库在某些情况下会自动压缩一些数据。该压缩通常不是很好,但显然在您的情况下足够好以比无压缩的版本更好(以及克服索引使用的额外空间)。实际数据库还以二进制形式存储数字,这比pg_dump使用的文本形式更紧凑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接