6. 数据库保护
6.3 数据库恢复技术
### 事务
- 用户定义的一个数据库操作序列
- 是不可分割的工作单位
- 以 BEGIN TRANSACTION 开始
- 以 COMMIT 或 ROLLBACK 结束
### 事务的 ACID 特性
- 原子性: 是数据库工作的最小单位
- 一致性: 从一个一致性状态变到另一个
- 隔离性: 执行不能被其他事务干扰
- 持久性: 对数据库的改变是永久的
### 数据库恢复
- 将数据库从错误状态恢复到正确状态的功能
- 数据库恢复的基本原理是冗余
### 故障的种类
- 事务内部故障
- 系统故障
- 介质故障
- 计算机病毒
### 事务内部故障
BEGIN TRANSACTION
BALANCE = BALANCE - AMOUNT;
IF (BALANCE < 0 ) THEN
{PRINT "INSUFFICIENT FUNDS";
ROLLBACK;}
ELSE
{BALANCE1 = BALANCE1 + AMOUNT;
COMMIT;}
- 当事务没有到达 COMMIT 或 ROLLBACK 语句时
- 意味着出现事务故障
### 系统故障
- 造成系统停止运转的事件
- 如硬件错误, 操作系统故障, DBMS代码错误等
- 影响所有正在运行的事务, 但不破坏数据库
- 需要在系统重新启动后撤销未完成的事务并重做已提交的事务
### 介质故障
- 指外存故障
- 磁盘损坏, 磁头碰撞等
- 会破坏数据库
- 影响正在存取这部分数据的所有事务
- 需要将数据库从备份或日志中重建
### 计算机病毒
- 一种人为的故障或破坏
- 可以繁殖和传播
- 对计算机系统和数据库造成危害
- 使用病毒防护软件诊断和消除
### 总结
- 有些故障会破坏数据库本身
- 有些故障会导致数据不正确
- 数据库恢复需要在不影响其他事务运行的情况下, 将数据库恢复到正确状态
### 恢复的实现技术
- 如何建立冗余数据
- 如何利用这些冗余数据实施数据库恢复
### 数据转储
- DBA 定期将整个数据库复制到其他存储介质上保存
- 备用的数据称为后备副本 (backup) 或后援副本
### 静态转储
- 在系统中无运行事务时进行的转储操作
- 简单, 但会降低数据库可用性
### 动态转储
- 转储期间允许对数据库进行存取或修改
- 必须把转储期间各事务对数据库的修改登记下来
- 建立日志文件 (logfile)
### 海量转储
- 每次转储全部数据库
- 恢复会更方便
### 增量转储
- 每次只转储上一次转储后更新过的数据
- 更节省空间
- 通常更实用
### 日志文件
- 用来记录事务对数据库的更新操作的文件
- 以记录为单位
- 以数据块为单位
### 以记录为单位
- 各个事务的开始 (BEGIN TRANSACTION) 标记
- 各个事务的结束 (COMMIT 或 ROLLBACK) 标记
- 各个事务的所有更新操作
- 被称作日志记录 (log record)
### 日志记录的内容
- 事务标识 (标明是哪个事务)
- 操作的类型 (插入, 删除或修改)
- 操作对象 (记录内部标识)
- 更新前数据的旧值 (对插入操作而言, 此项为空值)
- 更新后数据的新值 (对删除操作而言, 此项为空值)
### 以数据块为单位
- 事务标识
- 被更新的数据块
### 日志文件的作用
- 事务故障恢复和系统故障恢复必须用日志文件
- 在动态转储方式中必须建立日志文件
- 在静态转储方式中也可以建立日志文件
### 登记日志文件的原则
- 登记的次序严格按并发事务执行的时间次序
- 先写日志文件, 后写数据库

### 6.3 数据库恢复技术
- 什么是事务?
- 请解释事务的 ACID 特性.
- 数据库恢复的基本原理是什么?
- 系统故障和介质故障有何不同?
- 什么是数据转储?
- 什么是日志文件?
----
[ 6.2 数据库完整性](dbds-6-2.html#/overview)
[| 练习 |](dbds-exec.html)
[ 6.4 数据库并发控制](dbds-6-4.html#/overview)