11. 数据库恢复技术
### 主要内容
- 事务的基本概念
- 数据库恢复概述
- 故障的种类
- 恢复的实现技术
- 恢复策略
- 具有检查点的恢复技术
- 数据库镜像
### 事务的基本概念
- 用户定义的一个数据库操作序列
- 不可分割的工作单位
- 要么全做, 要么全不做 (All or nothing)
- SQL 语句:
- `BEGIN TRANSACTION`: 事务开始
- `COMMIT`: 提交, 将所有更新写入物理数据库
- `ROLLBACK`: 回滚, 撤销已完成的操作, 回复到开始状态
### 事务的 ACID 特性
- 原子性 (Atomicity): 事务是逻辑工作单位, 操作要么全做, 要么全不做
- 一致性 (Consistency): 执行结果必须使数据库从一个一致性状态变到另一个一致性状态
- 隔离性 (Isolation): 一个事务的执行不能被其他事务干扰
- 持续性 (Durability): 事务一旦提交, 对数据的改变是永久性的
### 转账示例
- 场景: 从账号 A 取出一万元存入账号 B
- 一致性破坏 (Consistency Violation):
- 操作 1: A 减去一万元 (完成)
- 故障发生
- 操作 2: B 加入一万元 (未完成)
- 结果: 数据库处于不一致状态 (Inconsistent State)
- 结论: 一致性与原子性密切相关
### 数据库恢复
- 把数据库从错误状态恢复到某一已知的正确状态
- 涉及系统可靠性 (System Reliability)
- 涉及系统运行效率 (System Efficiency)
- 恢复子系统是 DBMS 的重要组成部分, 占代码量 10% 以上
### 事务内部的故障
- 逻辑错误, 运算溢出, 死锁 (Deadlock), 违反完整性约束
- 部分可由程序发现, 大多是非预期的
- 处理: 事务撤销 (UNDO)
### 系统故障
- 软故障
- CPU 故障, 断电. 缓冲区内容丢失
- 处理: 撤销 (UNDO) 未完成事务, 重做 (REDO) 已提交事务
### 介质故障
- 硬故障
- 磁盘损坏, 磁头碰撞, 强磁场干扰
- 破坏全部或部分数据库
- 发生概率小, 但破坏性最大
- 处理: 重装数据库副本 + 重做事务
### 恢复的实现技术
- 核心原理: 建立冗余数据
- 数据转储 (Data Dumping)
- 登记日志文件 (Logging)
### 数据转储
- DBA 定期将整个数据库复制到存储介质
- 后备副本: 转储产生的数据副本
- 恢复过程:
- 1. 重装后备副本
- 2. 重新运行自转储后的所有更新事务
### 按状态分
- 静态转储 (Static Dumping): 无运行事务时进行, 保证一致性, 但降低可用性
- 动态转储 (Dynamic Dumping): 允许并发操作, 需配合日志文件使用, 因为副本可能不一致
### 按数量分
- 海量转储 (Full Dumping): 转储全部数据库
- 增量转储 (Incremental Dumping): 只转储更新过的数据
### 登记日志文件
- 记录事务对数据库的更新操作
- 以记录为单位: 记录事务标识, 操作类型, 对象, 旧值, 新值
- 以数据块为单位: 记录受影响的整个数据块
- 处理事务故障 & 系统故障
- 协助动态转储恢复
### 先写日志文件原则
- 先写日志文件, 后写数据库
- 两个写操作之间可能发生故障
- 若先写数据库未写日志: 无法恢复 (无法撤销)
- 若先写日志未写数据库: 只需多执行一次 UNDO, 不影响正确性
- 是保证数据库可恢复性的关键原则
### 事务故障恢复:
- 操作: 撤销 (UNDO)
- 步骤: 反向扫描日志 -\> 对更新操作执行逆操作 -\> 直至事务开始标记
### 系统故障恢复
- 操作: 撤销 (UNDO) 未完成事务, 重做 (REDO) 已提交事务
- 1. 正向扫描建立 UNDO-LIST 和 REDO-LIST
- 2. 对 UNDO-LIST 执行撤销
- 3. 对 REDO-LIST 执行重做
### 介质故障的恢复
- 1. 重装副本: 装入最新的数据库后备副本
- 2. 重做事务: 装入相关的日志文件副本, 重做已完成的事务
- 需要 DBA 介入 (重装介质)
- 但具体恢复由 DBMS 完成
### 具有检查点的恢复技术
- 搜索整个日志耗时; 重做已做事务浪费时间
- 增加检查点 (Checkpoint) 记录
- 记录建立时刻所有正在执行的事务清单
- 记录这些事务最近日志记录的地址
- 重新开始文件: 记录检查点在日志中的地址
### 利用检查点的恢复策略
- 分类处理: 根据事务在检查点和故障点之间的状态
- $T\_1$ (检查点前提交): 不需恢复
- $T\_2, T\_4$ (故障前提交): 重做 (REDO)
- $T\_3, T\_5$ (故障时未完成): 撤销 (UNDO)
- 优点: 显著提高恢复效率
### 数据库镜像
- 自动把整个数据库或关键数据复制到另一个磁盘
- 主数据库更新时, DBMS 自动更新镜像数据
- 介质故障恢复: 镜像磁盘继续提供服务, 自动恢复, 无需停机
- 并发操作: 可用于读取, 提高性能
- 代价: 降低更新效率 (需写两份)
- 通常只镜像关键数据
### 11. 数据库恢复技术
- 阐述事务的四个特性 (ACID).
- "先写数据库, 后写日志" 在发生故障时会产生什么具体的后果?
- 日志文件在数据库恢复技术中起到了什么作用?
- 为什么要建立重做队列和撤销队列?
- 阐述介质故障的恢复流程.
- 在用日志文件恢复时, 为什么对撤销队列中的事务要做反向扫描?
----
[ 7.2 数据库设计](dbpa-7-2.html#/overview)
[| 练习 |](dbpa-exec.html)
[ 12 并发控制](dbpa-12-1.html#/overview)