为什么数据库管理系统(DBMS)需要恢复?

2025年1月31日 | 阅读12分钟

基本上,操作系统负责确保或验证在事务提交给 DBMS 执行时,作为事务一部分必须执行的所有操作都已成功完成,并且它们的影响要么已记录在数据库中,要么该事务对数据库或任何其他事务都没有影响。因此,为了防止数据丢失,可以实施基于延迟更新和即时更新或数据备份的恢复方法。拥有一个名为系统日志的独特文件对于恢复方法至关重要。它包含有关每个事务的开始、中间和结束的详细信息,以及事务过程中发生的任何更改。日志中记录了每个修改数据库对象值的事务操作。要从事务失败中恢复,您需要了解这些信息。

尽管数据库系统可能会像任何其他类型的计算机系统一样发生故障,但其中包含的信息必须始终可用。数据库必须具备在发生故障时快速恢复的工具。它还必须是原子的,这意味着事务要么对数据库没有影响,要么已正确完成并提交(效果已永久存储在数据库中)。数据备份和从故障条件恢复都可以通过自动和非自动方法进行。数据库恢复过程是从系统故障、事务错误、病毒、灾难性故障、不当命令执行等导致数据丢失中恢复数据的方法。

DBMS 不能允许某些事务 T 操作应用于数据库,而将其他 T 操作置于未应用状态。如果事务在执行了部分过程后失败,这可能会发生。

故障类型

数据库故障是指数据库无法执行所请求的事务或数据库数据丢失。DBMS 易受多种故障的影响,每种故障都需要独特的管理策略。数据库故障可能由多种原因引起,包括网络问题、系统崩溃、自然灾害、疏忽、蓄意破坏(故意破坏数据)、软件故障等。

事务故障

事务故障是指事务无法完成或达到无法再完成的点。

DBMS 事务失败的原因

  • 逻辑错误:当事务因代码错误或内部问题而无法执行时,会发生逻辑错误。
  • 系统错误:当数据库系统由于系统问题而自行终止活动事务,或者数据库管理系统无法完成事务时。例如,如果发生死锁或资源短缺,系统会终止一个运行中的事务。

系统故障

硬件或软件故障是系统崩溃最常见的原因。其他来自系统外部导致其突然停止工作或最终崩溃的问题包括操作系统故障、电源中断、主内存崩溃和事务故障。

这些故障,有时称为软故障,是导致易失性内存中数据丢失的原因。所做的故障停止假设认为系统崩溃不会影响存储在非易失性存储器上的数据。

数据传输故障

数据传输故障是指在数据传输操作期间发生的磁盘故障,导致磁盘存储中的数据丢失。磁盘磁头崩溃、磁盘不可达、坏扇区出现、磁盘读写问题等是磁盘故障的一些其他原因。

在数据传输过程中发生磁盘故障时,可以利用存储在其他磁带或磁盘上的数据备份副本快速恢复。因此,定期备份数据是一个明智的主意。

系统错误

此类错误是由事务中执行的操作引起的,例如除以零或整数。这种类型的故障有时被称为事务故障,并且可能是由于不正确的参数值或逻辑编程错误引起的。此外,用户可能会停止正在进行的执行,这可能导致事务失败。

本地错误

当我们执行一个事务但出现某些情况可能导致事务被取消时,基本上就会发生这种情况。本质上,这种类型的错误属于本地错误的范畴。一个简单的例子是事务数据可能找不到的可能性。当我们尝试从余额不足的账户中扣款时,我们的请求或事务将被取消。为了不将此异常视为故障,应将其编码到事务本身中。

并发控制的执行

由于事务违反了串行化,并发控制机制可能会选择中止它、重新启动它,或者我们可以认为多个进程处于死锁状态。

磁盘故障

这种类型的故障基本上发生在磁盘由于读写错误或读写头崩溃而丢失数据时。这可能发生在事务正在读取或写入时。

灾难

物理问题是灾难的另一种说法。它通常指一系列看似无穷无尽的问题,包括盗窃、蓄意破坏和火灾,意外覆盖磁盘或磁带,以及操作员装载了错误的磁带。

