Skip to content

PostgreSQL 恢复操作规范

核心概念

恢复操作是数据库运维的重要组成部分,涉及以下几个关键概念:

  • 恢复类型:全量恢复、PITR(任意时间点恢复)、逻辑恢复
  • 恢复时间目标(RTO):系统从故障恢复到正常运行的最大可接受时间
  • 恢复点目标(RPO):故障发生后可容忍的数据丢失量
  • 恢复模式:热恢复、温恢复、冷恢复
  • 恢复测试:定期验证备份的可恢复性

恢复准备工作

1. 恢复环境准备

步骤

  1. 确保恢复目标服务器的硬件配置不低于原服务器
  2. 安装与原服务器相同版本的PostgreSQL
  3. 配置相同的数据库参数(除了端口、数据目录等实例级参数)
  4. 准备足够的存储空间
  5. 确保恢复所需的所有备份文件可用

检查清单

  • [ ] 恢复服务器已就绪
  • [ ] PostgreSQL软件已安装
  • [ ] 数据库参数已配置
  • [ ] 备份文件已就绪
  • [ ] 恢复脚本已准备

2. 备份文件验证

验证备份完整性

bash
# 验证全量备份完整性
pg_restore -l /backup/full/full_backup.tar > /dev/null 2>&1
if [ $? -eq 0 ]; then echo "全量备份完整"; else echo "全量备份损坏"; fi

# 验证WAL日志完整性
ls -la /backup/wal/ | grep -E "0000000100000000000000[0-9A-F]{2}" | wc -l

恢复类型与操作流程

1. 全量恢复

定义:使用全量备份恢复数据库到备份时间点

适用场景

  • 数据库完全损坏
  • 服务器硬件故障
  • 测试环境搭建

操作流程

bash
# 1. 停止PostgreSQL服务
pg_ctl -D /data/postgres stop -m fast

