我刚刚从我的数据库中做了一个pg_dump备份,其大小约为95GB,但direcory/pgsql/data的大小约为38GB。Postgres数据库转储大小大于物理大小
我运行一个真空满并且转储的大小不变。我的postgres安装版本是9.3.4,在CentOS 6.3版本的服务器上。
与物理尺寸相比,转储的大小是非常奇怪的,或者我可以认为这是正常的吗?
在此先感谢!
问候。
Neme。
我刚刚从我的数据库中做了一个pg_dump备份,其大小约为95GB,但direcory/pgsql/data的大小约为38GB。Postgres数据库转储大小大于物理大小
我运行一个真空满并且转储的大小不变。我的postgres安装版本是9.3.4,在CentOS 6.3版本的服务器上。
与物理尺寸相比,转储的大小是非常奇怪的,或者我可以认为这是正常的吗?
在此先感谢!
问候。
Neme。
Postgres的确在某些情况下压缩其数据,使用称为TOAST技术:
PostgreSQL使用一个固定的页大小(通常8 KB),并且不允许元组跨越多个页面。因此,不可能直接存储非常大的字段值。为了克服这个限制,大字段值被压缩和/或分解成多个物理行。这对用户是透明的,对大多数后端代码只有很小的影响。该技术被亲切地称为TOAST(或“自切片面包以来最好的东西”)。
pg_dump输出的大小和磁盘上的Postgres群集(又名'实例')的大小之间的相关性非常非常小。考虑:
这也是为什么VACUUM FULL对备份大小没有影响的原因。
请注意,基于时间点恢复(PITR)的备份与pg_dump备份完全不同。 PITR备份基本上是磁盘上数据的副本。
如果您有很多(不可空值,高价值)数字字段,可能会发生这种情况。转储基本上是ASCII,最大值为4字节的整型字段在ASCII中需要大约10个字节(\ t或\ n分隔符加上一个字节)。显然,表中没有多个索引,因为不包含索引在转储中,只有DDL才能重建它们。 – wildplasser