Postgresql
pg_restore 後數據庫大小不同(389 GB 與 229 GB)
我使用以下命令在 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
。
轉儲不考慮死元組,只考慮活元組,但死元組確實考慮了空間,因此空間差異。
原因是轉儲是合乎邏輯的,它只會創建插入數據的語句,而死行無論如何對它來說都是不可見的。如果您有大量更新和刪除發生,或者換句話說,您的數據庫是高度事務性的,它將創建更多死行版本,並且還需要一個積極的真空來處理膨脹。如果並且當您比較死行數和活行數時,您會在恢復之前和之後看到差異。
另外,為了更安全,在轉儲恢復後對數據庫執行手動真空分析,我過去曾看到,由於估計錯誤,規劃器會更改用於查詢的最佳計劃。