PITR (Point-In-Time Recovery)
PITR 是甚麼 ?
PITR 是透過基底備份 (base backup) + 持久保存的 wal (交易日誌) 來讓資料庫能恢復到任意過去的時間點或某個交易之前的狀態。
啟用 PITR 必要條件
- 設定 Base backup ⇒ 使用
pg_basebackup或是 pgBackRest / barman 工具
- 設定 wal ⇒ 前往 postgres.conf,並提供以下設定
- wal_level 參數設定為 replica 或更高的等級
- archive_mode 設定為 on
- archive_command 設定 wal 檔案寄送指令 (%p: 預設為 wal 檔案目錄, %f 預設為檔案名稱)
- archive_timeout 來設定時段歸檔 wal ( 因為有可能流量很小讓 wal 會有很長的延遲)
配置範例
環境: Window Sub Linux (Wsl) 啟用的 Docker PostgreSql
步驟一: 設定好持久化儲存位置及權限
步驟二: 設定 postgresql.conf 檔案啟用 WAL
步驟三: 啟動容器並進行相關設定 (要使用自己打包的 database)
步驟四: 啟動 pg_basebackup (這建議拿去設定批次)
災難還原
環境: Window Sub Linux (Wsl) 啟用的 Docker PostgreSql
- 停止 postgresql 服務
- 將現在的資料命名為舊資料,並重新創建 pgdata 資料夾
- 將 pg_basebackup 產生的 base.tar.gz 檔案解壓縮到 /etc/postgresql/pgdata 下
x表示解壓縮(extract)。z表示處理解壓縮f指定要解壓縮的檔案。C指定解壓縮到的目錄。
- 在剛剛解好的 /etc/postgresql/pgdata 設定
recovery.signal檔案
- 修改 postgres.conf 底下的 restore_command 跟 recovery_target 相關配置
- 啟動容器
- 驗證還原結果
查看 PostgreSQL 啟動 Log(最重要)
在還原後第一次啟動 PostgreSQL,你應該能看到:
如果失敗,你會看到:
📌 檔案位置取決於 Docker 或裸機:
環境 | Log 位置 |
systemd 方式 | /var/log/postgresql/postgresql-XX-main.log 或 journalctl -u postgresql |
Docker container | docker logs <container> |
手動啟動 pg_ctl | stdout 顯示或 pg_log/ 目錄 |
✅ 2️⃣ 用 SQL 驗證
⬅️ 檢查資料庫實際還原到哪個時間點
例如:
📌 如果 pg_last_xact_replay_timestamp 為 NULL → 沒有做 PITR,代表資料庫不是在 recovery 模式啟動