检查点

2025年7月1日 | 阅读 8 分钟

引言

数据库管理系统(DBMS)旨在以准确、精确和高效的方式处理、维护和处理不同应用程序中的数据。DBMS 中存在许多用于其他目的的概念,其中一个概念就是检查点,它解决了系统故障期间数据完整性和可恢复性最关键的问题。

在系统发生故障时,我们会检查日志以确定哪些事务需要重做(redone)以及哪些事务需要撤销(undone)。为此,我们会搜索整个日志以确定此信息,这会导致两个主要困难:

  • 这非常耗时,因为我们可能需要搜索所有日志文件。在最坏的情况下,事务可能存储在日志的末尾。
  • 许多需要重做的事务已经将其更新写入了数据库。
DBMS Checkpoint

例如:在在线数据库系统(如航空公司预订系统)中,每分钟可以处理数百个事务,因此对于此类数据库,日志包含大量信息。

因此,使用一种称为检查点的方案来限制在系统故障时需要处理和处理的日志信息量。

  • 检查点是一种机制,其中所有先前的日志都会从系统中删除并永久存储在存储磁盘上。
  • 检查点就像一个书签。在事务执行期间,会标记这些检查点,然后执行事务,然后使用事务的步骤创建日志文件。
  • 当到达检查点时,事务将更新到数据库,并且在此之前,整个日志文件将从文件中删除。然后,日志文件将更新为直到下一个检查点为止的事务的新步骤,依此类推。
  • 检查点用于声明 DBMS 在此之前的状态是一致的,并且所有事务都已提交。

检查点的类型

DBMS 中基本上有两种类型的检查点:

  • 一致性检查点(Consistent Checkpoints):这些检查点确保在标记检查点之前必须正确完成每个事务。这会造成短暂的干扰或成为当前正在进行的业务的障碍,但它能带来更安全的恢复。
  • 模糊检查点(Fuzzy Checkpoints):这些检查点允许在标记检查点期间继续进行数据库中所有正在进行的事务。这种改进提高了性能,但也需要额外的机制来进行部分恢复。

检查点的工作原理

在系统为其数据库执行检查点后,它会执行各种操作以确保一致性并支持未来的恢复过程。

当系统发出检查点时,将执行以下操作:

  • 将易失性存储器缓冲区中的日志信息复制到稳定存储器上的日志。
  • 将易失性存储器缓冲区中的所有数据库更新写入磁盘。
  • 将检查点记录写入磁盘上的日志,以便后续的数据库恢复与检查点协调。

使用检查点进行恢复

在发生任何系统故障后,恢复系统及其数据库非常重要。通过减少需要检查的日志文件的数量,整个系统可以显著减少用于读写操作检查日志文件所需的时间,这要归功于检查点

在恢复过程中,会维护两个非常重要的列表:

  • 重做列表(Redo Lists):此列表包含在恢复期间必须重做的所有事务。
  • 撤销列表(Undo Lists):这些列表包含在恢复阶段必须撤销的事务

这些列表根据事务是否具有开始日志、提交日志或中止日志来形成和填充。

恢复系统以以下方式从故障中恢复数据库:


DBMS Checkpoint
  • 恢复系统从后往前读取日志文件。它从 T4 读取到 T1。
  • 恢复系统维护两个列表:重做列表和撤销列表。
  • 如果恢复系统看到带有 <Tn, Start> 和 <Tn, Commit> 的日志,或者仅带有 <Tn, Commit> 的日志,则将事务放入重做状态。在重做列表及其之前的列表中,所有事务都会被移除,然后在保存它们的日志之前进行重做。
  • 例如:在日志文件中,事务 T2 和 T3 将具有 <Tn, Start> 和 <Tn, Commit>。T1 事务在日志文件中只有 <Tn, commit>。这就是为什么在跨越检查点后事务被提交。因此,它将 T1、T2 和 T3 事务放入重做列表。
  • 如果恢复系统看到带有 <Tn, Start> 但没有提交或中止日志的日志,则将事务放入撤销状态。在撤销列表中,所有事务都会被撤销,并移除它们的日志。
  • 例如:事务 T4 将具有 <Tn, Start>。因此,T4 将被放入撤销列表,因为此事务尚未完成并在中间失败。

何时应该进行检查点?

没有准确或预定义的检查点时间或实例,也没有严格的规则规定何时进行检查点。但是,有一些常见的检查点策略和时机,可以有效地进行检查点。这些是:

  • 在执行了固定数量的事务之后。
  • 在固定的时间间隔之后。
  • 当缓冲区容器达到某个级别时。
  • 当系统负载较低时。
  • 最后,当操作员手动触发时。

可以使用各种不同的标准来确定何时应进行检查点。

通常,在较小的系统上,每 5 到 10 分钟进行一次检查点。或者,可以在完成一定工作量或处理完一定数量的事务后,或根据操作员的要求进行检查点。

示例:在 DBMS 恢复中使用检查点

假设您正在运行一个银行数据库系统。它支持在不同账户之间转账等事务。该系统使用写前日志(WAL)并在每 10 个事务后执行一次检查点。

假设以下事务按顺序执行:

T1:从 A 转账 1000 卢比到 B

T2:向 C 存款 500 卢比

T3:从 D 提取 200 卢比

...