DBMS 中的数据恢复技术用于在这种系统故障情况下恢复数据。即使数据库系统发生故障,数据库中的数据也必须能够恢复到系统丢失之前的最新状态。数据库的原子性和持久性通过 DBMS 中的恢复方法来维护。如果在事务期间系统崩溃并丢失所有数据,则认为它不具有持久性;如果在事务期间只有部分数据被更新,则认为它不具有原子性。DBMS 中的数据恢复策略确保数据始终可恢复以保护持久性,并保留其状态以保护其原子性。

基于日志的恢复

每个 DBMS 都有自己的系统日志,其中记录了所有系统活动,并包含事件发生时的时间戳。数据库会处理多个日志文件,用于数据库活动,如故障、查询和其他更改。日志以以下文件格式保存

  • [start_transaction, T] 结构表示事务 T 开始执行。
  • [write_item, T, X, old_value, new_value] 表示变量 X 的值由事务 T 从 old_value 更改为 new_value。
  • [read_item, T, X] 表示事务 T 读取了 X 的值。
  • [commit, T] 表示数据中的更改已通过提交存储在数据库中,并且不能再由事务修改。提交到数据库后不会有错误。
  • [abort, T] 用于指示事务 T 已中止。

这些日志使我们能够跟踪数据状态在事务过程中如何变化,并将其恢复到原始状态或新状态。要检查 [write item, T, X, old value, new value] 操作并获取数据的先前状态,请使用 undo 操作。只有在执行了 [commit, T] 操作后,才能执行 redo 操作以将系统故障导致丢失的数据恢复到其新状态。

已批准的更新方法

在批准的更新方法中,对数据的更改要等到事务完成或在提交操作时才进行。根据此过程,数据被修改然后永久保存在主内存中。在此过程中,日志会及时更新,并在发生故障时用于识别故障点。这给了我们一个优势,因为即使系统在提交步骤之前崩溃,状态仍然会被处理,并且数据库的内容不会被更改。与 undo 操作所需的方法不同,如果系统在提交阶段之后失败,我们可以快速将更改重新应用到新阶段。

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

创建一个变量来保存日志文件保存日志的位置。

  • 格式化日志文件。
  • 必须激活数据库的通用日志记录选项。
  • 现在系统会跟踪所有数据库活动,并将其记录在 general.log 文件中。可以使用以下命令检查此配置,该配置保存在 general log file 变量中

在即时更新技术中,数据会在事务进入提交步骤之前同时更新。一旦对数据进行了修改,也会跟踪日志。如果事务失败,数据可能仍在处理中,但可以使用撤销操作来恢复数据。此外,我们可以使用 SQL 命令来指示事务的状态并将其数据恢复到该状态。为此,请使用以下命令

  • SAVEPOINT 命令用于保存事务中数据的当前状态。该命令的语法是,
  • 使用 ROLLBACK 命令将数据状态返回到命令指定的保存点。该命令的语法是,

即时更新技术

在即时更新技术中,数据会在事务进入提交步骤之前同时更新。一旦对数据进行了修改,也会跟踪日志。如果事务失败,数据可能仍在处理中,但可以使用撤销操作来恢复数据。此外,我们可以使用 SQL 命令来指示事务的状态并将其数据恢复到该状态。为此,请使用以下命令

SAVEPOINT 命令用于保存事务中数据的当前状态。该命令的语法是,

使用 ROLLBACK 命令将数据状态返回到命令指定的保存点。该命令的语法是

即时更新与延迟更新的区别是什么?

  • DBMS 的事务日志文件使用两种数据库恢复技术来维护:延迟更新和即时更新。
  • 通过延迟更新,在任何事务完成后,数据库中的数据状态不会立即更新;相反,它会在提交并更改已记录在日志文件中后才进行更改。
  • 通过即时更新,数据库会在每次事务后直接更新,并且还会保留一个日志文件,其中包含旧信息和新信息。
