在做備份還原測試的時候,需要重複執行灌資料、備份、刪資料、還原、確認資料的動作,非常耗時,使用腳本能夠省下大量的時間。
成果
執行過程

結果:test_result_report.txt

使用方法
1. 設定連線
在專案目錄下編輯 config.json,把 host、user、password 改成實際 SSH 連線資訊,存檔。
2. 安裝依賴
在專案目錄開終端機,執行:
# 若有虛擬環境,先啟動(建議)
.\venv\Scripts\Activate.ps1
# 安裝依賴
pip install -r requirements.txt3. 執行腳本
python pg_backup_restore_test.py腳本會讀取 config.json 的連線設定,接著會依序跑 1GB、3GB、5GB、9GB 的測試。
可用參數(pg_backup_restore_test.py)
執行時可以加的參數:
--host, -H- 預設:
127.0.0.1 - 用途:SSH 連線主機名稱或 IP。
- 預設:
--user, -u- 預設:
postgres - 用途:SSH 使用者名稱。
- 預設:
--password, -p- 預設:空字串(
"") - 用途:SSH 密碼(同時也當預設 sudo 密碼用)。
- 預設:空字串(
--key-file, -k- 預設:
None - 用途:SSH 私鑰檔路徑(使用金鑰認證時用;有填就不會用
--password)。
- 預設:
--port- 預設:
22 - 用途:SSH 連線埠。
- 預設:
--interactive, -i- 預設:不啟用(False)
- 用途:啟用互動模式,執行時用問答方式輸入 host/user/password/key-file,會忽略你在命令列與 config.json 裡給的值。
--auto-start, -a- 預設:不啟用(False)
- 用途:略過「是否繼續? (y/n)」的確認,直接開始全部測試。
--sizes, -s- 預設:
None(表示用內建的 1GB/3GB/5GB/9GB 測試組合) - 用途:指定要測試的資料量,例如:
-s 1GB,3GB,5GB或-s 500MB,2GB。
- 預設:
--process-max- 預設:
None若為None,則由pgbackrest.conf中設定控制。 - 用途:傳給
pgbackrest的--process-max,控制備份時的最大並行進程數(例如填4)。
- 預設:
--archive-timeout- 預設:
None - 用途:傳給
pgbackrest的--archive-timeout(秒),例如300代表 5 分鐘。
- 預設:
--config- 預設:
config.json - 用途:指定要讀取的連線設定檔路徑;如果該檔存在,會覆蓋掉對應的
--host/--user/--password/--port/--process-max/--archive-timeout。
- 預設:
問題與解決方法
| 階段 | 遇到的問題 (Error/Issue) | 原因分析 | 解決方法 |
|---|---|---|---|
| 備份 | Error 082: Archive Timeout | 大量資料寫入時,WAL 歸檔速度跟不上寫入速度,導致超時 。 | 1. 執行 CHECKPOINT; 。2. 增加 --archive-timeout=300 設定 。3. 配合 --archive-timeout修改archive-push-queue-max |
| 備份 | CPU 負載過高 (峰值 397%) | 開啟並行處理與數據壓縮,導致 4 核心 CPU 滿載。 | 1. 降低 --process-max 數量。2. 調低 --compress-level 壓縮等級。 |
| 還原 | Read-only transaction | 還原後資料庫處於待命 (Standby) 或暫停模式,無法寫入。 | 執行 SELECT pg_wal_replay_resume(); 或 pg_promote()。 |
| 還原 | Error 037: Path/Permission | pg1-path 定義不全或權限不足 。 | 確保以 postgres 身分操作,並使用絕對路徑 。 |