数据库保护
7.1事务
7.1.2事务的特征
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
7.2并发控制
-
丢失更新问题:事务t1与事务t2从数据库中读入同一数据并修改,事务T2的提交结果破坏了事务t1提交的结果,导致事务t1的修改被丢失。
-
读脏数据
-
不可重复读
产生上述数据不一致现象的主要原因就是并发操作破坏了事物的隔离性
7.2.2并发控制措施
封锁:基本的锁有两种类型:排他锁(Exclusive locks)x锁
共享锁:(Sharing locks)简称S锁
- 一级封锁协议:对事物T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)才释放
- 一级封锁协议可防止
丢失修改
,并保证事务t是可以恢复的 - 但不能保证
可重复读
和不读脏数据
- 二级封锁协议:一级封锁协议加上对事物T对要读取的数据加S锁,读完后即释放S锁
-
但由于读完数据后立即释放S锁,所以他不能保障不可重复读。
- 三级封锁协议:在一级封锁的基础上加上事务T在读取数据R之前必须先对其加上S锁,并且知道事务结束才释放
活锁
死锁的诊断与解除
n个事务串行调度,可能有n!种不同的有效调度。其结果可能不同, 但都是正确的
n个事务并发调度,可能的并发调度数远远大于n!
两段锁协议
- 若并发执行的所有事务都遵守两端锁协议,则这些事务的任何并发调度策略都是可串行化的
- 若并发事务的一个调度是可串行化的,不一定所有的事务都符合两端锁协议
- 所有遵守两端锁协议的事物,其并行执行的结果一定是正确的,
可能发生死锁
锁协议 | 对比 |
---|---|
两端锁协议 | 保证并发调度的正确性 |
三级封锁协议 | 在不同程度上保证数据一致性 |
遵守第三级封锁协议必然遵守两端锁协议 | 遵守两端锁协议不一定遵守第三级封锁协议 |
7.3数据恢复
事务内部故障
事务故障意味着事务没有达到预期的终点(COMMIT OR ROLLBACK),因此,数据库可能处于不正确的状态
- 可以预期的事务故障:即在程序中可以预先估计到的错误,可以在事务的代码中加入判断和ROLLBACK语句。当事务执行到rollback语句时,由系统对事物进行回退操作,即执行UNDO操作
- 非预期的事务故障:即在程序中发生未估计到的错误,事务没有达到预期的终点,数据库可能处于不正确的状态,此时由系统直接对该事务执行UNDO处理
系统故障
指造成系统停止运转,系统要重启的故障。例如,特定硬件错误,操作系统故障,突然停电,影响所有正在运行的事务,但不破坏数据库
介质故障
常称为硬故障,指外存故障,将破坏数据库,并影响正在存取这部分数据的所有事务
计算机病毒
人为故障,破坏性很大,极容易传播
数据库恢复基本原理与技术
数据转储是数据库恢复中采用的基本技术
必须先写日志文件,后写数据库
事务故障的回复步骤:
- 反向扫描文件日志,查找对该事务的更新操作
- 对该事务的更新操作执行逆操作
- 继续反向扫描日志文件,查找该事务的其他更更新操作,并做同样处理
- 如此处理下去,直至读到此事物的开始标记,事务故障就完成了
系统故障造成数据库不一致的原因
- 一些未完成事务对数据库的更新已写入数据库
- 一些已提交事务对数据库的更新还停留在缓冲区,没来得及写入数据库
- 恢复方法:undo故障发生时完成的事务,redo已完成的事务
- 系统故障的恢复由系统再重新启动时自动完成,不需要用户干预
系统故障的回复步骤
-
正向扫描日志文件
-
对UNDO队列事务进行UNDO处理:反向扫描日志文件,对每个undo事务的更新操作执行逆操作
-
对redo队列事务进行redo处理,正向扫描日志文件,对每个redo事务执行登记的操作
第11章,备份和恢复数据库
- 系统数据库:Master,Msdb,Model数据库,修改后立即备份
- 用户的数据库:周期性备份
- 事务日志
完整备份:对数据库的所有对象和事务日志中的事务进行备份,它可用作系统失败时恢复数据库的基础:特点是消耗时间和资源,备份不影响用户对数据库的操作,并且备份过程中发生的活动
差异备份:最久一次数据库完整备份以来发生的数据变化进行备份
完全备份之后变化的数据文件,日志文件以及数据库中被修改的内容。速度快,丢失数据的风险小
事务日志备份:备份上次备份之后的日志记录,通常事务日志备份完成后要截断日志,清楚无用日志的过程就是截断日志,避免日志过多占满存储空间
完整备份:
完整备份加日志备份:不会丢失太多数据,又能不经常进行完全备份
完整备份+差异备份+日志备份:备份和恢复的时间都比较快,丢失数据少
恢复数据库
- 如果数据库日志文件没有损坏,为将数据损失减少到最小,可在恢复之前对数据库进行一次日志备份,称为日志尾部备份
- 恢复数据库的顺序
- 恢复最近的完全数据库备份
- 恢复完全备份后的最近的差异数据库备份
- 按日志备份的先后顺序回复自完全备份或差异备份之后的所有日志备份