暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

KingbaseES数据库物理备份还原报错:ERROR: [075]: unable to find backup set with stop time less than '2026-08-18 19:13:00'

原创 周波 16小时前
15

一、背景

  某日,我们收到了业务反馈:数据库中一张关键表的数据"不见了"。经排查,该表在2026-08-18 19:13:03被DROP删除。万幸的是,我们一直保持着连续可用的物理备份。本以为只是一次常规的备份恢复操作,没想到却在恢复过程中踩了一个"时间线"的坑,折腾了一番才成功将数据找回。
  本文将完整复盘这次故障的发现、排查、恢复失败以及最终解决的全过程,希望能为同样使用KingbaseES数据库的朋友们提供一些参考。

二、故障发现与初步恢复尝试

2.1 定位删除时间

  发现表缺失后,我们首先需要确认表的删除时间。通过检索数据库运行日志,快速定位到了关键信息:

cd $KINGBASE_DATA/sys_log
grep -Ei "drop table.*表名" -C 5 *.log

  日志显示,该表于2026-08-18 19:13:03被删除。同时,该时间点附近还存在多个其他表的删除记录,推测是某次维护操作中脚本或人为失误,将该表误删除了。

2.2 执行基于时间点的恢复

  既然有连续的物理备份,我们决定将数据库恢复至表被删除前的状态。恢复使用人大金仓自带的备份恢复工具 sys_rman,操作步骤如下:

  • 第一步:修改 sys_rman.conf 配置文件,将 kb_path1 参数调整为恢复目标路径。(当然也可以在还原命令中通过 --kb1-path选项来指定还原目标路径)

  • 第二步:执行基于时间点的恢复命令:

/home/kingbase/KingbaseES/Server/bin/sys_rman \
  --config=/data/kingbase/backup/rman/sys_rman.conf \
  --stanza=kingbase2 \
  --type=time \
  --target='2026-08-18 19:13:00' \
  --target-action=promote \
  restore

--target-action参数值介绍

  • --target-action=pause:恢复完成后,数据库启动后进入只读状态,默认选项。
  • --target-action=promote:恢复完成后,切换时间线,数据库启动后进入读写状态。
  • --target-action=shutdown:恢复完成后,关闭数据库。
  本以为一切会顺利执行,然而命令返回了错误信息:

image.png
  这个报错让人困惑——我们明确知道该时间点是有可用备份集的,为什么工具却报错说找不到?

三、问题根因:被忽视的"时间线"

3.1 Timeline 是什么?

  在人大金仓(以及 PostgreSQL 内核)中,时间线(Timeline)是用来区分数据库历史中不同分支的标识符。当数据库发生时间点恢复(PITR)后,会生成一条新的时间线,后续的WAL日志和备份会沿着新的时间线继续推进。

  简单来说,时间线就像Git分支(还原恢复带 --target-action=promote):

  • 初始状态为Timeline 1
  • 发生一次恢复后,会产生 Timeline 2
  • Timeline 2 上的备份集与 Timeline 1 上的备份集属于不同的"分支"

3.2 问题出在哪?

  回到我们的场景,排查发现:

  • 备份确实存在: 2026-08-18 19:13:00 这个时间点有可用的备份集,但该备份集属于 Timeline 1。
  • 工具自动推进了时间线: 由于我们在恢复命令中没有通过–target-timeline显式指定时间线,sys_rman工具会自动读取归档目录下的 history文件来决定目标时间线。本例中,归档目录下存在 00000002.history文件,该文件记录了当前数据库的最新时间线为Timeline 2。
  • 写入配置并执行: 工具根据00000002.history自动将目标时间线设为2,并将该设定写入kingbase.auto.conf中的 recovery_target_timeline参数。
  • 恢复失败: 因为目标时间点对应的有效备份在Timeline 1 上,而工具要求恢复到Timeline 2,二者不匹配,导致 Timeline 1上的所有备份集均被跳过,最终报错找不到合适的备份集。

  总结根因一句话:备份在Timeline 1,工具却非要恢复到Timeline 2,南辕北辙,恢复自然失败。

四、解决方案

  针对上述问题,我们有两种可行的解决办法。

方案一(强烈推荐):显式指定目标时间线

  在恢复命令中手动添加 --target-timeline=1 参数,明确告诉工具使用 Timeline 1 进行恢复:

/home/kingbase/KingbaseES/Server/bin/sys_rman \
  --config=/data/kingbase/backup/rman/sys_rman.conf \
  --stanza=kingbase2 \
  --type=time \
  --target='2026-08-18 19:13:00' \
  --target-timeline=1 \      # ← 关键参数:显式指定时间线
  --target-action=promote \
  restore

  优点: 操作规范,精确控制,是官方推荐的标准做法。

方案二(临时备选):临时屏蔽 history 文件

  将归档目录下的 00000002.history 文件重命名,使 sys_rman 工具无法读取到 Timeline 2 的信息:

mv 00000002.history 00000002.history_bak

  再次执行恢复命令,工具因无法获取时间线 2 的信息,会自动回退或使用默认配置,从而顺利使用 Timeline 1 的备份集完成恢复。

  注意: 恢复完成后,建议将文件恢复原名,避免影响后续的归档和备份策略。

  最后通过逻辑导出导入完成单表恢复。

五、总结与避坑建议

  这次经历虽然曲折,但也给我们上了一课。总结几点经验供大家参考:

建议 说明
恢复时显式指定时间线 无论是基于时间点还是基于时间线的恢复,养成指定 --target-timeline 的习惯,避免工具自动判断出错
理解 Timeline 机制 深入理解时间线的概念,尤其是在发生多次 PITR 恢复后,备份集和 WAL 日志可能分散在不同时间线上
定期演练恢复流程 不要等到故障发生了才第一次执行恢复,定期在测试环境演练,提前发现类似问题
记录完整的恢复命令 将本次成功的恢复命令存档,作为后续故障处理的参考模板

  希望这篇博客能帮助遇到类似问题的同学少走一些弯路。如果你也踩过备份恢复的其他坑,欢迎在评论区交流分享!

最后修改时间:2026-08-25 16:35:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论