kingbase备份与恢复实战(七)—— 恢复演练与验收:从“能恢复”到“可交付预案”

引言

备份这活儿,就算你平时做得再勤快,要是不去做"演练和验收"的话,很多时候往往仅仅只是个心理安慰罢了:

你以为你能恢复。那咱们做运维交付,真正能拿得出手的东西,到底应该是啥呢?其实应该是一套能复制、能落地的闭环:

  • 事故发生之后,怎么去判断到底要用啥恢复策略
  • 恢复操作具体该怎么执行(也就是谁来做、大概做多久)
  • 恢复完了之后怎么去验收(啥叫"恢复成功"得定清楚)

要是失败了的话该咋回滚或者重新来过(这些在预案里面得写得清清楚楚的),这篇文章是《备份与复原实战》系列的最后一篇,那么我会直接给大伙拿出一套"拿来就能用"的模板:包含演练剧本,验收清单,处置流程图还有常见问题排查 ,你可以把它当成演练脚本来用,或者说当成运维交付的架构支撑也是没问题的。

@toc

一、演练目标与边界(先把"恢复到哪里"说清楚)

做演练的时候,最怕的就是有两件事没给说清楚:

  • 目标没弄清:到底要恢复到哪个时间点啊?又要恢复到哪个库里去啊?
  • 边界没弄清:在恢复的过程里面,允不允许去覆盖原来的库啊?能不能停机啊?

所以这块的话,我就直接给出一个标准的模板了(大伙可以直接复制过去填空):

项目 值(示例)
演练对象 backup_lab
演练方式 恢复到新库 backup_lab_drill
事故类型 误删表(DROP TABLE backup_demo.t_order
恢复策略 归档格式逻辑备份 + sys_restore 精准恢复
目标指标 RPO ≤ 24h,RTO ≤ 30min(示例)
验收标准 对象齐全、行数一致、关键聚合一致
回滚策略 演练在新库,不影响原库;失败可重做

1.1 角色分工(把"谁来做"写清楚,预案才可交付)

角色 主要职责 交付物
DBA/数据库运维 执行恢复、分析日志、给出恢复点建议 恢复操作记录、恢复耗时、问题清单
系统运维 服务启停、目录权限、磁盘空间、任务计划 系统侧日志、磁盘/权限确认
业务方/测试 业务验收、关键报表/接口验证 验收结果、异常描述、签字确认

二、演练流程图

三、案例脚本清单

那么为了让演练可以重复去搞,还能复用,通常来说建议把"造数据---制造事故---验收"这一套给拆成脚本的清单:

  1. 01_prepare_env.sql
    • 去创建演示库、模式还有表
    • 往里面插点演示数据
  2. 02_business_increment.sql
    • 备份完了之后新增的数据(这个是用来验证"精准恢复不会去覆盖其他表"的情况)
  3. 03_incident_drop_table.sql
    • 模拟出个事故来:DROP TABLE backup_demo.t_order;
  4. 04_acceptance_check.sql
    • 验收用的 SQL:查查对象清单、行数,还有关键的聚合数据
  5. 05_cleanup.sql
    • 把演练库 backup_lab_drill 给清理掉(这样下次演练的时候还能接着用)

四、演练记录表(让 RTO/RPO 可量化、可复盘)

演练搞完以后,你"凭感觉说恢复用了 20 分钟",这其实没啥说服力。那更靠谱一点的搞法是啥呢?也就是说,咱们得边演练边做记录。

时间点 动作 负责人 证据(日志/截图) 备注
T0 确认事故与恢复目标
T1 确认备份文件与可读性 sys_restore -l 输出
T2 创建演练库(隔离) SQL 执行记录
T3 执行恢复 恢复日志文件
T4 执行验收 SQL 查询结果截图/日志
T5 业务验收通过 业务签字/记录
T6 输出演练报告与改进项 报告文档

四、演练剧本(按时间线写,照做即可)

4.1 T0:演练前准备(5~10 分钟)

1)先确认备份文件是不是存在,而且大小合不合理(看个示例):

  • D:\KB_LAB\backup\logical\YYYYMMDD_HHMM_backup_lab_full.dump

