“异时页镜像的介质恢复为这项边界给出固定页集合的完整构造:开始元数据确定redo下界20和undo保留下界10,四页分别复制为A0@0、P0@0、Q7@30、R4@70,再从完整日志恢复到80…”
逐页复制一份正在更新的数据库,会拿到不同时刻的页面:某页还旧,另一页已经包含后来撤回的写入。这种备份可以恢复,前提是保存了足够的日志和确切的边界。一份可用备份是页镜像、恢复元数据和连续日志共同组成的承诺。
形式陈述
本页明确提供的存储接口
使用WAL的全局LSN、事务记录和pageLSN。数据库包含固定页面集合,每页一个整数单元;更新、CLR和提交全部记录,事务按终点持锁方式隔离。页写是原子的,同页稳定图像按pageLSN单调前进;复制读取得到某一完整稳定图像,不会读到半新半旧。日志与备份保存在不会被本次数据介质故障同时毁坏的位置。
这里只恢复整个声明的页面集合。排除未记录写入、页面创建/删除或编号复用、损坏而未被检测的备份、prepared事务与分叉历史。数据库身份和历史代际必须匹配。实际产品还需页校验、文件清单、分配元数据及介质冗余;附件检验逻辑记录,并不执行真实设备I/O。
开始快照给两种下界
在开始复制前,短暂冻结恢复元数据,取得下一条记录的位置B、精确事务表TT和保守脏页表DPT。DPT的recLSN不晚于该页最早尚未稳定的更新。该快照不刷净数据页;放开元数据保护后,事务与逐页复制继续交错。
令
所有LSN小于r的更新都已进入当时稳定页,后续复制的页不会更旧。因此r是保守的重做起点。DPT缺少一页意味着它在开始边界干净,不意味着之后也不会被修改。本页从r起检查全部相关更新及CLR,不能把开始DPT当作永久页面白名单。
事务表另保存未完成事务的lastLSN及保守的firstLSN。为保证以后loser能沿链撤销,保留
q可能早于r。DPT负责缺失的页面前滚,事务前缀负责未来可能需要的回退,不能用其中一个替换另一个。求边界并登记q的日志保留pin必须和日志回收串行化;不能先放开保护,再希望旧段恰好还在。
这份短元数据快照是本教学输入接口。生产系统可用模糊检查点和保守合并获得所需下界;那种非同时快照还须计入checkpoint begin边界。本页没有把“任意时刻各读一次TT/DPT”冒充一致的元数据快照。[1,§8]
什么时候发布备份
在快照之后,复制所有声明页面。最后一页复制完成时,记已生成日志的末记录LSN为E;各页镜像的pageLSN均不超过E。先使所有页副本及连续日志区间[q,E]稳定,再持久发布含身份、页清单、B/r/q/E、TT种子的完成manifest。任一对象未完成,就不能宣布备份READY。
manifest发布前崩溃,未完成备份不可选;发布后,所有依赖已稳定。源数据库的pin可在备份自身拥有独立可读的[q,E]副本后释放,但保留更晚恢复目标还要继续归档。删除源副本与删除唯一归档副本是两种不同动作。
从备份恢复到目标T
目标必须是完整日志记录的边界,且T≥E,归档覆盖[q,T]而没有缺口。先检查身份、完成标记、页面集合、各页LSN及日志连续性,再执行:
- 装入每页镜像,从r扫描到T。对UPDATE和CLR,若该页pageLSN小于记录LSN,应用redo信息并推进pageLSN;否则跳过
- 用B时的TT为种子,扫描B到T更新事务状态和lastLSN。CLR可以属于仍在正常执行的事务,不自动解释为全abort决定
- 对目标处未提交的事务,使用ARIES的重复历史与续接撤销:普通更新写CLR后撤销,CLR沿undoNextLSN跳转。提交事务保留效果。本文终点持锁使不同未完成事务不会对同一单元留下相互覆盖的未提交写
恢复结果在完成undo并稳定所需恢复记录之前不对业务开放。T的含义是“纳入截至T的稳定提交”,不把在T时仅写入但未提交的事务也交付为成功。
介质恢复中再次崩溃
恢复生成的新CLR及END也加入同一恢复历史。若再次崩溃,保留原已完成manifest、原镜像和从q起的归档,只把已经稳定的新恢复记录接在原目标T之后;未稳定的后缀丢弃。附件的resume_restore重新装入原镜像,从原r重做至新的稳定末位置,再按原TT种子与后续日志续接undo。新末位置包含恢复动作,没有因此接收新的业务提交。
这条重入路径允许舍弃上一次恢复的临时页,代价是重新读基线;稳定CLR先重做补偿,再由undoNextLSN跳过已撤的原更新。未稳定CLR则可能重新生成。两种情况都不需要q之前的日志,但原备份和[q,新稳定末位置]必须继续保留,不能因一次undo已执行便提前删掉。附件的restart是另一项系统重启辅助器,只接收从10起的完整日志;截前缀的介质恢复必须选resume_restore,不能混用。
直觉
页镜像提供一个个能继续前滚的起跑位置,pageLSN告诉恢复者每页已经跑到哪里。日志不是只补“整个备份之后”的变化:某个脏页在备份开始前就已落后,因而需要更早的redo;某个长事务更早就开始,还可能需要更早的undo。
CLR在这里尤其重要。镜像可能恰好复制到一次试探性写入;后来业务已经局部撤回并提交。只有按顺序重放那条补偿,备份里的试探值才会消失。仅按“事务最后提交了”筛选普通UPDATE无法表达这一点。
例子与边界
一份从未要求同时一致的镜像
沿用保存点例:T在20写A=2,30写Q=7,40写P=9,50/60分别补偿P/Q,70写R=4,80提交。30之后、40之前开始备份,B=40;A20仍脏,Q30已经稳定,所以DPT={A:20}。T的firstLSN=10、lastLSN=30,于是r=20、q=10。
合法复制轨迹为A0@0、P0@0、Q7@30、R4@70,结束E=70。A/P先复制,Q在补偿前复制,R在70稳定后复制。表中的@后面是镜像自身的pageLSN,不是复制事件时间。
恢复到T=80时,记录20使A成为2;30因Q镜像LSN已30而跳过;40把P改9,50再改0;60把Q改0;70因R镜像已70而跳过。提交80证明T是winner,结果A2/P0/Q0/R4。
两个下界错误各损失什么
若把开始位置B40直接当redo起点,A20永远不被补回,错误结果为A0/P0/Q0/R4。若扫描UPDATE却丢弃CLR50/60,错误结果为A2/P9/Q7/R4。一个遗漏开始前未落盘内容,另一个遗漏已经完成的局部回退,两者不同。
继续日志:90开始U,100写Q=8但不提交;110开始V,120写P=6,130提交V。恢复到130,重做得到A2/P6/Q8/R4,再撤销U100得到A2/P6/Q0/R4。V的已提交写保留;不能因U也出现在完整日志里就让Q8可见。
q大于10时也要能再次恢复
先有OLD在10开始、20写A=5、30提交,并可靠刷出A。NEW在40开始、50写B=9未提交。此时取元数据B=60,DPT仅有B页的50,得到r=50、q=40;复制A5@20、B0@0,结束E=50。这里元数据位置B与名为B的页面是两种对象。
只保留记录40/50就足以首次恢复:redo50得到B9,undo50生成CLR60把B改0,undoNextLSN指向40。仅把CLR60稳定后再次崩溃,归档现在恰为40/50/60。resume_restore从原镜像重做50、60,再沿60跳到40,写END70;A5保持,B0交付,不再生成第二条补偿50的CLR。强求读取10..30会错误拒绝这份合法备份,q下界本来就允许它们已被回收。
为什么不能随意选择更早目标
同一备份不能按本接口恢复到60,因为R镜像已经含70的R=4。只重做≤60的记录不会把这个未来内容抹掉。即使知道该页LSN超前,也不能靠LSN数字反推出旧字节;需要更早基线或另有完整后向版本机制。T≥E是本协议可核验的保守准入条件,不是所有可能备份的最早可恢复时刻的精确刻画。
缺失日志即使恰好被后来的全值写覆盖,也不能被静默忽略。比如某次目标上的最终整数仍相同,但遗漏的记录可能属于事务状态或另一页。本页按完整区间拒绝缺60、缺120等归档,返回恢复失败;不会把“找不到”当成“不需要”。
推论与应用
每页归纳给出前滚正确性
固定一个页面。复制得到它在某时刻的完整稳定前缀,包含所有LSN≤该pageLSN的该页动作;WAL保证相应日志存在。小于r的该页动作在复制开始前已稳定,故不存在一个必须重做却位于r之前的缺口。此后按LSN递增,已包含的动作跳过,首个未包含的动作应用,归纳得到截至T的完整该页历史,包括CLR。
目标不早于复制结束,排除了镜像含T之后动作的问题。全页完成后,事务表确定尚未提交的链,再由已有undo不变量去掉loser效果。前滚和回退的职责由此分别证明,不能把一份页文件存在当作恢复证书。
成本与恢复演练
P页、扫描L条记录、撤销游标共访问K条记录时,附件的顺序扫描与LSN字典查找在字长及期望散列表模型下花O(1+P+L+K),保留页、日志索引、事务表和新CLR的空间逐项线性。复制真实字节还应按备份总字节及日志长度计I/O;附件一个整数代表一页,不能据此声称现实备份每页常数时间或给出带宽预测。
每次resume_restore重新装入原镜像,均重新支付上述扫描与复制成本;任意多次崩溃不承诺总工作量有界。一次有用的演练应删除源数据副本,只用声明的manifest、镜像及日志恢复;然后分别注入日志缺口、早目标、未发布清单和错误历史身份。改为更早复制R0@0,虽然有机会支持更早目标,当前通用接口仍要求T≥E;若要放宽,应重证每页覆盖及事务状态条件。完整数字、失败证书和日志回收衔接见恢复与保留终点。
参考资料
- C. Mohan et al.,ARIES原论文,§8,印刷pp.131–133:模糊镜像、media recovery redo point、页LSN过滤及未完成事务撤销。本页固定页集合和原子开始元数据为教学接口,未声称实现整套ARIES备份
- PostgreSQL 18,Continuous Archiving and Point-in-Time Recovery,§25.3开头、§25.3.4发布步骤及§25.3.5恢复目标的Note:物理基线、连续WAL与结束边界。用于说明物理备份和归档的组合;其MVCC可见性、页保护和时间线处理不能用本文物理undo替代