Skip to content

PostgreSQL 灾难恢复演练执行

演练前准备

1. 演练计划确认

  • 演练目标:明确演练的具体目标,如验证RTO/RPO、测试恢复流程、检验团队响应能力等
  • 演练范围:确定参与演练的系统、数据库和团队
  • 演练场景:选择合适的演练场景,如主库故障、WAL文件损坏、磁盘故障等
  • 演练时间:安排合适的演练时间,尽量减少对业务的影响
  • 演练角色:明确演练团队成员的角色和职责

2. 环境准备

bash
# 检查演练环境硬件资源
free -h  # 检查内存
df -h    # 检查磁盘空间

# 检查 PostgreSQL 安装情况
dpkg -l | grep postgresql  # Debian/Ubuntu
yum list installed | grep postgresql  # CentOS/RHEL

# 确认备份文件存在
ls -la /backup/postgresql_full_*.sql
ls -la /archive/pg_wal/  # 检查 WAL 归档目录

3. 工具和脚本准备

  • 准备恢复脚本和工具
  • 准备监控和记录工具
  • 准备演练评估表格和模板
  • 准备沟通工具和渠道

4. 风险评估和缓解

  • 评估演练可能带来的风险
  • 制定风险缓解措施
  • 准备回滚计划
  • 获得相关部门的批准

演练执行流程

1. 演练启动会议

  • 确认演练目标和范围
  • 复习演练流程和角色
  • 检查环境和工具准备情况
  • 确认沟通机制
  • 获得演练开始的批准

2. 演练场景触发

根据选择的演练场景,触发相应的故障:

2.1 主库故障场景

bash
# 模拟主库故障(关闭主库服务)
systemctl stop postgresql@15-main

# 或断开主库网络
ifconfig eth0 down  # 或使用 ip link set eth0 down

2.2 WAL 文件损坏场景

bash
# 模拟 WAL 文件损坏
cp /dev/zero /var/lib/postgresql/15/main/pg_wal/000000010000000000000001 bs=1M count=1

2.3 磁盘故障场景

bash
# 模拟磁盘故障(卸载数据磁盘)
umount /var/lib/postgresql/15/main

# 或更改数据目录权限
chmod 000 /var/lib/postgresql/15/main

3. 恢复操作执行

根据演练计划,执行相应的恢复操作:

3.1 主从切换恢复

bash
# 检查从库状态
psql -h slave-host -U postgres -c "SELECT * FROM pg_stat_replication;"

# 提升从库为主库
pg_ctl -D /var/lib/postgresql/15/main promote

# 验证新主库状态
psql -h slave-host -U postgres -c "SELECT pg_is_in_recovery();"

3.2 从备份恢复

bash
# 停止 PostgreSQL 服务
systemctl stop postgresql@15-main

