数据库复习(故障恢复)

前言#

本文针对考纲上的故障恢复所涉及到的知识进行归纳总结。



事务故障#

是什么#

事务运行结果没有达到预期终点(commit 或者显式rollback)比如:

  • 程序员写在程序里的预判,比如取钱事务,检测到余额不足就在else里rollback。
  • 算数溢出,并发死锁要进行撤销事务之类的。

解决方案#

事务撤销。


系统故障#

是什么#

(CPU故障,操作系统故障,DBMS代码错误,系统断电等软件故障)造成系统停止运作,使系统要重新启动。

解决方案#

对已经提交的重做。
对其他的撤销。


介质故障#

是什么#

(磁盘损坏 磁头碰撞 瞬时强磁场干扰等硬件故障)

解决方案#

装所有备份,然后根据日志对已经提交的事务一直重做。



详细解决方法#

事务故障#

  • 反向扫描事务,查找有更新操作的事务
  • 对该事务逆向处理,即把更新前的值写入数据库。
  • 继续反向扫描,遇到有更新操作的事务就逆向写数据库
  • 直到读到此事务的开始标记,就停下

系统故障#

无检查点#

  • 正向扫描日志,建立redo队列和undo队列,已提交的放入redo序列,其他的放在undo序列。
  • 对undo队列里的各个事务进行撤销处理,即反向扫描日志文件,把更新前的值写入数据库。
  • 对redo队列里的各个事务进行重做处理,即正向扫描日志文件,把更新后的值写入数据库。

有检查点#

image

  • 在重新开始文件,找到最新的检查点在日志文件的地址
  • 根据地址去日志文件找到最新检查点记录,得到检查点时刻所有正在执行的事务清单active-list
  • 建立redo和undo队列
  • 把active-list暂时放到undo队列
  • 从检查点开始正向扫描日志,新开始的事务还在undo队列,已提交的事务移到redo队列。
  • 完成之后,undo队列执行undo操作,redo队列执行redo操作。

介质故障#

image

  • 装入最新的海量数据库备份
  • 依次装入上一步海量数据备份时间后的所有增量数据库备份
  • 装入备份结束时刻的日志,利用日志重做所有故障点前已提交的事务,其他不用管

作者:lmj00

出处:https://www.cnblogs.com/lmj00/p/17912669.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   lmj625  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu