DBMS 中的恢复和原子性2025年3月17日 | 阅读 10 分钟 引言DBMS(数据库管理系统)可以快速有效地监控、存储和更改数据。数据库具有原子性、一致性、隔离性和持久性。持久性是指系统保留数据以及对数据所做更改的能力。数据库可能因以下任何原因而失败:
DBMS 中的恢复过程确保了数据库的原子性和持久性。如果系统在事务中间崩溃并且所有数据丢失,则认为它不具有持久性。如果在事务期间只有一部分数据被更新,则认为它不具有原子性。DBMS 中的数据恢复过程确保数据始终可恢复以保护持久性属性,并保留其状态以保护原子性属性。DBMS 中用于恢复数据的过程如下:
DBMS 的原子性属性保护数据状态。如果执行了数据修改,则必须完全完成该操作,或者必须将数据状态保留为好像从未发生过修改一样。此特性可能会受到事务引起的 DBMS 故障的影响,但 DBMS 恢复方法将保护它。 什么是基于日志的恢复?每个 DBMS 都有自己的系统日志,其中记录了所有系统活动,并包含事件发生时间的带时间戳的记录。数据库管理多个日志文件,用于记录错误、查询和其他数据库更新等操作。日志以以下文件格式保存:
我们可以利用这些日志来查看数据状态在事务期间如何变化,并将其恢复到之前或新的状态。 可以使用撤销操作来检查 [write item, T, X, old value, new value] 操作并将数据恢复到旧数据状态。要将由于系统故障而丢失的先前数据状态恢复到新状态的唯一方法是执行 [commit, T] 操作。 考虑以下一系列事务:t1、t2、t3 和 t4。系统在第四个事务后崩溃;但是,数据仍然可以恢复到在事务 t1 期间建立检查点之前所处的状态。 在将事务的所有记录写入日志后,会创建一个检查点,将所有日志从本地存储传输到永久存储以供将来使用。 什么是延迟更新方法?在延迟更新机制中,在事务进入其最终阶段或在提交操作期间,数据不会被更改。遵循此过程,数据将被更新并永久放置在主内存中。 在发生故障时,利用在此过程中保存的日志来识别故障的确切时刻。这样做的好处是,即使系统在提交步骤之前崩溃,数据库的数据也不会被更改,并且状态会得到管理。如果系统在提交阶段之后失败,我们可以快速地将更改重做为新阶段,而不是执行撤销操作。 许多数据库会自动配置日志记录,但我们也可以手动配置。要在 MySQL 数据库中配置日志记录,请在 MySQL 终端中执行以下步骤:
快速更新方法包含什么内容?在快速更新策略中,数据在事务达到提交阶段之前就被并发更新。一旦数据发生更改,日志也会被记录下来。 如果事务失败且数据处于部分状态,则可以执行数据恢复活动。我们还可以使用 SQL 指令来标记事务的状态并将我们的数据恢复到该状态。要完成此操作,请运行以下命令:
延迟更新和立即更新之间有什么区别?DBMS 中用于保留事务日志文件的数据库恢复方法包括延迟更新和快速更新。 在延迟更新中,在事务完成后,数据库的数据状态不会立即更改;相反,更改会记录在日志文件中,并且数据库的状态会在提交完成后立即更新。 在立即更新中,数据库在每次事务时都会直接更新,并且还会保留一个包含旧值和新值的日志文件。
备份技术备份是数据库当前状态的副本,保存在另一个位置。在系统因自然灾害或物理损坏而销毁的情况下,此备份非常有用。可以使用这些备份将数据库恢复到备份时所处的状态。使用许多备份技术,包括以下一项:
什么是事务日志?事务日志用于跟踪已更新数据库中数据的所有事务。以下方法用于从事务日志中恢复数据: 恢复管理器扫描所有日志文件,查找具有开始事务阶段但没有提交阶段的事务。 上述事务使用回滚命令和日志回滚到先前状态。 具有提交命令的事务已对数据库进行了修改,这些修改已记录在日志中。这些修改也将使用撤销函数进行撤销。 什么是影子分页?
在缓存/缓冲方法的逻辑内存中,有一组称为 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 美元。 ![]() 因此,这不是原子事务。因此,Marino 的账户 A 的价值降至 30 美元,而 Amanda 的账户价值仍保持在 200 美元。 结论
|
我们请求您订阅我们的新闻通讯以获取最新更新。