▪️PITR - 資料備份/災難還原 (wal +pg_basebackup)
2024-10-1
| 2025-12-3
字數 892閱讀時間 3 分鐘

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
  1. 停止 postgresql 服務
    1. 將現在的資料命名為舊資料,並重新創建 pgdata 資料夾
      1. 將 pg_basebackup 產生的 base.tar.gz 檔案解壓縮到 /etc/postgresql/pgdata 下
          • x 表示解壓縮(extract)。
          • z 表示處理解壓縮
          • f 指定要解壓縮的檔案。
          • C 指定解壓縮到的目錄。
      1. 在剛剛解好的 /etc/postgresql/pgdata 設定recovery.signal 檔案
        1. 修改 postgres.conf 底下的 restore_command 跟 recovery_target 相關配置
          1. 啟動容器
             
            1. 驗證還原結果
              1. 查看 PostgreSQL 啟動 Log(最重要)

                在還原後第一次啟動 PostgreSQL,你應該能看到:
                如果失敗,你會看到:
                📌 檔案位置取決於 Docker 或裸機:
                環境
                Log 位置
                systemd 方式
                /var/log/postgresql/postgresql-XX-main.logjournalctl -u postgresql
                Docker container
                docker logs <container>
                手動啟動 pg_ctl
                stdout 顯示或 pg_log/ 目錄

                ✅ 2️⃣ 用 SQL 驗證

                ⬅️ 檢查資料庫實際還原到哪個時間點

                例如:
                📌 如果 pg_last_xact_replay_timestamp 為 NULL → 沒有做 PITR,代表資料庫不是在 recovery 模式啟動
          2. PostgreSQL
          3. Container - 指令ASP.NET - 應用程式生命週期
            Loading...