還原備份

從備份中還原 IBM Bob PostgreSQL 資料庫,以從資料遺失中復原、遷移環境或返回已知良好狀態。

使用此程序從備份檔案中還原 IBM Bob 及相關 PostgreSQL 資料庫。還原程序包括驗證備份完整性、準備環境、重建目標資料庫、還原備份內容,以及在將應用程式服務恢復運作之前驗證已還原的資料。

警告:

還原資料庫會將現有資料庫內容替換為所選備份檔案中的資料。開始前必須停止應用程式服務,因為進行中的資料庫寫入可能會破壞還原程序。在執行生產環境復原之前,請務必先在非生產環境中測試還原程序。

開始之前

在還原資料庫之前,請驗證以下項目:

驗證備份完整性

# 存取備份 PVC
oc run backup-verify -n <bob-instance-namespace> --image=busybox --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "backup-verify",
        "image": "busybox",
        "command": ["sh"],
        "stdin": true,
        "tty": true,
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

# 在 Pod 內部執行:
cd /backups/bob-db
gunzip -t backup_bob_20260902_020000.sql.gz  # 測試 gzip 完整性
cat backup_bob_20260902_020000.sql.gz.meta   # 檢查中繼資料

確認備份詳細資訊

  • 備份時間戳記與預期的還原點一致。
  • 資料庫名稱正確。
  • 備份大小合理。
  • 中繼資料檔案存在且可讀取。

建立還原前備份

在還原之前,備份目前的資料庫狀態:

oc exec -n <bob-instance-namespace> bob-db-1 -- \
  pg_dump -U postgres bob | gzip > pre-restore-backup-$(date +%Y%m%d_%H%M%S).sql.gz

還原程序

停止所有 IBM Bob 應用程式服務,以防止在還原期間發生資料庫寫入。

# 縮減 Bob 服務
oc scale deployment bob-admin-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=0 -n <bob-instance-namespace>

# 驗證 Pod 已終止
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

建立一個臨時還原 Pod,使其同時能夠存取 PostgreSQL 資料庫和備份儲存位置。

# 取得 PostgreSQL 映像檔
POSTGRES_IMAGE=$(oc get cluster bob-db -n <bob-instance-namespace> -o jsonpath='{.spec.imageName}')

# 建立還原 Pod
oc run postgres-restore -n <bob-instance-namespace> --image=$POSTGRES_IMAGE --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "restore",
        "image": "'$POSTGRES_IMAGE'",
        "command": ["bash"],
        "stdin": true,
        "tty": true,
        "env": [
          {"name": "PGHOST", "value": "bob-db-rw"},
          {"name": "PGPORT", "value": "5432"},
          {"name": "PGUSER", "value": "postgres"},
          {"name": "PGPASSWORD", "valueFrom": {"secretKeyRef": {"name": "bob-db-app", "key": "password"}}}
        ],
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

在還原 Pod 內部,驗證備份檔案並測試資料庫連線:

# 列出可用備份
ls -lh /backups/bob-db/

# 驗證備份檔案
BACKUP_FILE="/backups/bob-db/backup_bob_20260902_020000.sql.gz"
gunzip -t $BACKUP_FILE
echo "Backup file is valid"

# 檢查中繼資料
cat ${BACKUP_FILE}.meta

# 測試資料庫連線
psql -c "SELECT version();"

對於大多數復原情境,請還原至空白資料庫,以確保清除過時或衝突的資料。

警告:

此步驟將永久刪除目前的資料庫內容。

psql -c "DROP DATABASE IF EXISTS bob;"
psql -c "CREATE DATABASE bob;"

透過將備份內容載入至 PostgreSQL 來還原資料庫:

# 解壓縮並還原備份
gunzip -c $BACKUP_FILE | psql -d bob

# 根據備份大小,此程序可能需要幾分鐘

在將應用程式恢復運作之前,驗證還原是否已成功完成:

# 連線至已還原的資料庫
psql -d bob

# 驗證資料表是否存在
\dt

# 檢查關鍵資料表的資料列計數
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM projects;
SELECT COUNT(*) FROM conversations;

# 驗證近期資料
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

# 結束 psql
\q

資料庫驗證成功完成後,重啟 IBM Bob 服務並允許其重新連線至已還原的資料庫。監視應用程式啟動日誌,確認是否有錯誤或遷移失敗。

# 離開還原 Pod
exit

# 擴充 Bob 服務
oc scale deployment bob-admin-service --replicas=1 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=3 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=2 -n <bob-instance-namespace>

# 驗證 Pod 正在運作
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

# 檢查應用程式日誌
oc logs -n <bob-instance-namespace> -l app.kubernetes.io/name=bob --tail=50

在允許使用者重新連線之前,完成端對端應用程式驗證:

# 測試應用程式端點
curl -k https://bob.example.com/health

# 驗證使用者登入是否正常運作
# 驗證資料存取是否正常運作
# 驗證關鍵功能是否正常運作

驗證成功表示還原程序已完成。

最佳實踐

  • 始終先在非生產環境中進行測試。
  • 在開始之前,建立目前資料庫狀態的還原前備份。
  • 在開始之前驗證備份完整性。
  • 規劃停機時間並與使用者溝通。
  • 記錄還原程序和結果。
  • 還原後驗證資料完整性。
  • 還原後密切監視應用程式。

常見還原問題

問題原因解決方案
儲存空間不足還原操作的磁碟空間不足在還原之前擴充 PVC 或釋放儲存空間。
連線逾時網路連線問題或資料庫可用性問題驗證資料庫連線能力,並在必要時增加逾時值。
權限錯誤還原使用者沒有所需的資料庫權限在執行還原操作之前,向還原使用者授予必要的權限。
這個主題如何?