数据库恢复系统与架构全解析
立即解锁
发布时间: 2025-08-23 01:16:51 阅读量: 10 订阅数: 35 


数据库系统概念第六版精华
# 数据库恢复系统与架构全解析
## 1. 数据库故障与恢复概述
计算机系统如同其他机械设备一样,可能会遭遇各种故障,如磁盘崩溃、电源故障和软件错误等,这些故障会导致数据库系统的信息丢失。除了系统故障,事务也可能因多种原因失败,例如违反完整性约束或出现死锁。
为应对这些问题,数据库系统需要一个恢复方案,负责检测故障并将数据库恢复到故障发生前的状态。恢复方案的目标是确保事务的原子性和持久性,即每个事务要么全部执行,要么完全不执行,并且一旦事务提交,其结果就永久保存。
### 1.1 存储类型
计算机中的存储类型主要分为以下三种:
| 存储类型 | 特点 | 示例 |
| --- | --- | --- |
| 易失性存储 | 计算机崩溃时数据丢失 | 随机存取存储器(RAM) |
| 非易失性存储 | 计算机崩溃时数据通常不会丢失,但可能因磁盘故障等原因丢失 | 磁盘 |
| 稳定存储 | 数据永不丢失 | 镜像磁盘、RAID 等 |
### 1.2 稳定存储的实现
稳定存储在实际中无法完全实现,但可以通过镜像磁盘或其他形式的 RAID 来近似实现,这些方式提供了冗余数据存储。离线或存档的稳定存储可以由存储在物理安全位置的多个磁带副本组成。
## 2. 基于日志的恢复方案
### 2.1 日志记录
在基于日志的恢复方案中,所有更新操作都会记录在日志中,日志必须存放在稳定存储中。当事务的最后一条日志记录(即提交日志记录)输出到稳定存储时,该事务被认为已提交。
日志记录包含所有更新数据项的旧值和新值。新值用于在系统崩溃后重新执行更新操作,旧值用于在事务正常中止或系统崩溃前事务未提交时回滚事务的更新。
### 2.2 延迟修改方案
在延迟修改方案中,事务执行期间所有写操作都会延迟到事务提交时执行。此时,系统使用与事务关联的日志信息来执行延迟写入。由于更新操作在事务提交前不实际执行,因此日志记录不需要包含更新数据项的旧值。
### 2.3 检查点技术
为减少搜索日志和重新执行事务的开销,可以使用检查点技术。检查点是数据库系统在特定时间点的一个快照,记录了当时所有已提交事务的状态。通过定期创建检查点,可以缩小恢复时需要处理的日志范围。
### 2.4 现代恢复算法
现代恢复算法基于重复历史的概念,即在恢复的重做阶段重新执行自上次完成检查点以来的所有正常操作,将系统状态恢复到系统崩溃前最后一条日志记录输出到稳定存储时的状态。然后,从该状态开始执行撤销操作,按逆序处理未完成事务的日志记录。
撤销未完成事务时,会写出特殊的仅重做日志记录和中止日志记录。之后,该事务被视为已完成,不会再次被撤销。
### 2.5 事务处理的存储模型
事务处理基于一种存储模型,其中主内存包含日志缓冲区、数据库缓冲区和系统缓冲区。系统缓冲区保存系统目标代码页和事务的本地工作区。
为高效实现恢复方案,需要尽量减少对数据库和稳定存储的写入次数。日志记录最初可以保存在易失性日志缓冲区中,但在以下情况发生时必须写入稳定存储:
- 在将 `<Ti commit>` 日志记录输出到稳定存储之前,与事务 Ti 相关的所有日志记录必须已输出到稳定存储。
- 在将主内存中的数据块输出到数据库(非易失性存储)之前,与该数据块相关的所有日志记录必须已输出到稳定存储。
### 2.6 高并发锁定技术
现代恢复技术支持高并发锁定技术,例如用于 B + -树并发控制的技术。这些技术允许在插入或删除等操作中提前释放低级锁,从而允许其他事务执行类似操作。低级锁释放后,物理撤销不再可行,需要进行逻辑撤销,例如通过删除操作来撤销插入操作。事务保留高级锁,以确保并发事务不会执行使操作的逻辑撤销无法进行的操作。
### 2.7 非易失性存储丢失的恢复
为从导致非易失性存储丢失的故障中恢复,需要定期将整个数据库内容转储到稳定存储中,例如每天一次。如果发生导致物理数据库块丢失的故障,使用最近的转储将数据库恢复到先前的一致状态,然后使用日志将数据库系统恢复到最新的一致状态。
### 2.8 ARIES 恢复方案
ARIES 恢复方案是一种先进的方案,支持多种功能,以提供更高的并发度、减少日志开销并最小化恢复时间。它也基于重复历史的概念,允许进行逻辑撤销操作。该方案会持续刷新页面,而不需要在检查点时刷新所有页面。它使用日志序列号(LSN)来实现各种优化,减少恢复所需的时间。
### 2.9 远程备份系统
远程备份系统提供了高度的可用性,即使主站点因火灾、洪水或地震等灾难被摧毁,事务处理仍可继续进行。主站点的数据和日志记录会持续备份到远程备份站点。如果主站点发生故障,远程备份站点在执行某些恢复操作后将接管事务处理。
以下是一个简单的 mermaid 流程图,展示了基于日志的恢复过程:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([系统崩溃]):::startend --> B{检查检查点}:::decision
B -->|找到最新检查点| C(重做阶段: 重复历史):::process
B -->|未找到检查点| D(从日志开头重做):::process
C --> E(撤销阶段: 处理未完成事务):::process
D --> E
E --> F([恢复完成]):::startend
```
## 3. 恢复方案的相关问题与优化
### 3.1 日志记录处理顺序
在恢复过程中,撤销列表中的事务日志记录必须按逆序处理,而重做操作则按顺序执行。这是因为撤销操作需要将事务的更新操作恢复到之前的状态,按逆序处理可以确保正确地撤销每个操作;而重做操作是为了重新执行已提交事务的更新,按顺序执行可以保证操作的一致性。
### 3.2 检查点机制的作用和频率
检查点机制的目的是减少恢复时需要处理的日志范围,提高恢复效率。检查点的执行频率会影响系统性能和恢复时间:
- 当没有故障发生时,频繁创建检查点会增加系统开销,降低系统性能。
- 对于系统崩溃恢复,检查点越频繁,恢复所需的时间越短,因为需要处理的日志范围更小。
-
0
0
复制全文
相关推荐








