数据库事务处理技术-故障恢复课堂笔记
📌 本讲学习目标
- 基本内容
- 数据库故障恢复的宏观思路
- 运行日志及检查点机制
- 三种日志类型(Undo/Redo/UndoRedo)
- 利用日志进行故障恢复的方法
- 重点难点
- 三种故障类型及其影响
- 检查点与转储点的作用
- 不同日志类型的记录规则和恢复策略
- Undo/Redo结合型日志的灵活应用
⚠️ 数据库故障类型
三种核心故障及其影响
graph LR A[数据库故障] --> B[事务故障] A --> C[系统故障] A --> D[介质故障] B -->|原因| E[程序逻辑错误] B -->|影响| F[单个事务] C -->|原因| G[断电/非正常关机] C -->|影响| H[内存数据及缓冲区] D -->|原因| I[磁盘损坏] D -->|影响| J[内存+磁盘全面损坏]
故障恢复目标
- 原子性:故障事务的操作全做或全不做
- 持久性:已提交事务影响永久保存
- 将数据库恢复到已知正确状态
🧩 故障恢复宏观思路
核心恢复手段
故障类型 | 恢复手段 | 关键机制 |
---|---|---|
事务故障 | Undo/Redo | 事务撤销与重做 |
系统故障 | 运行日志 | 检查点机制 |
介质故障 | 副本备份 | 转储点机制 |
存储体系与恢复
flowchart LR CPU --> 主存[易失性内存] 主存 -->|DB Buffer| 磁盘[非易失性存储] 磁盘 --> 日志文件 磁盘 --> 数据库副本
缓冲区策略(Steal/No Force)
策略 | 描述 | 优势 | 恢复需求 |
---|---|---|---|
Steal | 允许未提交数据写盘 | 灵活性高 | 需要Undo |
No Force | 不强制提交时写盘 | 性能优化 | 需要Redo |
📜 运行日志基础
日志核心组件
graph LR A[事务操作] --> B[日志记录] B --> C[日志缓冲区] C --> D[日志文件] D --> E[故障恢复]
日志记录类型
记录类型 | 格式 | 描述 |
---|---|---|
开始 | <START T> | 事务T开始 |
提交 | <COMMIT T> | 事务T成功提交 |
中止 | <ABORT T> | 事务T被中止 |
数据变更 | <T, X, v1> | Undo型(旧值) |
<T, X, v2> | Redo型(新值) | |
<T, X, v1, v2> | UndoRedo型(新旧值) |
↩️ Undo型日志及恢复
记录规则
- 写
<T, X, 旧值>
到日志 - 执行
OUTPUT(X)
- 写
<COMMIT T>
核心原则:数据写盘后才能提交
恢复流程
flowchart TB A[扫描日志] --> B{事务状态} B -->|未提交| C[反向扫描] C --> D[写回旧值] B -->|已提交| E[跳过]
故障场景示例
故障点 | 磁盘状态 | 恢复操作 |
---|---|---|
Commit前 | A=16, B=8 | 写回A=8, B=8 |
Commit后 | A=16, B=16 | 无操作 |
🔁 Redo型日志及恢复
记录规则
- 写
<T, X, 新值>
到日志 - 写
<COMMIT T>
- 执行
OUTPUT(X)
核心原则:提交后才能写盘
恢复流程
flowchart LR A[正向扫描日志] --> B{事务状态} B -->|已提交| C[写回新值] B -->|未提交| D[跳过]
故障场景示例
故障点 | 磁盘状态 | 恢复操作 |
---|---|---|
Commit前 | A=8, B=8 | 无操作 |
Commit后 | A=16, B=8 | 写回A=16, B=16 |
🔄 Undo/Redo结合型日志
记录规则
- 写
<T, X, 旧值, 新值>
到日志 - 可任意顺序执行:
<COMMIT T>
OUTPUT(X)
核心优势:灵活平衡性能与安全性
恢复流程(双向操作)
flowchart LR A[确定事务状态] --> B{未提交事务} A --> C{已提交事务} B --> D[反向扫描写旧值] C --> E[正向扫描写新值]
典型场景
操作序列 | 恢复动作 |
---|---|
<T,X,8,16> → 故障 | 写回X=8 |
<COMMIT T> → 故障 | 写回X=16 |
⏱️ 检查点技术
两种检查点类型
类型 | 过程 | 优势 |
---|---|---|
静止检查点 | 1. 暂停新事务 2. 等待活跃事务结束 3. 写 <CKPT> | 恢复简单 |
非静止检查点 | 1. 写<START CKPT(T1..Tk)> 2. 继续运行 3. 活跃事务结束后写 <END CKPT> | 不影响系统运行 |
检查点恢复范围
flowchart LR A[找到最近END CKPT] --> B[确定活跃事务] B --> C[从最早活跃事务开始恢复] C --> D[忽略更早提交的事务]
💎 总结回顾
关键恢复技术对比
日志类型 | 记录内容 | OUTPUT时机 | 适用场景 |
---|---|---|---|
Undo | 旧值 | 提交前 | 需频繁撤销 |
Redo | 新值 | 提交后 | 需保证持久性 |
UndoRedo | 新旧值 | 灵活 | 通用场景 |
故障恢复全景
flowchart TD A[故障发生] --> B{故障类型} B -->|事务故障| C[Undo/Redo] B -->|系统故障| D[日志+检查点] B -->|介质故障| E[副本+日志] C --> F[恢复完成] D --> F E --> F
核心要点:通过日志机制和检查点技术,结合不同恢复策略,DBMS能够在各种故障场景下保证数据的一致性和持久性。