# 2. 清理数据目录
rm -rf /data/postgres/*

# 3. 恢复全量备份
pg_basebackup -h backup_server -U replicator -D /data/postgres -Fp -Xs -z -P -R

# 4. 启动PostgreSQL服务
pg_ctl -D /data/postgres start

# 5. 验证恢复结果
psql -c "SELECT count(*) FROM pg_database;"
psql -c "SELECT now();"

2. PITR恢复(任意时间点恢复)

定义:使用全量备份和WAL日志恢复数据库到任意指定时间点

适用场景

  • 误删除数据
  • 误操作导致数据损坏
  • 需要恢复到特定时间点

操作流程

bash
# 1. 停止PostgreSQL服务
pg_ctl -D /data/postgres stop -m fast

# 2. 清理数据目录
rm -rf /data/postgres/*

# 3. 恢复全量备份
pg_basebackup -h backup_server -U replicator -D /data/postgres -Fp -Xs -z -P

# 4. 创建recovery.conf文件
cat > /data/postgres/recovery.conf << EOF
restore_command = 'cp /backup/wal/%f %p'
recovery_target_time = '2023-01-15 14:30:00+08'
recovery_target_inclusive = true
EOF

# 5. 启动PostgreSQL服务(进入恢复模式)
pg_ctl -D /data/postgres start

# 6. 监控恢复进度
tail -f /data/postgres/log/postgresql*.log | grep -i "recovery"

# 7. 验证恢复结果
psql -c "SELECT now();"
psql -c "SELECT count(*) FROM users;"  -- 验证误删的数据是否已恢复

3. 逻辑恢复

定义:使用逻辑备份文件恢复数据库对象或数据

适用场景

  • 恢复单个表或数据库对象
  • 跨版本迁移
  • 数据选择性恢复

操作流程

bash
# 1. 恢复整个数据库
pg_restore -h localhost -U postgres -d postgres -v /backup/logical/full_db_20230101.tar

# 2. 仅恢复指定表
pg_restore -h localhost -U postgres -d postgres -t public.users -v /backup/logical/full_db_20230101.tar

# 3. 从SQL文件恢复
psql -h localhost -U postgres -d postgres -f /backup/logical/users_20230101.sql

# 4. 验证恢复结果
psql -c "SELECT count(*) FROM users;"

4. 表级恢复

定义:仅恢复单个或多个表,而不影响整个数据库

适用场景

  • 单表数据损坏
  • 表结构误修改
  • 误删除表

操作流程

bash
# 1. 从逻辑备份中恢复表结构
pg_restore -h localhost -U postgres -d postgres -s -t public.users /backup/logical/full_db_20230101.tar

# 2. 从逻辑备份中恢复表数据
pg_restore -h localhost -U postgres -d postgres -a -t public.users /backup/logical/full_db_20230101.tar

# 3. 验证恢复结果
psql -c "SELECT count(*) FROM users;"
psql -c "SELECT * FROM users LIMIT 10;"

恢复验证

1. 基本验证

步骤

  1. 检查数据库是否正常启动
  2. 验证数据库连接
  3. 检查数据库对象完整性
  4. 验证关键业务数据

命令

bash
# 检查数据库状态
pg_ctl -D /data/postgres status

# 验证数据库连接
psql -c "SELECT version();"

# 检查数据库对象完整性
psql -c "SELECT count(*) FROM pg_tables WHERE schemaname = 'public';"
psql -c "SELECT count(*) FROM pg_indexes WHERE schemaname = 'public';"

# 验证关键业务数据
psql -c "SELECT count(*) FROM users;"
psql -c "SELECT sum(amount) FROM orders;"

2. 高级验证

步骤

  1. 运行数据库一致性检查
  2. 执行业务功能测试
  3. 检查性能指标
  4. 验证备份链完整性

命令

bash
# 运行数据库一致性检查
vacuumdb -h localhost -U postgres -d postgres -f -z -v

# 执行业务功能测试
psql -c "SELECT * FROM generate_report();"

# 检查性能指标
psql -c "SELECT * FROM pg_stat_bgwriter;"
psql -c "SELECT * FROM pg_stat_database WHERE datname = 'postgres';"

故障恢复案例

1. 数据库服务器崩溃恢复

故障场景:数据库服务器硬件故障,无法启动

恢复流程

  1. 准备新的服务器硬件
  2. 安装PostgreSQL软件
  3. 恢复最新的全量备份
  4. 应用WAL日志到故障发生时间点
  5. 验证恢复结果
  6. 切换业务流量到新服务器

2. 误删除表恢复

故障场景:DBA误执行DROP TABLE命令删除了关键业务表

恢复流程

  1. 立即停止数据库写入操作
  2. 记录当前时间点
  3. 使用PITR恢复到误操作前的时间点
  4. 从恢复的数据库中导出误删的表
  5. 将表导入到生产数据库
  6. 验证数据完整性
  7. 恢复业务写入

恢复测试

1. 定期恢复测试

测试频率:每月至少一次

测试内容

  • 全量恢复测试
  • PITR恢复测试
  • 逻辑恢复测试
  • 表级恢复测试

测试报告模板

测试项目测试日期备份类型恢复时间数据完整性业务验证测试结果备注
全量恢复2023-01-15全量备份15分钟完整通过成功
PITR恢复2023-01-15全量+WAL25分钟完整通过成功恢复到10:30
逻辑恢复2023-01-15逻辑备份10分钟完整通过成功恢复单个表

2. 恢复演练

演练频率:每季度一次

演练内容

  • 模拟各种故障场景
  • 测试恢复流程的完整性
  • 验证RTO和RPO目标
  • 培训运维团队

演练评估

  • 恢复流程是否顺畅
  • RTO是否满足要求
  • RPO是否满足要求
  • 团队协作是否高效
  • 文档是否完整准确

最佳实践

1. 生产环境恢复建议

  1. 建立恢复手册:编写详细的恢复操作手册,包含各种场景的恢复流程
  2. 定期恢复测试:每月至少进行一次恢复测试,验证备份的可恢复性
  3. 记录恢复过程:详细记录每次恢复操作的步骤、时间和结果
  4. 培训运维团队:确保所有DBA都熟悉恢复流程
  5. 制定RTO/RPO目标:根据业务需求制定明确的恢复目标

2. 常见问题处理

  • 问题1:恢复过程中WAL日志缺失 解决方法:检查WAL日志备份完整性,从其他备份源获取缺失的WAL日志

  • 问题2:恢复时间超过RTO目标 解决方法:优化恢复流程,使用更快的存储介质,考虑使用并行恢复

  • 问题3:恢复后数据不一致 解决方法:检查备份文件完整性,验证恢复过程中的命令执行,运行数据库一致性检查

常见问题(FAQ)

Q1:如何选择合适的恢复类型?

A1:根据故障场景选择:

  • 数据库完全损坏:使用全量恢复
  • 误删除数据:使用PITR恢复
  • 单表损坏:使用表级恢复
  • 跨版本迁移:使用逻辑恢复

Q2:恢复过程中需要注意哪些事项?

A2:注意事项:

  • 确保恢复环境与原环境兼容
  • 验证备份文件的完整性
  • 记录恢复过程中的所有操作
  • 恢复完成后进行全面验证
  • 恢复前通知相关业务团队

Q3:如何缩短恢复时间?

A3:优化建议:

  • 使用更快的存储介质
  • 采用增量备份减少备份数据量
  • 配置并行恢复
  • 优化恢复脚本
  • 提前准备恢复环境

Q4:恢复测试的重要性是什么?

A4:恢复测试的重要性:

  • 验证备份的可恢复性
  • 熟悉恢复流程
  • 测试RTO和RPO目标
  • 发现备份策略的问题
  • 提高团队应对故障的能力

Q5:如何处理恢复失败的情况?

A5:处理方法:

  1. 停止当前恢复操作
  2. 分析恢复失败的原因
  3. 修复导致失败的问题
  4. 重新开始恢复操作
  5. 如多次失败,考虑使用其他备份或恢复方法
  6. 记录失败原因和解决方案,更新恢复手册