即时更新延迟更新
事务期间对数据的更改不会立即执行。一旦发生事务,数据库就会立即更新。
将要实施的更改将存储在日志文件中。这些更改以及新旧值将存储在日志文件中。
使用此策略,会使用缓冲和缓存。此方法利用了影子分页。
系统发生故障时,恢复数据需要更长的时间。为了在事务期间处理日志,会进行多个 I/O 活动。
如果执行回滚,日志文件将被删除,数据库将保持不变。如果执行回滚,将使用日志文件中的记录将数据恢复到其先前状态。

有哪些备份策略?

备份是数据库当前状态的副本,保存在不同的位置。当系统因自然灾害而损坏或销毁时,此备份很有用。可以使用这些备份将数据库恢复到先前的备份状态。以下是使用的几种备份技术:

  • 存储在硬盘驱动器或其他设备上的副本被视为即时备份。在磁盘崩溃或其他技术错误的情况下,我们可以利用这些数据来恢复数据。
  • 数据库的副本保存在大型存储系统或云环境中用于存档备份。当自然灾害损坏系统时,它们用于恢复数据。

事务日志如何工作?

已更新数据库中数据的事务都记录在事务日志中。要使用事务日志检索数据,请执行以下步骤:

  • 恢复管理器搜索所有日志文件,以识别具有开始事务阶段但没有提交阶段的事务。
  • 在日志和 rollback 命令的帮助下,将上述示例中的事务回滚到先前状态。
  • 数据库的更改通过包含 commit 命令的事务进行,并且这些更改记录在日志中。undo 函数也将用于撤销这些更改。

影子分页

  • 在影子分页中,数据库被分成 n 个不同的页,每个页对应一个固定大小的磁盘内存。
  • 同样,还会生成一些影子页,它们是实际数据库的副本。
  • 在事务开始时,数据库的状态会被传输到影子页。
  • 在事务期间,只有实际数据库会被更改;影子页不会。
  • 事务达到提交步骤后,会在影子页上进行更新。更新方式是,如果硬盘的第 i 个扇区被更改,则第 i 个影子页也会被更改。
  • 在系统发生故障时,会比较数据库的实际页和影子页,并执行恢复操作。
  • 在使用缓存/缓冲方法时,逻辑内存中存在一组称为 DBMS 缓冲区的缓冲区。所有进程日志都存储在缓冲区中,当事务达到提交步骤时,主日志文件会被更新。

结论

  • 数据库系统中的故障可能由驱动器、系统或事务问题引起。
  • 当新数据状态丢失或系统中所有数据丢失时,DBMS 中的恢复过程用于恢复数据。
  • 数据库中的操作被记录在日志中,然后用于从数据库中检索数据。
  • 通常,start transaction 和 commit 分别是日志条目中的第一个和最后一个词。
  • 数据通过各种事务更新方法(包括延迟和即时更新)在稍后或更早的时间更新。为了恢复数据,这些更改会得到不同的处理。
  • 检查点用于将数据库的所有数据保存到可随时修改的永久状态。
  • 使用 SAVEPOINT 命令记录所有数据库数据,并使用 ROLLBACK TO 命令将数据库重置到保存点。
  • 为了在自然灾害情况下检索数据,使用备份来保存数据副本。
  • 为了恢复数据,影子分页方法比较了磁盘内存的两个副本。

这些是备份方法的一些示例

完整数据库备份 - 此完整数据库备份,包括数据和数据库,包含全文目录,并备份恢复整个数据库在预设时间序列中的元数据。

差异备份:它仅保存自上次完整数据库备份以来已更改的数据。当自上次完整数据库备份以来某些数据多次更改时,差异备份会存储最适合当前版本的数据。为此,我们需要先还原完整的数据库备份。

事务日志中的所有数据库活动都进行了备份,包括对每个已运行语句的记录。它包含已发生到数据库的所有事务,并且是事务日志条目的备份。这允许数据库恢复到特定时间点。如果数据文件丢失但没有提交的事务丢失,则也可以使用事务日志进行备份。