资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,*,Chapter 2,事务(,transaction,),1,为什么需要事务?,银行转账系统,A=2000 B=1000,事务,A=A-100,B=B+100,Output,(,A,),Output,(,B,),故障时,数据库中,A,B,值分别为多少?,断电或其,他故障,本例表明,在执行组操作时,需要引入一种控制机制,保证组操作要不全部执行,要不全部取消,以保证结果的正确性。,2,概念,事务,(Transaction),是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位,事务是恢复和并发控制的基本单位,3,事务的,ACID,特性(,1,),原子性(,Atomicity,):事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。,一致性(,Consistency,):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,4,事务的,ACID,特性(,2,),隔离性(,Isolation,):对并发执行而言,一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰,持续性(,Durability,),/,永久性(,Permanence,),一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。,接下来的其他操作或故障不应该对其执行结果有任何影响。,5,一致性,学生数据库,IC0,:学号唯一,IC1,:每门课有先修课,学生必须先完成先修课才能选当前课,IC2,:每门课有最高限选人数,DBMS,要保证事务的执行没有违反任何约束,6,隔离性(,2,),T1,T2,Read A=16,Read A=16,A=A-1,Write A=15,A=A-3,Write A=13,9,定义事务,BEGIN TRANSACTION,SQL,语句1,SQL,语句2,COMMIT TRANSACTION,BEGIN TRANSACTION,SQL,语句1,SQL,语句2,ROLLBACK TRANSACTION,COMMIT,:事务正常结束,,提交,事务的所有操作事务中所有对数据库的更新,永久,生效,ROLLBACK,:事务异常终止。在运行过程中发生了故障,,回滚,事务的所有更新操作,事务滚回到开始时的状态。,10,实现事务的隔离性:并发控制,多事务执行方式,(1),串行执行,每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行,不能充分利用系统资源,发挥数据库共享资源的特点,11,并发控制(,2,),(2),交叉并发方式(,interleaved concurrency,),事务的并行执行是这些并行事务的并行操作轮流交叉运行。宏观并发,微观串行。,是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率,12,并发控制(,3,),(3),同时并发方式(,simultaneous concurrency,),多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行,最理想的并发方式,但受制于硬件环境,13,事务并发执行带来的问题,可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性,时间,更新事务,T1,数据库中,A,的值,读事务,T2,t0,100,t1,FIND A,t2,A:=A-30,t3,UPD A,t4,70,FIND A,t5,*,ROLLBACK*,t6,100,14,并发控制机制的任务,对并发操作进行正确调度,保证事务的隔离性,保证数据库的一致性,15,丢失更新问题,读脏数据问题,不可重复读问题,三个关键问题,16,丢失更新,描述:事务,1,与事务,2,从数据库中读入同一数据并修改,事务,2,的提交结果破坏了事务,1,提交的结果,导致事务,1,的修改被丢失。,17,丢失更新,时间,更新事务,T1,数据库中,A,的值,更新事务,T2,T0,100,t1,FIND A,t2,FIND A,t3,A:=A-30,t4,A:=A*2,t5,UPD A,t6,70,UPD A,t7,200,18,读脏数据,事务,1,修改某一数据,并将其写回磁盘,事务,2,读取同一数据,事务,1,由于某种原因被撤消,这时事务,1,已修改过的数据恢复原值,事务,2,读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据。,19,读脏数据,时间,更新事务,T1,数据库中,A,的值,读事务,T2,t0,100,t1,FIND A,t2,A:=A-30,t3,UPD A,t4,70,FIND A,t5,*,ROLLBACK*,t6,100,20,不可重复读,事务,1,读取数据后,事务,2,执行更新操作,使事务,1,无法再现前一次读取结果。,三类不可重复读(事务,1,读取某一数据后):,事务,2,对其做了修改,事务,2,删除了其中部分记录,事务,2,插入了一些记录,后两种不可重复读有时也称为幻影现象(,phantom row,),21,不可重复读,时间,读事务,T1,数据库中,A,的,值,更新事务,T2,t0,100,t1,FIND A,t2,t3,t4,UPD A,t5,t6,22,小结,T,1,T,2,读,A=50,读,B=100,求和,=150,读,B=100,BB*2,写回,B=200,读,A=50,读,B=200,求和,=250,T,1,T,2,读,A=16,读,A=16,AA-1,写回,A=15,AA-1,写回,A=15,T,1,T,2,读,C=100,CC*2,写回,C,读,C=200,ROLLBACK,23,锁,加锁就是事务,T,在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁,加锁后事务,T,就对该数据对象有了一定的控制,在事务,T,释放它的锁之前,其它的事务不能更新此数据对象。,加锁是实现并发控制的一个非常重要的技术,24,基本加锁类型,DBMS,通常提供了多种类型的加锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由加锁的类型决定的。,基本加锁类型,排它锁(,eXclusive lock,,简记为,X,锁),共享锁(,Share lock,,简记为,S,锁),25,排它锁,排它锁又称为写锁,若事务,T,对数据对象,A,加上,X,锁,则只允许,T,读取和修改,A,,其它任何事务都不能再对,A,加任何类型的锁,直到,T,释放,A,上的锁,26,共享锁,共享锁又称为读锁,若事务,T,对数据对象,A,加上,S,锁,则其它事务只能再对,A,加,S,锁,而不能加,X,锁,直到,T,释放,A,上的,S,锁,27,三、锁的相容矩阵,Y=Yes,,相容的请求,N=No,,不相容的请求,T,1,T,2,X,S,-,X,N,N,Y,S,N,Y,Y,-,Y,Y,Y,28,加锁协议,在运用,X,锁和,S,锁对数据对象加锁时,需要约定一些规则:加锁协议(,Locking Protocol,),何时申请,X,锁或,S,锁,持锁时间、何时释放,不同的加锁协议,在不同的程度上为并发操,作的正确调度提供一定的保证,常用的加锁协议:三级加锁协议,29,1,级加锁协议,事务,T,在修改数据,R,之前必须先对其加,X,锁,直到事务结束才释放,正常结束,(,COMMIT,),非正常结束,(,ROLLBACK,),1,级锁协议可以解决什么问题?有什么不足?,30,T,1,T,2,Xlock A,获得,读,A=16,AA-1,写回,A=15,Commit,Unlock A,Xlock A,等待,等待,等待,等待,获得,Xlock A,读,A=15,AA-1,写回,A=14,Commit,Unlock A,31,读,A=15,Xlock A,获得,读,A=16,AA-1,写回,A=15,Rollback,Unlock A,T,2,T,1,Xlock B,获得,读,B=100,BB*2,写回,B=200,Commit,Unlock B,读,A=50,读,B=100,求和,=150,读,A=50,读,B=200,求和,=250,T,2,T,1,32,1,级加锁协议的作用和局限,1,级加锁协议可防止丢失修改,在,1,级加锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读“脏”数据。,33,2,级加锁协议,1,级加锁协议,+,事务,T,在读取数据,R,前必须,先加,S,锁,,,读完后,即可释放,S,锁,2,级锁协议可以解决什么问题?有什么不足?,34,Sclock A,获得,读,A=50,Unlock A,Sclock B,获得,读,B=100,Unlock B,求和,=150,Xlock B,等待,等待,获得,Xlock B,读,B=100,BB*2,写回,B=200,Commit,Unlock B,T,2,T,1,Sclock A,获得,读,A=50,Unlock A,Sclock B,获得,读,B=200,Unlock B,求和,=250,(,验算不对,),T,2,T,1,(,续,),35,2,级加锁协议的作用和局限,2,级加锁协议可以防止丢失修改和读“脏”数据。,在,2,级加锁协议中,由于读完数据后即可释放,S,锁,所以它不能保证可重复读,。,36,3,级加锁协议,1,级加锁协议,+,事务,T,在读取数据,R,之前必须先对其加,S,锁,直到,事务结束才释放,3,级加锁协议可防止丢失修改、读脏数据和不可重复读。,37,T,1,T,2,Slock A,读,A=50,Slock B,读,B=100,求和,=150,读,A=50,读,B=100,求和,=150,Commit,Unlock A,Unlock B,Xlock B,等待,等待,等待,等待,等待,等待,等待,等待,获得,Xlock B,读,B=100,BB*2,写回,B=200,Commit,Unlock B,T,1,T,2,Xlock C,读,C=100,CC*2,写回,C=200,ROLLBACK,(C,恢复为,100),Unlock C,Slock C,等待,等待,等待,等待,获得,Slock C,读,C=100,Commit C,Unlock C,38,加锁协议小结,三级协议的主要区别,什么操作需要申请加锁,何时释放锁(即持锁时间),39,加锁协议小结,(,续,),40,活锁和死锁,加锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题,哲学家吃饭:圆桌旁有,5,个哲学家,每哲学家的左右各有,1,根筷子,怎样才能让每个哲学家都吃到饭?,41,活锁,42,如何避免活锁,采用先来先服务的策略:,当多个事务请求加锁同一数据对象时,按请求加锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。,43,死锁,Xlock,R,1,.,.,.,Xlock R,2,等待,等待,等待,.,.,.,Xlock R,2,.,.,Xlock,R,1,等待,等待,.,44,解决死锁的方法,两类方法,1.,预防死锁,2.,死锁的诊断与解除,45,死锁的预防,产生死锁的原因是两个或多个事务都已加锁了一些数据对象,然后又都请求对已为其他事务加锁的数据对象加锁,从而出现死等待。,预防死锁的方法,一次加锁法,顺序加锁法,46,一次加锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,一次加锁法存在的问题:降低并发度,扩大加锁范围,将以后要用到的全部数据加锁,势必扩大了加锁的范围,从而降低了系统的并发度,47,一次加锁法(续),难于事先精确确定加锁对象,数据库中数据是不断变化的,原来不要求加锁的数据,在执行过程中可能会变成加锁对象,所以很难事先精确地确定每个事务所要加锁的数据对象,解决方法:将事务在执行过程中可能要加锁的数据对象全部加锁,这就进一步降低了并发度,。,48,顺序加锁法,顺序加锁法是预先对数据对象规定一个加锁顺序,所有事务都按这个顺序实行加锁。,顺序加锁法存在的问题,维护成本高,数据库系统中可加锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的加锁顺序非常困难,成本很高,49,顺序加锁法(续),难于实现,事务的加锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要加锁哪些对象,因此也就很难按规定的顺序去施加加锁。,例:规定数据对象的加锁顺序为,A,B,C,D,E,。事务,T3,起初要求加锁数据对象,B,C,E,,但当它加锁了,B,C,后,才发现还需要加锁,A,,这样就破坏了加锁顺序,.,50,死锁的诊断,前提:允许死锁发生,解除死锁,由,DBMS,的并发控制子系统定期检测系统中是否存在死锁,一旦检测到死锁,就要设法解除,51,超时法,如果一个事务的等待时间超过了规定的时限,就认为发生了死锁,优点:实现简单,缺点,有可能误判死锁,时限若设置得太长,死锁发生后不能及时发现,52,等待图法,用事务等待图动态反映所有事务的等待情况,事务等待图是一个有向图,G,=(,T,,,U,),T,为结点的集合,每个结点表示正运行的事务,U,为边的集合,每条边表示事务等待的情况,若,T,1,等待,T,2,,则,T,1,,,T,2,之间划一条有向边,从,T,1,指向,T,2,并发控制子系统周期性地(比如每隔,1 min,)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。,53,等待图法(二),若事务依赖图有环则可能死锁,54,死锁的解除,解除死锁,选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。,例:画出哲学家吃饭问题的一个死锁等待图,并提出解决方案。,55,并发调度的可串行性,事务的调度,:,事务的执行次序称为“调度”,串行调度,:,如果多个事务依次执行,则称为事务的串行调度(,Serial Schedule,),并发调度,:,如果利用分时的方法,同时处理多个事务,则称为事务的并发调度(,Concurrent Schedule,)。,56,并发调度的议题,什么样的并发操作调度是正确的,如何保证并发操作的调度是正确的,57,什么样的并发操作调度是正确的,计算机系统对并行事务中并行操作的调度是的随机的,而不同的调度可能会产生不同的结果。,将所有事务串行起来的调度策略一定是正确的调度策略。,如果一个事务运行过程中没有其他事务在同时运行,也就是说它没有受到其他事务的干扰,那么就可以认为该事务的运行结果是正常的或者预想的,58,什么样的并发操作调度是正确的(,Cont,),以不同的顺序串行执行事务也有可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。,几个事务的并行执行是正确的,,当且仅当其结果与按某一次序串行地执行它们时的结果相同。,这种并行调度策略称为可串行化(,Serializable,)的调度。,59,什么样的并发操作调度是正确的(,Cont,),可串行性是并行事务正确性的唯一准则,例:现在有两个事务,分别包含下列操作:,事务,1,:读,B,;,A=B+1,;写回,A,;,事务,2,:读,A,;,B=A+1,;写回,B,;,假设,A,的初值为,2,,,B,的初值为,2,。,60,什么样的并发操作调度是正确的(,Cont,),对这两个事务的不同调度策略,串行执行,串行调度策略,1,串行调度策略,2,交错执行,不可串行化的调度,可串行化的调度,61,串行调度策略(,1,),T1,T,2,Slock B,Y=B=2,Unlock B,Xlock A,A=Y+1,写回,A(=3),Unlock A,T1,T,2,Slock A,X=A=3,Unlock A,Xlock B,B=X+1,写回,B(=4),Unlock B,62,串行调度策略(,2,),T1,T,2,Slock A,X=A=3,Unlock A,Xlock B,B=X+1,写回,B(=4),Unlock B,T1,T,2,Slock B,Y=B=2,Unlock B,Xlock A,A=Y+1,写回,A(=3),Unlock A,63,不可串行化的交叉调度,T1,T,2,Slock B,Y=B=2,Slock A,X=A=2,Unlock B,Unlock A,Xlock A,T1,T,2,Xlock A,A=Y+1,写回,A(=3),Xlock B,B=X+1,写回,B(=3),Unlock A,Unlock B,64,可串行化的交叉调度,T1,T,2,Slock B,Y=B=2,Unlock B,Xlock A,Slock A,A=Y+1,等待,写回,A(=3),等待,T1,T,2,Unlock A,等待,X=A=3,Unlock A,Xlock B,B=X+1,写回,B(=4),Unlock B,65,如何保证并发操作调度的正确性,为了保证并行操作的正确性,,DBMS,的并行控制机制必须提供一定的手段来保证调度是可串行化的。,从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调度,这也是最简单的调度策略,但这种方法实际上是不可行的,因为它使用户不能充分共享数据库资源。,66,两段锁协议,两段锁协议的内容,1.,在对任何数据进行读、写操作之前,事务首先要获得对该数据的加锁,2.,在释放一个加锁之后,事务不再获得任何其他加锁。,67,两段锁协议(,2,),“两段”锁的含义,事务分为两个阶段,第一阶段是获得加锁,也称为扩展阶段;,第二阶段是释放加锁,也称为收缩阶段。,68,两段锁协议(,3,),例:,事务,1,的加锁序列:,Slock A.Slock B.Xlock C.Unlock B.Unlock A.Unlock C,;,事务,2,的加锁序列:,Slock A.Unlock A.Slock B.Xlock C.Unlock C.Unlock B,;,事务,1,遵守两段锁协议,而事务,2,不遵守两段协议。,69,两段锁协议(,4,),并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。,所有遵守两段锁协议的事务,其并行执行的结果一定是正确的,事务遵守两段锁协议是可串行化调度的,充分条件,,而不是必要条件,可串行化的调度中,不一定所有事务都必须符合两段锁协议。,70,T1,T,2,Slock B,读,B=2,Y=B,Xlock A,Slock A,等待,A=Y+1,等待,写回,A=3,等待,Unlock B,等待,T1,T,2,Unlock A,等待,获得,lockA,读,A=3,Y=A,Xlock B,B=Y+1,写回,B=4,Unlock B,Unlock A,71,T1,T,2,Slock A,读,A=2,X=A,Unlock A,Slock B,读,B=2,Xlock B,Y=B,等待,Unlock B,获得,lock B,B=X+1,T1,T,2,写回,B=3,Unlock B,Xlock A,A=Y+1,写回,A=3,Unlock A,72,T1,T,2,Slock B,读,B=2,Y=B,Unlock B,Xlock A,Slock A,等待,A=Y+1,等待,写回,A=3,等待,T1,T,2,Unlock A,等待,Slock A,读,A=3,X=A,Unlock A,Xlock B,B=X+1,写回,B=4,Unlock B,73,两段锁协议讨论,两段锁协议与防止死锁的一次加锁法,一次加锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次加锁法遵守两段锁协议,但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁,74,两段锁协议讨论(,2,),遵守两段锁协议的事务发生死锁,T,1,Slock B,读,B=2,Xlock A,等待,等待,T,2,Slock A,读,A=2,Xlock A,等待,75,两段锁协议讨论(,3,),两段锁协议与三级加锁协议,两类不同目的的协议,两段锁协议,保证并发调度的正确性,三级加锁协议,在不同程度上保证数据一致性,遵守第三级加锁协议必然遵守两段锁协议,76,小结(,1,),数据共享与数据一致性是一对矛盾,数据库的价值在很大程度上取决于它所能提供的数据共享度。,数据共享在很大程度上取决于系统允许对数据并发操作的程度。,数据并发程度又取决于数据库中的并发控制机制,另一方面,数据的一致性也取决于并发控制的程度。施加的并发控制愈多,数据的一致性往往愈好。,77,小结(,2,),数据库的并发控制以事务为单位,数据库的并发控制通常使用加锁机制,两类最常用的加锁,不同级别的加锁协议提供不同的数据一致性保证,提供不同的数据共享度。,三级加锁协议,78,小结(,3,),并发控制机制调度并发事务操作是否正确的判别准则是可串行性,并发操作的正确性则通常由两段锁协议来保证。,两段锁协议是可串行化调度的充分条件,但不是必要条件,79,小结(,4,),对数据对象施加加锁,带来问题,活锁:先来先服务,死锁:,预防方法,一次加锁法,顺序加锁法,死锁的诊断与解除,超时法,等待图法,80,故障恢复的手段,撤消(,UNDO,):强行回滚(,ROLLBACK,)该事务,重做(,REDO,):重做所有已提交的事务,81,恢复操作的基本原理,恢复操作的基本原理:,冗余,利用,存储在系统其它地方的,冗余数据,来,重建,数据库中已被破坏或不正确的那部分数据,恢复的实现技术:复杂,一个大型数据库产品,恢复子系统的代码要占全部代码的,10%,以上,82,恢复的实现技术,恢复机制涉及的关键问题,1.,如何建立冗余数据,数据转储(,backup,),登录日志文件(,logging,),2.,如何利用这些冗余数据实施数据库恢复,83,数据库系统日志(一),备份是定期的,而不是实时的,所以利用备份并不能完全恢复数据库,只能将数据库恢复制作备份的那一时刻。,日志是对备份的补充,它可以看作是一个值班日记,它将记录下所有对数据库的更新操作。日志文件是实时的。当磁盘发生故障造成,DB,损坏时,先利用备份恢复大部分数据库,然后运行数据库日志,将备份后所做的更新操作在重做一遍,从而使,DB,完全恢复。,84,数据库系统日志(二),为保证日志的安全,应该将日志和主数据库安排在不同的存储设备上,否则日志和,DB,可能会同时遭破坏,日志也就失去了本来的作用。,日志记录有几种,“更新日志记录”描述一次数据库写操作,它有如下几个字段:,事务标识:执行写操作的事务的唯一标识。,数据项标识:所写的数据项的唯一标识,通常是数据项在磁盘上的位置。,旧值:数据项的写前值。,新值:数据项的写后值。,85,数据库系统日志(三),记号,描述,事务,T,开始,X,:数据项,;V1,:前值;,V2,:后值,提交,取消,每次事务执行写之前,必须在,DB,修改前生成该次写操作的日志记录。一旦日志记录已创建,就可以根据需要对,DB,做修改,并且,能利用日志记录中的旧值消除已做的修改。,86,数据库系统日志(四),推迟更新协议,每个事务在到达提交点之前不能更新数据库,一个事务的所有更新操作所对应的日志记录写入永恒存储器之前,该事务不能到达提交点,87,T0,Read(A),A=A-50,Write(A),Read(B),B=B+50,Write(B),T1,Read(C),C=C-100,Write(C),Log,DB,A=950,B=2050,C=600,88,转储,转储是指,DBA,将整个数据库复制到磁带或另一个磁盘上保存起来的过程。,故障发生点,转储,运行事务,正常运行,Ta,Tb,Tf,重装后备副本,重新运行事务,恢复,89,静态转储,在系统中无运行事务时进行转储,转储开始时数据库处于一致性状态,转储期间不允许对数据库的任何存取、修改活动,优点:,实现简单,缺点:,降低了数据库的可用性,转储必须等用户事务结束,新的事务必须等转储结束,90,利用静态转储副本进行恢复,故障发生点,静态,转储,运行事务,正常运行,Ta,Tb,Tf,重装后备副本,恢复,91,动态转储,转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改,优点,不用等待正在运行的用户事务结束,不会影响新事务的运行,动态转储的缺点,不能保证副本中的数据正确有效,92,动态转储,利用动态转储得到的副本进行故障恢复,需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件,后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态,93,利用动态转储副本进行恢复,运行事务,故障发生点,动态,转储,运行事务,正常运行,Ta,Tb,Tf,重装后备副本,利用日志文件恢复,恢复,94,利用动态转储副本进行恢复,Ta,Tb,Tf,动态,转储,运行事务,故障发生点,正常运行,登记日志文件 登记新日志文件,转储日志文件,重装后备副本,然后利用转储的日志文件恢复,恢复到一,致性状态,95,海量转储与增量转储,海量转储,:,每次转储全部数据库,增量转储,:,只转储上次转储后更新过的数据,海量转储与增量转储比较,从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便,但如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效,96,转储方法小结,转储方法分类,转储状态,动态转储,静态转储,转储方式,海量转储,动态海量转储,静态海量转储,增量转储,动态增量转储,静态增量转储,97,转储策略,应定期进行数据转储,制作后备副本。,但转储又是十分耗费时间和资源的,不能频繁进行。,DBA,应该根据数据库使用情况确定适当的转储周期和转储方法。,例:,每天晚上进行动态增量转储,每周进行一次动态海量转储,每月进行一次静态海量转储,98,事务故障的恢复,事务故障:事务在运行至正常终止点前被中止,恢复方法,由恢复子系统应利用日志文件撤消(,UNDO,)此事务已对数据库进行的修改,事务故障的恢复由系统自动完成,不需要用户干预,99,事务故障的恢复步骤(,1,),1.,反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。,2.,对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”(,BI,AI,)写入数据库。,插入操作,“更新前的值”为空,则相当于做删除操作,删除操作,“更新后的值”为空,则相当于做插入操作,若是修改操作,则用,BI,代替,AI,(,After Image,),100,事务故障的恢复步骤(,2,),3.,继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。,4.,如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。,101,关于效率的问题的讨论,内存页与高速缓存,Redo表,Undo表,102,系统故障的恢复,系统故障造成数据库不一致状态的原因,一些未完成事务对数据库的更新已写入数据库,一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库,恢复方法,1.Undo,故障发生时未完成的事务,2.Redo,已完成的事务,系统故障的恢复由系统在,重新启动时,自动完成,不需要用户干预,103,系统故障的恢复步骤(,1,),1.,正向扫描日志文件(即从头扫描日志文件),Redo,队列,:,在故障发生前已经提交的事务,T1,T3,T8.,Undo,队列,:,故障发生时尚未完成的事务,T2,T4,T5,T6,T7,T9 .,104,系统故障的恢复步骤(,2,),2.,对,Undo,队列事务进行,UNDO,处理,反向扫描日志文件,对每个,UNDO,事务的更,新操作执行逆操作,T2,T4,T5,T6,T7,T9 ,3.,对,Redo,队列事务进行,REDO,处理,正向扫描日志文件,对每个,REDO,事务重新,执行登记的操作,T1,T3,T8.,105,介质故障的恢复(,1,),1.,重装数据库,,使数据库恢复到一致性状态,2.,重做已完成的事务,106,介质故障的恢复(,2,),恢复步骤,1.,装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。,对于静态转储的数据库副本,装入后数据库即处于一致性状态,对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即,REDO+UNDO,),才能将数据库恢复到一致性状态。,107,利用静态转储副本将数据库恢复到一致性状态,故障发生点,静态,转储,运行事务,正常运行,Ta,Tb,Tf,登记日志文件,重装后备副本,恢复,108,利用动态转储副本将数据库恢复到一致性状态,Ta,Tb,Tf,动态,转储,运行事务,故障发生点,正常运行,登记日志文件 登记新日志文件,转储日志文件,重装后备副本,然后利用转储的日志文件恢复,恢复到一,致性状态,109,介质故障的恢复(,3,),2.,装入有关的日志文件副本,重做已完成的事务。,首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。,然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。,110,介质故障的恢复(,4,),介质故障的恢复需要,DBA,介入,DBA,的工作,重装最近转储的数据库副本和有关的各日志文件副本,执行系统提供的恢复命令,具体的恢复操作仍由,DBMS,完成,111,具有检查点的恢复技术,两个问题,搜索整个日志将耗费大量的时间,REDO,处理:重新执行,浪费了大量时间,112,解决方案,具有检查点(,checkpoint,)的恢复技术,在日志文件中增加检查点记录,(,checkpoint,),增加重新开始文件,恢复子系统在登录日志文件期间动态地维护日志,113,114,检查点技术,检查点记录的内容,1.,建立检查点时刻所有正在执行的事务清单,2.,这些事务最近一个日志记录的地址,重新开始文件的内容,记录各个检查点记录在日志文件中的地址,115,在检查点 维护日志文件,1.,将当前,日志,缓冲区中的所有日志记录写入磁盘的日志文件上。,2.,在日志文件中写入一个检查点记录。,3.,将当前,数据,缓冲区的所有数据记录写入磁盘的数据库中。,4.,把检查点记录在日志文件中的地址写入一个重新开始文件。,116,建立检查点,定期,按照预定的一个时间间隔,不定期,按照某种规则,如日志文件已写满一半建立一个检查点,117,利用检查点的恢复策略,当事务,T,在一个检查点之前提交,T,对数据库所做的修改已写入数据库,在进行恢复处理时,没有必要对事务,T,执行,REDO,操作,118,利用检查点的恢复策略(续),T,c,(,检查点,),T,f,(,系统故障,),REDO,UNDO,UNDO,REDO,T,2,T,3,T,4,T,5,不要,REDO,T,1,119,利用检查点的,恢复步骤,1.,从重新开始文件中找到最后一个检查点记录在日志文件中的地址,2,由该地址在日志文件中找到最后一个检查点记录,120,利用检查点的恢复策略(续),2.,由该检查点记录得到检查点建立时刻所有正在执行的事务清单,ACTIVE-LIST,建立两个事务队列,UNDO-LIST,REDO-LIST,把,ACTIVE-LIST,暂时放入,UNDO-LIST,队列,,REDO,队列暂为空。,121,利用检查点的恢复策略(续),3.,从检查点开始正向扫描日志文件,直到日志文件结束,如有新开始的事务,T,i,,把,T,i,暂时放入,UNDO-LIST,队列,如有提交的事务,T,j,,把,T,j,从,UNDO-LIST,队列移到,REDO-LIST,队列,4.,对,UNDO-LIST,中的每个事务执行,UNDO,操作,对,REDO-LIST,中的每个事务执行,REDO,操作,122,数据库镜像,介质故障是对系统影响最为严重的一种故障,严重影响数据库的可用性,介质故障恢复比较费时,为预防介质故障,,DBA,必须周期性地转储数据库,提高数据库可用性的解决方案,数据库镜像(,Mirror,),123,数据库镜像(续),数据库镜像,DBMS,自动把整个数据库或其中的关键数据复制到另一个磁盘上,DBMS,自动保证镜像数据与主数据的一致性,(,图,7.5a),124,数据库镜像的用途,出现介质故障时,DBMS,自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本,(,图,7.5b),没有出现故障时,可用于并发操作,(,图,7.5a),一个用户对数据加排他锁修改数据,其他用户可以读镜像数据库上的数据,125,数据库镜像(续),126,小结,如果数据库只包含成功事务提交的结果,就说数据库处于一致性状态。保证数据一致性是对数据库的最基本的要求。,事务是数据库的逻辑工作单位,DBMS,保证系统中一切事务的原子性、一致性、隔离性和持续性,127,小结(续),DBMS,必须对事务故障、系统故障和介质故障进行恢复,恢复中最经常使用的技术:数据库转储和登记日志文件,恢复的基本原理:利用存储在后备副本、日志文件和数据库镜像中的冗余数据来重建数据库,128,小结(续),常用恢复技术,事务故障的恢复,UNDO,系统故障的恢复,UNDO+REDO,介质故障的恢复,重装备份并恢复到一致性状态,+REDO,129,小结(续),提高恢复效率的技术,检查点技术,可以提高系统故障的恢复效率,可以在一定程度上提高利用动态转储备份进行介质故障恢复的效率,镜像技术,镜像,技术可以改善介质故障的恢复效率,130,
展开阅读全文