AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 299406
Accepted
Sigmund
Sigmund
Asked: 2021-09-11 06:31:28 +0800 CST2021-09-11 06:31:28 +0800 CST 2021-09-11 06:31:28 +0800 CST

数据库恢复 UNDO 阶段中的补偿日志记录 (CLR)

  • 772

补偿日志的重做信息对应于日志条目的撤消信息,这使得在撤消阶段必须创建它们。

在我看来,CLR 重做信息与触发它们的日志的撤消信息相同。

但是不应该是他们有REDO信息以便在中断恢复过程的情况下取消执行的UNDO操作吗?

这是一个例子:

让 T2 成为失败交易:

<#55, T2, P3, J=J+9, J = J-9, #53>

J=J+9 是重做操作,J = J-9 是撤消操作。

现在,在重做阶段附加到日志文件的 CLR 将是:

<#56, T2, J=J-9,__, #53>

J=J-9 是原始日志条目的撤消操作,作为 CLR 中的重做信息。如果恢复中断,日志条目#56 将在重做阶段执行。

CLR 的目的是确保重新启动恢复过程并再次运行它总是会导致相同的结果。在重新运行的重做阶段运行 J=J-9 操作如何确保这一点?

有人可以向我解释一下吗?

database-theory recovery
  • 1 1 个回答
  • 214 Views

1 个回答

  • Voted
  1. Best Answer
    Michael Green
    2021-09-12T22:19:51+08:002021-09-12T22:19:51+08:00

    补偿日志记录 (CLR) 在正常操作期间不会写入日志。它们是在处理回滚时产生的,无论是应用程序请求还是由于崩溃。由于它们的唯一用途是在回滚期间,它们只需要保存足够的信息来执行该操作,即示例中的 J=J-9。每个 CLR 通过 LSN 引用与其对应的原始日志记录配对。

    恢复的重做阶段的目的是将数据库恢复到崩溃时的状态。如果崩溃发生在恢复的中途,那么第二次恢复的重做阶段应该在第一次恢复的中途离开数据库。第二次恢复的重做阶段处理由第一次恢复的撤消阶段写入的 CLR。由于 CLR 链接到原始更新日志记录,知道最后处理的 CLR 会告诉第二个恢复的撤消阶段要跳转到哪个日志记录,以便它可以完成回滚。

    使用给定的示例,第一个恢复的撤消阶段将处理日志记录 #55 的撤消操作 (J = J-9) 并创建 CLR #56。然后它将返回到上一个链接记录(#53)。假设我们在处理之前崩溃了。第二次恢复的重做阶段将处理 CLR #56 的操作。如果这是最后一个 CLR,则第二次恢复的撤消阶段将沿着链接返回到 #53 并从那里完成回滚。在第二次和后续恢复期间,#56 有效地替换了#55。

    那么为什么要为这一切烦恼呢?为什么第二次恢复不能完全按照第一次恢复的方式进行?因为 Aries 假定缓冲区管理器使用窃取,没有强制策略。在第一次恢复期间,页面可能已部分回滚,然后从缓冲池中换出。因此,第二次恢复不是从第一次恢复的相同持久状态开始,因此它不能简单地第二次执行相同的操作。

    • 3

相关问题

  • 为什么 NULL 首先排序?

  • DB Normalization 是完全基于主键完成的还是基于所有候选键完成的?

  • SELECT 语句是否计入 DML?

  • 何时在 INT 上使用 TINYINT?

  • 数据库中的多维索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve