恢复备份

从备份中恢复 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 "备份文件有效"

# 检查元数据
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 或释放存储空间。
连接超时网络连接问题或数据库可用性问题验证数据库连接性,并在必要时增加超时值。
权限错误恢复用户没有所需的数据库权限在运行恢复操作之前,向恢复用户授予必要的权限。
这个主题怎么样?