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