# 清理数据目录
rm -rf /var/lib/postgresql/15/main/*

# 从基础备份恢复
rsync -av /backup/pg_basebackup_20230101/ /var/lib/postgresql/15/main/

# 配置恢复参数
cat > /var/lib/postgresql/15/main/postgresql.auto.conf << EOF
restore_command = 'cp /archive/pg_wal/%f "%p"'
EOF

# 启动 PostgreSQL 服务
systemctl start postgresql@15-main

3.3 时间点恢复(PITR)

bash
# 配置时间点恢复参数
cat > /var/lib/postgresql/15/main/postgresql.auto.conf << EOF
restore_command = 'cp /archive/pg_wal/%f "%p"'
recovery_target_time = '2023-01-01 12:00:00'
recovery_target_inclusive = false
recovery_target_action = 'promote'
EOF

4. 演练监控和记录

4.1 监控恢复过程

bash
# 监控恢复日志
tail -f /var/log/postgresql/postgresql-15-main.log

# 监控系统资源
top -p $(pgrep -f postgres)

# 监控网络连接
netstat -an | grep 5432

4.2 记录演练过程

  • 记录演练开始时间和结束时间
  • 记录每个步骤的执行时间
  • 记录遇到的问题和解决方案
  • 记录恢复过程中的关键指标
  • 记录团队响应时间和协作情况

演练后验证

1. 数据完整性验证

sql
-- 检查数据库对象数量
SELECT count(*) FROM pg_tables WHERE schemaname = 'public';
SELECT count(*) FROM pg_indexes WHERE schemaname = 'public';

-- 检查关键表的数据量
SELECT count(*) FROM users;
SELECT count(*) FROM orders;

-- 运行数据一致性检查
ANALYZE VERBOSE;

2. 业务功能验证

sql
-- 运行业务验证查询
SELECT * FROM users WHERE user_id = 1;
SELECT * FROM orders WHERE order_date > '2023-01-01';

-- 测试业务流程
INSERT INTO test_table (col1, col2) VALUES ('test1', 'test2');
UPDATE test_table SET col1 = 'updated' WHERE col2 = 'test2';
DELETE FROM test_table WHERE col1 = 'updated';

3. 性能验证

bash
# 检查系统性能
top -p $(pgrep -f postgres)

# 检查 PostgreSQL 性能指标
psql -h localhost -U postgres -c "SELECT * FROM pg_stat_bgwriter;"
psql -h localhost -U postgres -c "SELECT * FROM pg_stat_database;"

4. 恢复目标验证

  • 验证 RTO(恢复时间目标)是否达成
  • 验证 RPO(恢复点目标)是否达成
  • 验证恢复后的系统是否满足业务需求

不同场景的演练执行步骤

1. 主从复制故障演练

执行步骤

  1. 触发主库故障
  2. 监控从库状态变化
  3. 执行主从切换
  4. 验证新主库状态
  5. 重建原主库并配置为从库
  6. 验证复制状态

关键指标

  • 主从切换时间
  • 数据丢失量
  • 业务中断时间
  • 团队响应时间

2. 数据中心故障演练

执行步骤

  1. 触发主数据中心故障
  2. 启动灾备数据中心
  3. 验证灾备数据中心的数据库状态
  4. 切换业务流量到灾备数据中心
  5. 验证业务功能
  6. 评估 RTO/RPO 达成情况

关键指标

  • 灾备数据中心启动时间
  • 业务切换时间
  • 数据一致性验证结果
  • 灾备系统性能

3. 备份恢复演练

执行步骤

  1. 删除或损坏测试数据库
  2. 从备份恢复数据库
  3. 验证恢复后的数据完整性
  4. 验证业务功能
  5. 评估恢复时间和数据丢失量

关键指标

  • 备份恢复时间
  • 数据完整性验证结果
  • 恢复后系统性能

演练监控和记录最佳实践

1. 实时监控

  • 监控恢复过程中的关键指标
  • 及时发现和解决问题
  • 记录恢复时间和进度

2. 详细记录

  • 记录演练的每个步骤和时间
  • 记录遇到的问题和解决方案
  • 记录团队协作情况
  • 记录系统资源使用情况

3. 可视化展示

  • 使用图表展示恢复进度和时间
  • 可视化展示 RTO/RPO 达成情况
  • 展示资源使用情况

4. 自动化记录

  • 使用自动化工具记录演练过程
  • 自动生成演练报告
  • 自动分析演练结果

常见问题处理

1. 演练过程中出现意外故障

  • 立即启动回滚计划
  • 评估故障影响
  • 采取相应的修复措施
  • 记录事故并分析原因

2. 恢复时间超过预期

  • 分析恢复时间过长的原因
  • 采取优化措施
  • 调整恢复策略
  • 更新 RTO 预期

3. 数据恢复不完整

  • 分析数据丢失的原因
  • 采取补救措施
  • 调整备份策略
  • 更新 RPO 预期

4. 团队协作不畅

  • 分析协作问题的原因
  • 改进沟通机制
  • 加强团队培训
  • 优化角色和职责

常见问题(FAQ)

Q1:如何选择合适的演练场景?

A1:根据以下因素选择合适的演练场景:

  • 业务需求和优先级
  • 系统架构和风险点
  • 团队技能和经验
  • 可用的资源和时间
  • 之前演练的结果和改进点

Q2:如何评估演练效果?

A2:从以下几个方面评估演练效果:

  • RTO/RPO 达成情况
  • 恢复流程的有效性
  • 团队响应能力和协作情况
  • 数据完整性验证结果
  • 遇到的问题和解决方案
  • 改进建议的可行性

Q3:如何提高演练的真实性?

A3:

  • 选择贴近实际的演练场景
  • 使用真实的生产数据(脱敏处理)
  • 模拟真实的故障条件
  • 限制演练前的准备时间
  • 引入随机因素增加不确定性

Q4:如何确保演练的安全性?

A4:

  • 进行充分的风险评估
  • 制定详细的风险缓解措施
  • 准备完善的回滚计划
  • 获得相关部门的批准
  • 在非生产或低峰时段进行演练

Q5:如何处理演练过程中的紧急情况?

A5:

  • 建立明确的紧急情况处理流程
  • 任命专门的紧急情况处理负责人
  • 准备必要的紧急修复工具和资源
  • 建立与相关部门的紧急沟通渠道
  • 定期进行紧急情况处理培训

Q6:如何持续改进演练效果?

A6:

  • 定期进行演练,验证改进效果
  • 引入新的演练场景和技术
  • 学习行业最佳实践
  • 参与外部演练和交流活动
  • 建立演练经验库,共享知识和经验