2)接着要先"列出归档内容",确认一下这个备份集里面,是不是真的包含了你要的目标对象:

cmd 复制代码
cd /d D:\Tools\Kingbase\ES\Server\bin
sys_restore -l D:\KB_LAB\backup\logical\<dump>.dump > D:\KB_LAB\logs\<dump>.list.txt

3)准备一下演练的目标库(搞个新库隔离开来):

cmd 复制代码
cd /d D:\Tools\Kingbase\ES\Server\bin
ksql -U system -d kingbase -h 127.0.0.1 -p 54321
sql 复制代码
DROP DATABASE IF EXISTS backup_lab_drill;
CREATE DATABASE backup_lab_drill WITH TEMPLATE = template0 ENCODING = 'UTF8';

4)把"演练的目标指标"(也就是 RPO/RTO)先给定下来,并且记到本子上:

  • RPO:这次允许丢失的数据窗口有多大(比如 ≤ 24h)
  • RTO:这次允许的恢复耗时是多久(比如 ≤ 30min)

RPO/RTO 这俩东西可不是喊喊口号就行的,它们得能被"备份频率 + 实际恢复耗时 + 验收结果"给撑得住才行。

4.2 T1:恢复到新库(10~30 分钟,视数据量)

接着用 sys_restore 把备份给恢复到演练库里去:

cmd 复制代码
sys_restore -h 127.0.0.1 -p 54321 -U system -d backup_lab_drill D:\KB_LAB\backup\logical\<dump>.dump

4.3 T2:制造事故(演练用)

连上演练库,然后咱们去制造一个"误删表"的事故出来:

cmd 复制代码
ksql -U system -d backup_lab_drill -h 127.0.0.1 -p 54321
sql 复制代码
DROP TABLE backup_demo.t_order;
\dt backup_demo.*

4.4 T3:执行应急恢复(精准恢复)

从同一份备份集里面,咱们仅仅只恢复 t_order 这张表:

cmd 复制代码
sys_restore -h 127.0.0.1 -p 54321 -U system -d backup_lab_drill -t backup_demo.t_order D:\KB_LAB\backup\logical\<dump>.dump

4.5 T4:恢复后验收(必须做)

在 ksql 里面去执行下面的验收项(这是个示例):

sql 复制代码
\dt backup_demo.*
SELECT COUNT(*) AS account_cnt FROM backup_demo.t_account;
SELECT COUNT(*) AS order_cnt FROM backup_demo.t_order;
SELECT SUM(balance) AS total_balance FROM backup_demo.t_account;

如果你想让验收变得更"运维化"一点的话,我通常来说建议把验收给拆成三层来做:

  • 层 1:对象层(看看 schema/table/index 这些是不是都齐了)
  • 层 2:数据层(查查行数、关键的聚合数据一不一致)
  • 层 3:业务层(跑跑关键查询和关键报表,看还能不能用)

4.6 T5:形成"可交付预案"(演练产出不止一份库)

那应该有啥呢?其实是这些:

1)一份恢复操作的记录(里面有命令、路径、耗时还有日志)

2)一份验收的记录(包含 SQL 结果、业务校验、通过标准这些)

3)一份改进的清单(比如自动化、监控、保留策略、权限规范这些东西)

五、验收清单

验收项 验收方法 通过标准
备份集可读 sys_restore -l 能列出对象清单,无报错
目标库可连接 ksql -d backup_lab_drill 连接成功
表对象存在 \dt backup_demo.* 目标表存在
行数一致 COUNT(*) 行数与预期一致
关键聚合一致 SUM/COUNT 聚合结果一致
恢复过程可追溯 日志文件/任务计划记录 有开始/结束时间与结果

六、验收的"高频漏项"

很多时候恢复失败,往往仅仅不是因为"表没回来",而是"表虽然回来了,但是用起来感觉不对劲"。这里就有 4 个常见的漏项:

1)索引还在不在(这会影响性能还有业务体验的)

2)约束或者外键还在不在(这会影响数据一致性的)

3)序列对不对(这会影响自增主键写入的)

4)权限对不对(这会影响应用账户去访问的)

