DBMS 中的恢复和原子性

2025年3月17日 | 阅读 10 分钟

引言

DBMS(数据库管理系统)可以快速有效地监控、存储和更改数据。数据库具有原子性、一致性、隔离性和持久性。持久性是指系统保留数据以及对数据所做更改的能力。数据库可能因以下任何原因而失败:

  • 系统故障是由于系统中的硬件或软件问题引起的。
  • 事务失败发生在处理数据更新的某个进程无法完成时。
  • 磁盘崩溃可能发生在系统无法读取磁盘时。
  • 物理损坏包括停电或自然灾害等问题。
  • 即使数据库系统发生故障,数据库中的数据也必须能够恢复到系统故障前的状态。在这些情况下,DBMS 中的数据库恢复过程用于检索数据。

DBMS 中的恢复过程确保了数据库的原子性和持久性。如果系统在事务中间崩溃并且所有数据丢失,则认为它不具有持久性。如果在事务期间只有一部分数据被更新,则认为它不具有原子性。DBMS 中的数据恢复过程确保数据始终可恢复以保护持久性属性,并保留其状态以保护原子性属性。DBMS 中用于恢复数据的过程如下:

  • 基于日志的恢复。
  • 通过延迟更新进行恢复
  • 通过立即更新进行快速恢复

DBMS 的原子性属性保护数据状态。如果执行了数据修改,则必须完全完成该操作,或者必须将数据状态保留为好像从未发生过修改一样。此特性可能会受到事务引起的 DBMS 故障的影响,但 DBMS 恢复方法将保护它。

什么是基于日志的恢复?

每个 DBMS 都有自己的系统日志,其中记录了所有系统活动,并包含事件发生时间的带时间戳的记录。数据库管理多个日志文件,用于记录错误、查询和其他数据库更新等操作。日志以以下文件格式保存:

  • 结构 [start transaction, T] 表示事务 T 的执行开始。
  • [write the item, T, X, old value, new value] 表示事务 T 将变量 X 的值从旧值更改为新值。
  • [read item, T, X] 表示事务 T 读取了 X 的值。
  • [commit, T] 表示对数据的修改已提交到数据库,并且不能由事务进一步更新。数据库提交后将不会有错误。
  • [abort, T] 表示事务 T 已被中止。

我们可以利用这些日志来查看数据状态在事务期间如何变化,并将其恢复到之前或新的状态。

可以使用撤销操作来检查 [write item, T, X, old value, new value] 操作并将数据恢复到旧数据状态。要将由于系统故障而丢失的先前数据状态恢复到新状态的唯一方法是执行 [commit, T] 操作。

考虑以下一系列事务:t1、t2、t3 和 t4。系统在第四个事务后崩溃;但是,数据仍然可以恢复到在事务 t1 期间建立检查点之前所处的状态。

在将事务的所有记录写入日志后,会创建一个检查点,将所有日志从本地存储传输到永久存储以供将来使用。

什么是延迟更新方法?

在延迟更新机制中,在事务进入其最终阶段或在提交操作期间,数据不会被更改。遵循此过程,数据将被更新并永久放置在主内存中。

在发生故障时,利用在此过程中保存的日志来识别故障的确切时刻。这样做的好处是,即使系统在提交步骤之前崩溃,数据库的数据也不会被更改,并且状态会得到管理。如果系统在提交阶段之后失败,我们可以快速地将更改重做为新阶段,而不是执行撤销操作。

许多数据库会自动配置日志记录,但我们也可以手动配置。要在 MySQL 数据库中配置日志记录,请在 MySQL 终端中执行以下步骤:

  • 创建一个变量来保存日志文件 (.log) 的路径,日志必须保存在此处,
  • 配置日志文件格式,
  • 启用数据库的通用日志记录功能,
  • 系统现在会监视所有数据库活动,并将它们记录在 general.log 文件中。此设置保存在 general log file 变量中,可以使用以下命令查看:

快速更新方法包含什么内容?

在快速更新策略中,数据在事务达到提交阶段之前就被并发更新。一旦数据发生更改,日志也会被记录下来。

如果事务失败且数据处于部分状态,则可以执行数据恢复活动。我们还可以使用 SQL 指令来标记事务的状态并将我们的数据恢复到该状态。要完成此操作,请运行以下命令:

  • SAVEPOINT 命令用于在事务中保存当前数据状态。此命令的语法是:
  • ROLLBACK 命令使用提供的命令将数据状态恢复到保存点。命令的语法是:

延迟更新和立即更新之间有什么区别?

DBMS 中用于保留事务日志文件的数据库恢复方法包括延迟更新和快速更新。

在延迟更新中,在事务完成后,数据库的数据状态不会立即更改;相反,更改会记录在日志文件中,并且数据库的状态会在提交完成后立即更新。

在立即更新中,数据库在每次事务时都会直接更新,并且还会保留一个包含旧值和新值的日志文件。

延迟更新立即更新
在事务期间,数据更改不会立即应用。一旦发生事务,就会在数据库中进行修改。
日志文件包含将要进行的更改。日志文件包含更改以及新旧值。
此方法使用缓冲和缓存。此技术使用影子分页。
系统发生故障时,恢复数据需要更长的时间。在事务期间,会进行大量的 I/O 活动来管理日志。
执行回滚时,日志文件将被删除,并且数据库不会进行任何更改。执行回滚时,使用日志文件记录将数据恢复到其先前状态。

