数据库恢复技术
一.事务(Transaction)的基本概念
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
二.事物的特性(ACID)
原子性 (Atomicity):事务是数据库的逻辑工作单位,事务中包括的各个操作要么都做,要么都不做
一致性 (Consistency):事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态。
隔离性 (Isolation):对并发执行而言,一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对其他并发事务是隔离的并发执行的各个事务之间不能互相干扰
持续性 (Durability):持续性也称永久性(Permanence) 一个事务一旦提交,它对数据库中数据 的改变就应该是永久性的。 接下来的其他操作或故障不应该对其执行结果有任何影响。
注:
ACID每个特性都要理解。
恢复技术能保证事务的原子性、持续性。
并发控制技术能保证事务的一致性,隔离性。
三.故障的种类
- 事务内部的故障
- 系统故障(软故障)
- 介质故障(硬故障)
- 计算机病毒
四.什么是数据转储?
数据转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用数据称为后备副本或后援副本。
分类:
静态转储与动态转储
海量转储与增量转储
五.日志文件
日志文件(log)是用来记录事务对数 据库的更新操作的文件
1.日志文件的作用
①. 进行事务故障恢复
②. 进行系统故障恢复
③. 协助后备副本进行介质故障恢复
2.先写日志文件后写数据库?
写数据库和写日志文件是两个不同操作。
① 在这两个操作之间可能发生故障。
② 如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了
③ 如果先写日志,但没有修改数据库,按日志 文件恢复时只不过是多执行一次不必要的UNDO操作,并不影响数据库正确性。
六.检查点方法的恢复步骤及优点
恢复步骤
1.从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
2.由该检查点记录得到检查点建立时刻 所有正在执行的事务清单ACTIVE- LIST,建立两个事务队列 ① UNDO-LIST ② REDO-LIST 。把ACTIVE-LIST暂时放入UNDO- LIST队列,REDO队列暂为空
3.从检查点开始正向扫描日志文件,直到日志文件结束
①如有新开始的事务Ti,把Ti暂时放入 UNDO-LIST队列,②如有提交的事务Tj ,把Tj从UNDO-LIST 队列移到REDO-LIST队列
4.对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每 个事务执行REDO操作
优点:
使用检查点方法可以改善恢复效率:
当事务T在一个检查点之前提交,T对数据库所做的修改已写入数据库写入时间是在这个检查点建立之前或 这个检查点建立之时 在进行恢复处理时,没有必要对事务T执行REDO操作
并发控制
一.问题的产生
多用户数据库系统的存在,允许多个用户同时使用数据库系统
飞机定票数据库系统 ;银行数据库系统 ;生选课系统
特点:在同一时刻并发运行的事务可达数百个
二.并发操作带来的数据不一致性
- 丢失修改
- 不可重复读
- 读“脏”数据
三.排它锁(X锁)
- 排它锁又称为写锁
- 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
- 保证其他事务在T释放A上的锁之前不能再读取和修改A。
四.共享锁(S锁)
- 共享锁又称为读锁
- 若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。
- 保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
五.一级封锁协议
- 一级封锁协议要求事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放,事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
- 一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。
- 在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
六.二级封锁协议
- 二级封锁协议在一级封锁协议的基础上加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
- 二级封锁协议可以防止丢失修改和 读“脏”数据。
- 在二级封锁协议中,由于读完数据即可释放S锁,所以它不能保证可重复读
七.三级封锁协议
- 三级封锁协议在一级封锁协议的基础上加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
- 三级封锁协议可以防止丢失修改、读脏数据和不可重复读。
八.可串行化调度
可串行化(Serializable)调度:
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。
可串行性(Serializability) :
并发事务正确调度的准则
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度
九.冲突可串行化调度
冲突:
不同事务的冲突操作
与同一事务的两个操作不能交换
不同事务对同一数据库元素的写冲突
不同事务对同一数据库元素的读写冲突
结论 涉及同一个数据库元素 并且至少有一个是写操作的动作
冲突可串行化调度:
是可串行化调度的充分条件
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’ ,如果Sc’是串行的,称调度Sc为冲突可串行化的调度
一个调度是冲突可串行化,一定是可串行化的调度
例:调度 Sc1=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B) w2(B)
把w2(A)与r1(B)w1(B)交换,得到: r1(A)w1(A)r2(A)r1(B)w1(B)w2(A)r2(B)w2(B) 再把r2(A)与r1(B)w1(B)交换:Sc2= r1(A)w1(A)r1(B)w1(B)r2(A)w2(A)r2(B)w2(B)
Sc2等价于一个串行调度T1,T2 ,Sc1是冲突可串行化的调度
十.多粒度封锁
封锁对象的大小称为封锁粒度 (Granularity)
多粒度封锁(Multiple Granularity Locking):在一个系统中同时支持多种封锁粒度供不同事务选择
意向锁引进的原因
引进意向锁(intention lock),目的是提高对某数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加意向锁
例如,对任一元组加锁时,必须先对它所在的数据库和关系加意向锁
意向锁类型
意向共享锁(Intent Share Lock,简称 IS锁)
意向排它锁(Intent Exclusive Lock,简 称IX锁)
共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