V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · Feb 18, 2021 · 1113 views
    This topic created in 1904 days ago, the information mentioned may be changed or developed.

    是为了效率考虑吗?

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

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

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