备份技术

备份是数据库当前状态的副本,保存在另一个位置。在系统因自然灾害或物理损坏而销毁的情况下,此备份非常有用。可以使用这些备份将数据库恢复到备份时所处的状态。使用许多备份技术,包括以下一项:

  • 即时备份是保存在硬盘驱动器或其他存储设备中的副本。当磁盘发生故障或出现技术错误时,我们可以使用此信息来检索数据。
  • 归档备份是保存在大型存储系统或云端不同位置的数据库副本。如果自然灾害影响系统,则使用它们来检索数据。

什么是事务日志?

事务日志用于跟踪已更新数据库中数据的所有事务。以下方法用于从事务日志中恢复数据:

恢复管理器扫描所有日志文件,查找具有开始事务阶段但没有提交阶段的事务。

上述事务使用回滚命令和日志回滚到先前状态。

具有提交命令的事务已对数据库进行了修改,这些修改已记录在日志中。这些修改也将使用撤销函数进行撤销。

什么是影子分页?

  • 在影子分页中,数据库被划分为 n 个页面,每个页面代表固定大小的磁盘内存。
  • 同样,会创建影子页面,它们是原始数据库的副本。
  • 在事务开始时,数据库状态会被复制到影子页面。
  • 在事务期间,只有原始数据库会被更改,而影子页面不会。
  • 当事务到达提交阶段时,会对影子页面进行更新。这些修改是这样做的:如果硬盘的第 i 个部分被更改,第 i 个影子页面也会被更改。
  • 在系统发生故障时,通过比较数据库的真实页面与其影子页面来执行恢复过程。

在缓存/缓冲方法的逻辑内存中,有一组称为 DBMS 缓冲区。在整个过程中,所有日志都保存在缓冲区中,并在事务达到提交阶段后更新主日志文件。

原子性

一套用于确保数据库事务完整性的概念是 ACID 模型,在数据库管理系统中,ACID 代表原子性、一致性、隔离性和持久性。

原子性主要通过日志记录或操作系统调用等复杂过程来实现。

在数据库管理系统中,原子事务被定义为一系列不可分割且不可简化的数据库操作,其中要么全部发生,要么什么都不发生。

原子性保证可防止不完整的数据库更改,这些更改可能比完全拒绝整个系列带来更多问题。任何其他数据库客户端都无法在此之后查看该事务。在某个时间点,它尚未发生,但另一时间点它已完全发生(或者如果事务在进行过程中被取消,则不发生任何更改)。

原子性示例

我们已经检查了关系数据库中的原子性含义。让我们看一些例子来更好地理解原子性概念。

示例 1:在线票务预订系统中的原子性

以在线票务预订系统为例,一次预订可能由两个单独的动作组成,这两个动作组合成一个事务:第一个是支付票款,第二个是为刚付款的人预订座位。根据业务逻辑,这两个独立的操作必须同时发生。如果一个发生而另一个未发生,可能会出现问题。例如,系统可能为两个不同的客户预订同一个座位。

示例 2:银行发生的事务(存钱或取钱)。

如果 Marino 的账户 A 有 50 美元,想给拥有 50 美元账户 B 的 Amanda 支付 20 美元。账户 B 中已存在 200 美元。当您向账户 B 存入 20 美元时,总计为 220 美元。

现在已安排两个程序。第一个是将 Marino 希望发送的 20 美元从他的账户 A 中借出并存入账户 B,即 Amanda 的账户。第一个借记交易成功,但后续的贷记过程失败。

因此,Marino 的账户 A 的价值降至 30 美元,而 Amanda 的账户价值仍保持在 200 美元。

Recovery and Atomicity in DBMS

因此,这不是原子事务。因此,Marino 的账户 A 的价值降至 30 美元,而 Amanda 的账户价值仍保持在 200 美元。

结论

  • 由于事务、系统或磁盘问题,数据库系统可能会发生故障。
  • 当数据的新状态丢失或系统中所有数据丢失时,DBMS 中的恢复过程用于恢复数据。
  • 日志在数据库中用于保留操作记录,并利用这些日志从数据库中检索数据。
  • 日志具有一致的结构,以开始事务开头,以提交结尾。
  • 不同的事务更新机制,例如延迟立即更新,在不同时间更新数据。要恢复数据,这些修改的处理方式不同。
  • 为确保所有数据库数据随时可以回滚,使用检查点来保存数据库的当前状态。
  • SAVEPOINT 命令捕获数据库的当前状态,ROLLBACK TO 命令将数据库返回到该点。
  • 备份用于保存数据副本,以便在发生自然灾害时进行恢复。
  • 影子分页方法通过比较磁盘内存的两个副本进行数据恢复。
  • 为了保持原子性,数据库管理系统中的所有事务语句都必须在包括停电、故障和崩溃在内的所有条件下成功或失败。
  • 例如,在转账交易中,借记和贷记必须同时发生,否则什么都不发生。
  • 原子事务完成的条件或环境决定了其特性。
  • 能够确保原子性的数据库系统必须能够在为其供电的电源、软件或操作系统发生故障时继续运行。