T10:从 E 转账 400 卢比到 F ← 在此处执行了检查点

T11:向 A 存款 1000 卢比

T12:从 B 提取 300 卢比

在检查点期间,DBMS 将内存中所有修改过的数据写入磁盘。它还将元数据写入日志,包括截至 **T10** 的所有已提交事务、活动事务列表以及最后一个日志条目的日志序列号(LSN)。

现在假设在 T12 之后发生了系统崩溃。

重启后:

  • 恢复系统反向读取日志,直到找到T10 处的最后一个检查点
  • 然后,它恢复在 T10 处保存的一致状态,并仅在 T11 和 T12 已提交的情况下重放它们。
  • 任何未提交的事务(例如 T12 如果未完成)将被撤销

因此,如果没有检查点,系统将从头开始扫描整个日志,重做/撤销所有 12 个事务。有了检查点,只需要处理T11 和 T12,从而节省了大量的恢复时间和资源

检查点的优点

  • 由于它减少了需要检查的日志文件数量,因此通过更快地检查日志文件,可以实现更快的系统恢复
  • 它会截断旧的日志,释放系统内存,从而提高性能。
  • 它提供了可靠性,并确保数据库始终可以返回到一致状态。
  • 帮助服务以最少的服务中断来维持连续性,减少停机时间
  • 检查点允许高效的增量备份策略

检查点的挑战

  • 将数据库和日志的所有缓冲区写入磁盘需要系统资源,增加了开销。
  • 将检查点操作与活动事务和其他恢复机制协调可能很复杂。
  • 在检查点期间,系统资源消耗很大,例如大量内存和磁盘 I/O,尤其是对于大型数据库。
  • 如果检查点没有得到很好的计时,它们会干扰事务性能。
  • 实现模糊检查点会增加设计复杂性。

DBMS 中检查点的应用

  • 崩溃恢复:在发生崩溃、系统故障或操作系统崩溃后帮助恢复数据库。
  • 事务管理:提供回滚边界并协助维护 ACID 属性。
  • 分布式系统:在分布式 DBMS 中,检查点有助于在节点之间维护协调和一致性。
  • 测试和调试:开发人员在开发和测试阶段使用检查点来创建回滚点。
  • 性能监控:管理员可以跟踪检查点的频率以及它们对 I/O 和系统响应时间的影响。

 

结论

在 DBMS 中,检查点是恢复过程的重要组成部分,使其快速高效。它们充当事务日志中的标记,有助于减少恢复时间,优化日志管理,并为数据库带来一致性。通过结合检查点、重做/撤销列表和日志机制,数据库可以轻松处理系统故障和崩溃。随着数据库规模的增大和交易量的增加,检查点的使用变得非常高效和有益。

 

常见问题解答 (FAQs)

(参考点:https://www.naukri.com/code360/library/checkpoint-in-dbms)

1. DBMS 中的检查点是什么?

答案

检查点是 DBMS 中的一种方法,它在数据库的事务日志中标记一个特定点。它确保直到该特定标记点为止的所有事务都已成功写入磁盘。它主要减少了恢复期间需要检查的日志数量。

2. 何时应触发检查点?

答案

检查点可以触发:

  • 在固定的时间间隔后。
  • 当系统资源未完全利用时。
  • 在声明的特定事务数量之后。
  • 由数据库管理员手动触发。

3. 检查点在数据库系统中有什么重要性?

答案

检查点在数据库系统中很重要,因为它们通过减少需要检查的日志记录数量,减少了恢复期间检查日志文件的时间。这显著提高了数据库的性能和一致性。

4. 检查点期间会发生什么?

答案

在创建检查点期间,主要发生三件事:

  • 易失性内存中的日志数据被写入磁盘或稳定存储。
  • 内存缓冲区中的所有更新都传输到磁盘。
  • 然后,将检查点记录写入日志文件。

5. 检查点如何在恢复过程中提供帮助?

答案

当恢复过程开始时,系统从最新的检查点开始检查,而不是从日志文件的开头开始。在检查点之前完成的事务无需重新处理;这通过减少检查时间来加快恢复过程。

6. 在现代 DBMS 中,如果使用了连续日志记录和复制,是否可以完全消除检查点?为什么或者为什么不?

答案
否,即使使用连续日志记录和复制,也无法在现代 DBMS 中完全消除检查点。不带检查点的日志恢复需要扫描整个日志,这是低效的。检查点提供了中间恢复点,减少了恢复时间和日志空间消耗,这对于现实世界系统的性能和持久性至关重要。

7. 检查点会影响数据库的性能吗?

答案

是的,检查点会影响数据库的性能。尽管它们减少了恢复时间,但如果计时不当,它们可能会在执行期间带来开销。它们需要将数据刷新到磁盘,这会影响事务性能。

8. 检查点在航空公司预订系统中的作用是什么?

答案

由于航空公司预订系统是一个高事务量环境,因此在发生任何系统故障时,检查点有助于快速恢复过程并维护数据一致性,因为即使是小的故障,如果不能更快地恢复,也会导致重大损失。

9. 检查点如何在恢复过程中提供帮助?

答案

当恢复过程开始时,系统从最新的检查点开始检查,而不是从日志文件的开头开始。在检查点之前完成的事务无需重新处理;这通过减少检查时间来加快恢复过程。


下一主题DBMS 中的死锁