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

数据库基于日志的事务恢复为什么要分 undo 和 redo

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

    是为了效率考虑吗?

    我觉得理论上可以不需要 redo 吧,崩溃时把最后一个检查点到奔溃点的所有日志记录全部 undo 不就好了吗?

    把系统崩溃点之前已经提交或者回滚的事务进行 redo 而不是 undo 的原因是效率问题吗?

    5 条回复    2021-02-19 13:32:48 +08:00
    3dwelcome
        1
    3dwelcome  
       2021-02-18 23:08:32 +08:00 via Android
    恢复过几百 G 的数据飘过,只能 redo 。
    undo 你也存不下那么大的日志数据量。
    zxCoder
        2
    zxCoder  
    OP
       2021-02-18 23:59:18 +08:00
    @3dwelcome redo 和 undo 不是都需要保存日志记录吗
    3dwelcome
        3
    3dwelcome  
       2021-02-19 00:06:05 +08:00 via Android
    redo 逻辑简单啊,快照前后只要存 sql 语句,恢复就是简单 SQL 重放。
    undo 不一样,要跟踪所有的数据变动,万一一个 SQL 影响几百万数据,把每个数据变化值都要存下来,那多亏。
    zxCoder
        4
    zxCoder  
    OP
       2021-02-19 10:49:39 +08:00
    @3dwelcome 可能是实际数据库和课本说的不太一样,我才看到课本,课本上说的 redo 和 undo 都是保存一个<T,data,oldVal,newVal>的日志记录
    zjbztianya
        5
    zjbztianya  
       2021-02-19 13:32:48 +08:00
    @zxCoder undo 是保存在页(page)里的,redo 日志是保存在日志文件里的,崩溃恢复的时候,需要先执行 redo 日志,构造 undo page 再 undo 掉回滚的事务。而且 mvcc 也需要通过 undo page 实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1071 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 22:32 · PVG 06:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.