V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

关于课本关于事务的系统故障恢复

  •  
  •   zxCoder · 2021-02-08 22:01:37 +08:00 · 500 次点击
    这是一个创建于 1179 天前的主题,其中的信息可能已经有所发展或是发生改变。

    系统故障的恢复 ( 1 ) 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列( REDO-LIST )。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列。 ( 2 ) 对撤销对列中的各个事务进行撤销处理。进行撤销处理的方法是,反向扫描日志文件,对每个撤销事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。 ( 3 ) 对重做队列中的各个事务进行重做处理。进行重做处理的方法是:正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作,即将日志记录中“更新后”的值写入数据库。

    我的理解是,事务对数据库的写操作一开始都是操作在内存,还没刷回磁盘里,然后发生了系统故障

    然后恢复的时候,已提交的事务,修改都只是在内存里,所以现在丢失了,需要重做,而未提交的事务,可能是做了一部分修改,也是在内存里,我的疑问是,这里为什么要撤销呢?意思是这一部分在内存的修改也有可能会刷到磁盘里吗?

    3 条回复    2021-02-19 09:42:34 +08:00
    mahogany
        1
    mahogany  
       2021-02-09 18:08:27 +08:00
    内存的数据一定是最新的,但是内存刷盘操作随机发生,没有时序和逻辑的保证,磁盘中的数据页的同步状态完全不可知。突然故障,只能依赖 redolog 来恢复。
    zxCoder
        2
    zxCoder  
    OP
       2021-02-11 11:57:05 +08:00
    @mahogany 不太理解 undo 和 redo 的区别,既然发生故障了,那按理说不是所有事务都需要重做吗
    mahogany
        3
    mahogany  
       2021-02-19 09:42:34 +08:00
    @zxCoder 不是的,都是增量部分。你可以看一下 redo log 和 undo log 的实现原理,然后就明白了。
    比如说你会发现 redo log 和 undo log 其实不对称,undo log 记录在 redo log 里面;如果数据库不要求实现事务的话,那么 undo log 并不必要,redo log 才是必须的。
    你看的这个概括的东西缺乏很多具体细节,当你更深入地了解一些的时候,才会有比较好的理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   789 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:52 · PVG 03:52 · LAX 12:52 · JFK 15:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.