为什么Aries在撤消数据库管理恢复之前执行重做?

use*_*418 2 database recovery aries

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

我知道(认为)它与Lsn数字有关并且在某种意义上保持一致性,因为在磁盘上刷新的数据可能与在崩溃时撤消事务不同(由于脏页面),但我找不到任何形式的"正式"答案(至少有一个我能理解的).

sua*_*uat 5

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


Fra*_*urt 5

简短回答:

\n\n

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

\n\n

长答案:

\n\n

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

\n\n
    \n
  1. 分析阶段:看看需要做什么(向前播放日志)
  2. \n
  3. 重做传递:确保磁盘重新\xef\xac\x82ects日志中但不在磁盘上的任何更新,包括属于最终将回滚的事务的更新。这样可以确保我们处于一致的状态,这将允许逻辑撤消。
  4. \n
  5. 撤消通行证:删除任何丢失交易的操作
  6. \n
\n\n

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

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

来源

\n