2016-05-16 70 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備份基本上是磁盤上數據的副本。