V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonLaw
V2EX  ›  数据库

关于“数据库系统概念 - 第 16 章 恢复系统 - 16.6 非易失性存储器数据丢失的故障”的疑问

  •  
  •   JasonLaw · 2020-06-28 10:43:30 +08:00 · 966 次点击
    这是一个创建于 1611 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在“数据库系统概念 - 第 16 章 恢复系统 - 16.6 非易失性存储器数据丢失的故障”中,有这么一段话:

    数据库转储的一种方法要求在转储过程中不能有事务处于活跃状态,并且必须执行一个类似于检查点的过程:
    
    1. 将当前位于主存的所有日志记录输出到稳定存储器中。
    2. 将所有缓冲块输出到磁盘中。
    3. 将数据库的内容拷贝到稳定存储器中。
    4. 将日志记录<dump>输出到稳定存储器中。
    
    第 1 、2 和 4 步对应于 16.3.6 节中检查点的那三个步骤。
    
    为从非易失性存储器数据丢失中恢复,系统利用最近一次转储将数据库复原到磁盘中。然后,根据日志,重做最近一次转储后所做的所有动作。注意,这里不必执行任何 undo 操作。
    

    在写入最后一条日志记录时,可能存在仍处于活跃状态的事务,如果不执行 undo 的话,数据库的状态就不是一致的,也无法保证事务的原子性。那么为什么不必执行任何 undo 操作呢?

    第 1 条附言  ·  2020-06-29 10:20:03 +08:00
    书籍的版本是第六版
    8 条回复    2020-06-29 10:22:06 +08:00
    lpts007
        1
    lpts007  
       2020-06-28 14:49:35 +08:00
    在最近一次转储的基础上恢复,如日志(转储时间点之后的)中事务缺少<T,commit>行,忽略这个事务就行了,也无需 undo 。从一个一致状态,重复所有已提交事务,没啥问题啊。
    JasonLaw
        2
    JasonLaw  
    OP
       2020-06-28 17:47:54 +08:00
    @lpts007 文章所说的是“然后,根据日志,重做最近一次转储后所做的所有动作。”,是所有的动作,并不是已结束的事务所做的动作。
    lpts007
        3
    lpts007  
       2020-06-28 18:12:37 +08:00
    @JasonLaw 如果动作分为 redo 动作 和 undo 动作。一个事务没有 commit 行那就是计入 undo-list 参与 undo 操作,不计入 redo-list,就不是 redo 动作,除掉 undo 的 所有动作 就是 所有 redo 了吧。
    JasonLaw
        4
    JasonLaw  
    OP
       2020-06-28 18:34:31 +08:00 via iPhone
    @lpts007 你看看 https://www.db-book.com/db6/slide-dir/PPT-dir/ch16.ppt 的 25 页,并不是你所说的那样。

    Recovery from failure: Two phases
    1. Redo phase: replay updates of all transactions, whether they committed, aborted, or are incomplete
    2. Undo phase: undo all incomplete transactions
    lpts007
        5
    lpts007  
       2020-06-28 21:14:27 +08:00   ❤️ 1
    @JasonLaw
    我再组织下语言:
    故障恢复,
    一种是运行中宕机,主存数据丢失。针对这种情况,PPT ch16 的第 25 页提出一种可行的恢复方式,恢复分为 2 个阶段,redo (如你指出,replay 所有操作)、undo 。
    一种是数据库磁盘文件损坏(这是你的帖子问的情况)。 恢复方式为在最近一次的数据库备份基础上,进行 redo (下面这个图片是 ppt 36 页,明确说是 commited )。
    ![image.png]( https://i.loli.net/2020/06/28/9l1K2Arbmc36oaj.png)


    至于为什么前者需要,redo replay 所有,再 undo,而后者不这样干,我认为可能是:

    数据库模型,在 提交时是否强制落盘 force/no-force,提交前是否禁止落盘 steal/no-steal 这两个方面( 4 种组合)的实现不一(应该是处于并发性能的考虑),导致会出现未提交的事务数据已经写到磁盘、或者是提交了的事务数据还不在磁盘上 这种短暂的状态。运行时宕机的恢复自然要考虑这样的事情,只有 redo 所有再 undo 才能保证恢复后数据“正确”。
    否则 仅 redo committed 的 会导致 磁盘上提前落盘的数据( which shouldn't be commited )仍然待在磁盘上---所以需要 redo+undo 来复写还原这部分数据到旧值。

    磁盘故障恢复,就不存在这样的情况---备份文件是前一个时间正确的数据,不存在“脏数据”,所以直接 redo 所有 committed 事务,增量更新上去就可以了
    JasonLaw
        6
    JasonLaw  
    OP
       2020-06-28 22:10:48 +08:00
    @lpts007 谢谢。不过书中所说的跟 PPT 所说的不太一样。书中的"redoes all the actions since the most recent dump occurred"不是应该换成"redo all transactions that committed after the dump"吗?

    书中所说的:
    To recover from the loss of nonvolatile storage, the system restores the database to disk by using the most recent dump. Then, it consults the log and **redoes all the actions since the most recent dump occurred**.

    PPT 所说的:
    To recover from disk failure
    1. restore database from most recent dump.
    2. Consult the log and **redo all transactions that committed after the dump**.
    lpts007
        7
    lpts007  
       2020-06-29 09:43:24 +08:00
    @JasonLaw 我不知道你看的那本是不是旧版,我简单查了一下,已无此种描述。相反的都是更清晰的 定语修饰 的说法了 http://www.engineering-bachelors-degree.com/database-software/uncategorized/failure-with-loss-of-nonvolatile-storage/ 这个链接较为接近你的书上的内容, 注意看那几句的区别。
    https://text.123doc.net/document/2110966-database-systems-concepts-4th-edition-phan-8-docx.htm 这是第四版,也是含有 commited 限定。
    JasonLaw
        8
    JasonLaw  
    OP
       2020-06-29 10:22:06 +08:00
    @lpts007 书籍的版本是第六版(中文版和英文版都没有包含 commited 限定),应该是书籍的小错误。谢谢啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1115 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1164ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.