对应的最小检查动作(看个示例):

sql 复制代码
\di+ backup_demo.*
\d backup_demo.t_order

六、常见失败场景与处理建议

失败 1:恢复时报权限不足

处理建议:

  • 统一用管理员用户去执行恢复操作(比如用 system
  • 或者说提前在目标库里面,把需要的权限和所有者给准备好

失败 2:只恢复单表后外键/依赖报错

处理建议:

  • 先去把依赖链上游的对象给恢复了(像父表、类型、函数这些)
  • 或者说你干脆升级一下,搞个"按 schema 恢复",别光去恢复单表了

失败 3:备份存在但不可用(文件损坏/格式不匹配)

处理建议:

  • 日常做完备份之后,顺手跑个 sys_restore -l,做个快速的可读性检查
  • 每周最好搞一次恢复演练,免得等真出事了,才发现"备份根本没法用"

失败 4:PITR 找不到 WAL 段(归档缺失)

处理建议:

  • 把归档目录给弄到监控里面去:盯好容量、文件增长还有失败次数
  • 明确一下"归档留存周期",这个周期必须得把"基线备份到目标时间点"这段时间给覆盖住才行

七、演练报告模板

  • 演练时间:YYYY-MM-DD HH:MM
  • 演练人员:xxx
  • 演练对象:backup_lab
  • 事故类型:误删表
  • 恢复策略:逻辑备份+ sys_restore 精准恢复(或者搞 PITR)
  • RPO/RTO 目标:RPO=xx,RTO=xx
  • 实际恢复耗时:xx 分钟
  • 验收结果:通过/不通过
  • 问题与改进:
    • 备份耗时还得优化
    • 恢复脚本得固化下来
    • 归档目录得加上监控

八、把演练变成制度

  • 每周搞一次小演练:恢复到新库,再跑跑验收 SQL(用的时间短,但是收益大)
  • 每季度搞一次大演练:里面得包含应急沟通、切换还有业务验收签字
  • 每次演练必须得产出点改进项出来,而且要在下次演练之前给关掉(这样才能形成闭环)

总结

写到这一篇的时候,其实你已经把"备份恢复"从单纯的操作层面,给提升成"可交付能力"了:

  • 有策略(RPO/RTO 的目标很清晰)

  • 有流程(有那种可视化的处置路径)

  • 有演练(去恢复到新库,做隔离验证)

  • 有验收(有可以量化的通过标准)

复盘的时候也把问题的自动化还有监测部分给包含进去了。这样的话,《备份与复原实战》这个系列的7篇文章,也就算是完成了一个大循环了。咱们聊的东西,涉及到了入门级的逻辑备份,精确复原,物理备份,PITR,自动化,还有操作演习验证这些方面。这几乎就是运维场景里面最常被用到,也是非常重要的一套能力集合了。要是大伙还有啥别的问题的话,其实是可以在我这里留言,或者私信我也行。

相关推荐
满昕欢喜1 小时前
第2章 SQL Server 2019服务器管理
数据库·sqlserver
giaz14n9X1 小时前
Redis 分布式锁进阶第五十一篇
数据库·redis·分布式
念越2 小时前
【数据库系统概论期末复习】第四章 数据库安全性重点与常考题整理
数据库·数据库系统概论
拾贰_C2 小时前
【mysql | windows | installation】 MySQL5.安装
数据库·windows·mysql
睡不醒男孩0308232 小时前
达梦数据安装详细步骤(包含CLup一键部署达梦数据库实例)
数据库·达梦·clup
真实的菜2 小时前
【无标题】Redis 从入门到精通(七):缓存设计与最佳实践 —— 穿透、击穿、雪崩与一致性终极指南
数据库·redis·缓存
念何架构之路2 小时前
存储技术Redis
数据库·redis·缓存
淘源码d2 小时前
医院专业级PACS系统完整源码(C+VC+MSSQL)
c语言·数据库·sqlserver·源码·pacs系统·医学影像系统
wu8587734573 小时前
向量数据库不是银弹:从枚举漏检到 ReACT 多轮召回的实践路径
前端·数据库·react.js