Postgres数据库转储大小大于物理大小

时间:2016-05-16 14:44:58

标签: postgresql size dump

我刚从我的数据库中创建了一个pg_dump备份,其大小约为95GB,但是direcory / pgsql / data的大小约为38GB。

我运行真空FULL,转储的大小不会改变。我的postgres安装版本是9.3.4,在CentOS版本6.3服务器上。

与物理尺寸相比,转储的大小非常奇怪,或者我认为这是正常的吗?

提前致谢!

问候。

NEME。

2 个答案:

答案 0 :(得分:2)

pg_dump输出的大小和磁盘上Postgres群集(又名'实例')的大小具有非常非常小的相关性。考虑:

  • pg_dump有3种不同的输出格式,其中2种允许动态压缩
  • pg_dump输出仅包含文本中的模式定义和原始数据(或者可能是"二进制"格式)。它不包含索引数据。
  • 文本/"二进制"不同数据类型的表示可以比存储在数据库中的实际数据更大或更小。例如,存储在bigint字段中的数字1在集群中占用8个字节,但在pg_dump中只占1个字节。

这也是VACUUM FULL对备份大小没有影响的原因。

请注意,基于时间点恢复(PITR)的备份与pg_dump备份完全不同。 PITR备份本质上是磁盘上数据的副本。

答案 1 :(得分:0)

Postgres在某些情况下使用名为TOAST的技术压缩其数据:

  

PostgreSQL使用固定页面大小(通常为8 kB),并且不允许元组跨越多个页面。因此,不可能直接存储非常大的字段值。为了克服这种限制,将大字段值压缩和/或分解成多个物理行。这对用户来说是透明的,对大多数后端代码只有很小的影响。该技术被亲切地称为TOAST(或“切片面包以来最好的东西”)。