執行備份與檢視備份資訊
在成功設定並驗證系統後,將執行不同類型的備份,並學習如何使用 info 指令來檢視與理解備份狀態。
執行首次完整備份 (Full Backup)
第一次備份必須是完整備份,它建立了後續所有差異或增量備份的基礎。
# (目前身分仍是 postgres)
pgbackrest --stanza=cg_test_prodcut --type=full backup提示: 如果您在執行備份時不指定 --type 參數,pgBackRest 預設會嘗試執行增量備份 (incr)。然而,在沒有任何現存備份的情況下,它會自動將類型轉換為完整備份 (full)。
執行差異與增量備份
在有了完整備份之後,就可以執行更節省空間與時間的備份類型。
- 執行差異備份 (Differential Backup) 此備份包含自上次 完整備份 以來的所有變更。
pgbackrest --stanza=cg_test_prodcut --type=diff backup- 執行增量備份 (Incremental Backup) 此備份僅包含自上一次備份(不論類型)以來的所有變更。
pgbackrest --stanza=ccg_test_prodcut --type=incr backup檢視備份資訊
info 指令是檢視備份儲存庫狀態的統一入口,它會清晰地列出所有可用的備份集。
sudo -u postgres pgbackrest info將會看到類似以下的範例輸出:
stanza: cg_test_prodcut
status: ok
cipher: none
db (current)
wal archive min/max (17): 000000010000000000000001/000000010000000000000005
full backup: 20251018-084114F
timestamp start/stop: 2025-10-18 08:41:14+00 / 2025-10-18 08:41:18+00
wal start/stop: 000000010000000000000002 / 000000010000000000000003
database size: 22MB, database backup size: 22MB
repo1: backup set size: 2.9MB, backup size: 2.9MB
diff backup: 20251018-084114F_20251018-084118D
timestamp start/stop: 2025-10-18 08:41:18+00 / 2025-10-18 08:41:20+00
wal start/stop: 000000010000000000000004 / 000000010000000000000005
database size: 22MB, database backup size: 8.3KB
repo1: backup set size: 2.9MB, backup size: 448B
backup reference total: 1 full
以下是輸出中關鍵資訊的解析:
-
status: ok: 表示此 Stanza 的狀態正常,可以進行備份與還原。 -
wal archive min/max: 顯示目前儲存庫中已歸檔的 WAL 檔案的最小與最大序號範圍。 -
full backup/diff backup: 列出所有可用的備份集。每個備份集都有一個唯一的標籤(Label),並包含其執行時間戳、所需的 WAL 範圍等詳細資訊。 -
database sizevs.database backup size:database size是備份當下資料庫的實際總大小,而database backup size是該次備份實際需要傳輸的資料量。對於差異或增量備份,後者會遠小於前者。 -
repo backup set sizevs.backup size:repo backup set size指的是要還原此備份所需的總資料量(包含其依賴的所有備份),而backup size僅指該次備份本身在儲存庫中的大小(已壓縮)。
既然我們已經擁有了有效的備份集,下一步便是透過模擬災難來驗證其可用性,確保在真正需要時能夠成功還原。
災難復原演練:時間點復原 (PITR)
連線資料庫並建立測試資料
我們寫入一筆資料,標記為「重要資料」。
psql -c "CREATE TABLE patient_data (id serial, name text, status text,
created_at timestamp);"
psql -c "INSERT INTO patient_data (name, status, created_at) VALUES ('王小明',
'ICU', now());"
# 確認資料存在,並記下現在時間
psql -c "SELECT * FROM patient_data;"
date記下這裡顯示的時間。

模擬災難
psql -c "DROP TABLE patient_data;"
psql -c "SELECT * FROM patient_data;"
# 此時應該會報錯:ERROR: relation "patient_data" does not exist其他的情境:更多pgbackrest復原情境
執行時間點還原 (PITR)
在只有一個資料庫時還原必須先停止資料庫服務。
退出 postgres 使用者
exit停止資料庫
sudo systemctl stop postgresql執行還原
還原到災難發生前。更多還原參數說明,參考更多pgBackRest參數設定
# 執行還原
sudo -u postgres pgbackrest --stanza=cg_test_prodcut --delta --type=time --target="2025-12-12 08:30:00" restore- 參數解析:
--delta: 這是最佳實踐,它能只還原變動或遺失的檔案,比完全清空後再還原更快也更安全。--type=time: 指定執行時間點復原。--target: 指定還原到的目標時間。
啟動資料庫
sudo systemctl start postgresql
sudo -u postgres psql -c "SELECT pg_wal_replay_resume();"驗證復原結果
檢查資料是否回來了。
sudo -u postgres psql -c "SELECT * FROM patient_data;"自動化排程:設定 Cron
手動執行備份容易出錯且不可靠。我們應使用 cron 來設定自動化的備份排程,確保備份定期、一致地執行。
建立日誌存放目錄
在設定 cron 之前,我們先建立一個目錄來存放備份日誌,並確保 postgres 使用者有權限寫入。透過apt安裝pgBackRest則已經建立,可以跳過這個步驟。
sudo mkdir -p /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
編輯 postgres 使用者的 crontab
基於安全與權限考量,我們不應該用 root 來跑備份,必須使用 postgres 帳號的 crontab:
sudo -u postgres crontab -e
加入排程指令
進入編輯界面後,設置排程,因為資料量極小所以設置如下:週日 Full,週一至週六 Incr。
# pgBackRest 自動化備份排程
# 分 時 日 月 週 | 指令
# 每週日凌晨 2:00 執行完整備份 (Full Backup)
00 02 * * 0 pgbackrest --stanza=cg_test_product --type=full backup >> /var/log/pgbackrest/backup-full.log 2>&1
# 週一至週六凌晨 2:00 執行增量備份 (Incr Backup)
00 02 * * 1-6 pgbackrest --stanza=cg_test_product --type=incr backup >> /var/log/pgbackrest/backup-incr.log 2>&1
# (選配) 每天凌晨 3:00 清理過期的備份 (Expire)
00 03 * * * pgbackrest --stanza=cg_test_product expire >> /var/log/pgbackrest/expire.log 2>&1
提醒
如果系統找不到
pgbackrest指令,請在 crontab 內使用絕對路徑(例如/usr/bin/pgbackrest)。你可以用which pgbackrest查詢。
設定完成後,你可以查看當前 postgres 的排程清單:
sudo -u postgres crontab -l
設定 Log Rotation
因為備份日誌會一直累積,建議設定 logrotate,否則 /var/log/pgbackrest/ 下的文字檔會越來越大。
建立一個設定檔 /etc/logrotate.d/pgbackrest:
/var/log/pgbackrest/*.log {
weekly
rotate 4
compress
missingok
notifempty
}
監控與日誌檢視
有效的監控與日誌分析是問題排查與確保系統健康的基礎。
- pgBackRest 日誌: pgBackRest 的主要日誌檔案預設存放於
/var/log/pgbackrest/。每個 Stanza 和命令都會有獨立的日誌檔,例如cg_test_prodcut-backup.log。當備份或還原操作失敗時,這裡是最先需要檢查的地方。為了進行有效的故障排除,強烈建議在pgbackrest.conf中設定log-level-file=detail,這能在不影響主控台輸出的情況下,提供用於事後分析的詳細日誌。 - PostgreSQL 日誌: 有時問題的根源在於資料庫本身,例如歸檔失敗。您應同時檢查 PostgreSQL 的系統日誌來獲取更全面的資訊。
在遇到問題時,結合檢查 pgBackRest 與 PostgreSQL 的日誌,通常能快速定位問題所在。