使用pgBackRest恢复PostgreSQL后数据库无法启动求助
问题描述
- 数据库服务器每日夜间通过pgBackRest执行备份
- 在另一台服务器测试恢复,执行命令:
pgbackrest --stanza=data --delta --log-level-console=detail restore,恢复操作成功
- 启动数据库时失败

- 具体启动日志:
<2023-06-25 16:07:31.606 EAT::@:[988027]:>LOG: 从归档恢复日志文件 "00000002.history" <2023-06-25 16:07:31.614 EAT::@:[988027]:>LOG: 开始基于时间点的恢复,目标时间为2023-06-23 01:21:00+03 <2023-06-25 16:07:31.621 EAT::@:[988027]:>LOG: 从归档恢复日志文件 "00000002.history" <2023-06-25 16:07:31.744 EAT::@:[988027]:>LOG: 从归档恢复日志文件 "00000001000018340000007D" <2023-06-25 16:07:31.825 EAT::@:[988027]:>FATAL: 请求的时间线2不是当前服务器历史的子时间线 <2023-06-25 16:07:31.825 EAT::@:[988027]:>DETAIL: 最新检查点位于时间线1的1835/40F14C88,但在请求的时间线历史中,服务器是在时间线1的103/A6FFFFE0处分支出来的。
解决方法
错误原因是恢复时指定的时间线(timeline 2)与备份所属时间线(timeline 1)不匹配,且目标时间线并非当前备份时间线的分支。
- 确认备份时间线
执行以下命令查看备份元数据,确认目标备份的时间线:
pgbackrest info --stanza=data
检查输出中对应备份的timeline字段,确认是否为timeline 1。
- 指定正确时间线恢复
若只需恢复到备份所在的timeline 1,重新执行恢复命令并指定时间线参数:
pgbackrest --stanza=data --delta --log-level-console=detail --target-timeline=1 restore
若需恢复到timeline 2的时间点
如果确实要恢复到2023-06-23 01:21:00+03这个timeline 2的时间点,需使用timeline 2分支点(103/A6FFFFE0)之后的备份,或直接使用timeline 2的备份进行恢复。清理残留文件(可选)
若之前的恢复残留了错误的时间线文件,先清理数据库数据目录再重新恢复:
rm -rf /var/lib/postgresql/15/main/* # 替换为你的数据库数据目录路径
内容的提问来源于stack exchange,提问作者Deo Felix
相关产品推荐
相关产品推荐

