我剛剛從我的數據庫中做了一個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