2016-05-16 86 views
0

我刚刚从我的数据库中做了一个pg_dump备份,其大小约为95GB,但direcory/pgsql/data的大小约为38GB。Postgres数据库转储大小大于物理大小

我运行一个真空满并且转储的大小不变。我的postgres安装版本是9.3.4,在CentOS 6.3版本的服务器上。

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

在此先感谢!

问候。

Neme。

+0

如果您有很多(不可空值,高价值)数字字段,可能会发生这种情况。转储基本上是ASCII,最大值为4字节的整型字段在ASCII中需要大约10个字节(\ t或\ n分隔符加上一个字节)。显然,表中没有多个索引,因为不包含索引在转储中,只有DDL才能重建它们。 – wildplasser

回答

0

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

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

1

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

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

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

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