2

如果 Aries 算法已经知道在分析阶段之后要撤消哪些事务,为什么 Aries 算法会在撤消之前应用重做?

我知道(认为)它与 Lsn 编号和保持一致性有关,因为在磁盘上刷新的数据可能与在崩溃时撤消事务不同(由于脏),撤消事务页),但我找不到任何形式的“正式”回答这个问题(至少一个我能理解的)。

4

8 回答 8

6

因为即使提交了事务,缓冲区上也可能存在未刷新的页面。ARIES在缓冲区管理器中使用no-force 。重做会将事务表和脏页表带到崩溃时的状态。因此,成功的交易可以反映到稳定的存储中。

于 2012-05-24T20:22:59.413 回答
4

简短的回答:

我们需要在重做过程中重复所有历史崩溃,以在执行撤消过程之前确保数据库的一致性。

长答案:

恢复算法 ARIES,为了保证 DBMS 的原子性和持久性,执行 3 遍:

  1. 分析通行证:看看需要做什么(播放日志转发)
  2. Redo pass:确保磁盘反映日志中但不在磁盘上的任何更新,包括属于最终将回滚的事务的更新。这样可以确保我们处于一致的状态,这将允许逻辑撤消。
  3. Undo pass : 删除任何丢失交易的动作

UNDO 数据日志是逻辑的,而 REDO 数据日志是物理的:

  • 我们必须进行物理重做,因为我们不能保证数据库处于一致状态(例如,记录“INSERT VALUE X INTO TABLE Y”可能不是一个好主意,因为 X 可能会反映在索引中,但不是表格,反之亦然,以防插入时发生崩溃)
  • 我们可以做逻辑UNDO,因为在REDO之后我们知道事情是一致的。事实上,我们必须进行逻辑 UNDO,因为我们只 UNDO 一些操作,并且物理记录形式的 UNDO,例如,“拆分索引 y 的页面 x”在索引管理或不变量方面可能不再是正确的做法维护。在重做期间我们不必担心这一点,因为我们重复历史并重播所有内容,这意味着上次对数据库所做的任何物理修改仍然是正确的。

资源

于 2013-04-12T03:36:43.457 回答
1

不知道 aries 是什么,但假设它与其他数据库相同:

从一些基础备份开始应用重做日志,这基本上意味着在备份之后但在崩溃之前发生的所有数据更改语句都被应用。否则,您将丢失自上次备份以来发生的一切。

完成后,所有未完成的事务都会回滚,因为没有人可以拿起这些事务来完成它们。

于 2012-04-23T22:30:03.627 回答
0

您可以考虑在重做和撤消期间真正做了什么。根据退出的日志,重做正在重复历史。相反,撤消是创建新的 CLR 日志记录。当系统崩溃时,日志中有关于未提交的 xact 的记录。如果不撤消它们,将不会有 CLR 日志记录,从而导致不一致。

于 2015-02-25T03:41:36.850 回答
0

您希望在失败时返回状态,以便准确了解哪些事务需要撤消。想到的一个例子是连续的失败。从崩溃中恢复时的精确故障。在恢复期间,您将您的操作写入日志。如果您在恢复过程中失败,您将重做日志中的所有操作(甚至是上次尝试期间写入的 UNDO 操作!!)。

它提供了一个简单的算法,因为您不必处理特殊情况和特殊情况的特殊情况。可以保证,在恢复期间发生任何数量的崩溃后,我们将回到与恢复期间没有崩溃相同的状态。

于 2012-04-23T23:02:41.857 回答
0

如果您不支持记录级锁定,那么您可以使用仅重做获胜者事务的选择性重做。否则,最好在撤消之前重复历史(全部重做)

于 2012-11-29T15:06:55.273 回答
0

ARIES 的目标之一是简单。虽然重做之后的撤消可能不是必需的,但它使算法的正确性比在重做之前进行撤消的更复杂的方案更明显。

于 2015-02-26T03:56:38.600 回答
0

除了确保数据库是一致的并且磁盘与崩溃发生之前完全相同(正如 Franck Dernoncourt 回答的那样),在撤消之前执行重做的另一个好处是:

在恢复过程中可能会发生故障。Redo推进了整个“增量恢复”的进程,即如果redo或undo过程中发生故障,如果redo在undo之前执行,则下一个恢复可以拾取上一个恢复(redo)剩下的部分继续进行。

一个极端的情况是,如果 undo 在 redo 之前执行,并且在 undo 过程中再次失败,那么所有的 undo 都将成为徒劳。

于 2016-11-14T20:35:29.977 回答