Postgresql

pg_restore 後數據庫大小不同(389 GB 與 229 GB)

  • March 3, 2020

我使用以下命令在 PostgreSQL 11.6(帶有 TimescaleDB 1.60 擴展)中創建了我的數據庫的備份pg_dump

PGPASSWORD=mypassword pg_dump -h 127.22.0.4 -p 5432 -U postgres -Z0 -Fc database_development

並使用pg_restore. 對於還原,psql以使用者身份執行以下命令postgres

CREATE DATABASE database_development;
\c database_development
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();

\! time pg_restore -Fc -d database_development /var/lib/postgresql/backups/database_development_2020-02-29

SELECT timescaledb_post_restore();

原始數據庫的數據庫大小為 389 GB,但恢復的數據庫為 229 GB。這些尺寸是通過執行獲得的

select pg_size_pretty(pg_database_size('database_development'))

一些區別:

舊數據庫儲存在 ext4 分區上,而新數據庫儲存在禁用壓縮的 ZFS 文件系統上。兩個數據庫實例都在帶有 Ubuntu 18.04 主機的 Docker 容器中執行。

**問題:**我們如何解釋數據庫大小的差異?pg_dump在和期間都沒有遇到錯誤pg_restore

轉儲不考慮死元組,只考慮活元組,但死元組確實考慮了空間,因此空間差異。

原因是轉儲是合乎邏輯的,它只會創建插入數據的語句,而死行無論如何對它來說都是不可見的。如果您有大量更新和刪除發生,或者換句話說,您的數據庫是高度事務性的,它將創建更多死行版本,並且還需要一個積極的真空來處理膨脹。如果並且當您比較死行數和活行數時,您會在恢​​復之前和之後看到差異。

另外,為了更安全,在轉儲恢復後對數據庫執行手動真空分析,我過去曾看到,由於估計錯誤,規劃器會更改用於查詢的最佳計劃。

引用自:https://dba.stackexchange.com/questions/261032