還原備份
從備份中還原 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 或釋放儲存空間。 |
| 連線逾時 | 網路連線問題或資料庫可用性問題 | 驗證資料庫連線能力,並在必要時增加逾時值。 |
| 權限錯誤 | 還原使用者沒有所需的資料庫權限 | 在執行還原操作之前,向還原使用者授予必要的權限。 |
這個主題如何?