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

JasonLaw 12天前 14

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

数据库转储的一种方法要求在转储过程中不能有事务处于活跃状态,并且必须执行一个类似于检查点的过程:

1. 将当前位于主存的所有日志记录输出到稳定存储器中。
2. 将所有缓冲块输出到磁盘中。
3. 将数据库的内容拷贝到稳定存储器中。
4. 将日志记录<dump>输出到稳定存储器中。

第 1 、2 和 4 步对应于 16.3.6 节中检查点的那三个步骤。

为从非易失性存储器数据丢失中恢复,系统利用最近一次转储将数据库复原到磁盘中。然后,根据日志,重做最近一次转储后所做的所有动作。注意,这里不必执行任何 undo 操作。

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

最新回复 (8)
  • lpts007 8天前
    引用 2
    在最近一次转储的基础上恢复,如日志(转储时间点之后的)中事务缺少<T,commit>行,忽略这个事务就行了,也无需 undo 。从一个一致状态,重复所有已提交事务,没啥问题啊。
  • 楼主 JasonLaw 8天前
    引用 3
    @lpts007 文章所说的是“然后,根据日志,重做最近一次转储后所做的所有动作。”,是所有的动作,并不是已结束的事务所做的动作。
  • lpts007 8天前
    引用 4
    @JasonLaw 如果动作分为 redo 动作 和 undo 动作。一个事务没有 commit 行那就是计入 undo-list 参与 undo 操作,不计入 redo-list,就不是 redo 动作,除掉 undo 的 所有动作 就是 所有 redo 了吧。
  • 楼主 JasonLaw 8天前
    引用 5
    @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 8天前
    引用 6
    @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 8天前
    引用 7
    @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 8天前
    引用 8
    @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天前
    引用 9
    @lpts007 书籍的版本是第六版(中文版和英文版都没有包含 commited 限定),应该是书籍的小错误。谢谢啦。
  • 游客
    10
返回