adb08系统故障与恢复_第1页
adb08系统故障与恢复_第2页
adb08系统故障与恢复_第3页
adb08系统故障与恢复_第4页
adb08系统故障与恢复_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第十章系统故障与恢复数据库保护数据库保护:排除和防止各种对数据库的干扰破坏,确保数据安全可靠;以及在数据库遭到破坏后尽快地恢复数据库保护通过四个方面来实现数据库的恢复技术[thischapter]Dealwithfailure并发控制技术[NextChp.]Dealwithdatasharing完整性控制技术[notdiscuss]Enableconstraints安全性控制技术[notdiscuss]Authorizationandauthentication故障后,如何恢复?STEP1确定设备的故障状态STEP2分析故障对DB的影响有哪些?STEP3设计恢复算法存有足够的信息(故障前)DB的定期备份Log采取适当措施,恢复数据库(故障后)45数据库的一致性和正确性事务的状态及原语操作数据库系统故障分析Undo日志Redo日志Undo/Redo日志Checkpoint主要内容一、事务的状态及原语操作事务(transaction)一个不可分割的操作序列,其中的操作要么都做,要么都不做1、事务事务的例子银行转帐:A帐户转帐到B帐户100元。该处理包括了两个更新步骤A=A-100B=B+100这两个操作是不可分的:要么都做,要么都不作1、事务事务的ACID性质原子性atomicity事务是不可分的原子,其中的操作要么都做,要么都不做一致性consistency事务的执行保证数据库从一个一致状态转到另一个一致状态隔离性Isolation多个事务一起执行时相互独立持久性Durability事务一旦成功提交,就在数据库永久保存2、事务的状态[inlogs]<StartT>TransactionThasstarted<CommitT>Thasfinishedsuccessfullyandallmodificationsarereflectedtodisks<AbortT>Thasbeenterminatedandallmodificationshavebeencanceled3、事务的原语操作input(x):diskblockwithx

memoryoutput(x):bufferblockwithxdiskRead(x,t):doinput(x)ifnecessary; valueofxinbuffertWrite(x,t):valueoftxinbuffer

dooutput(x)ifnecessary;数据X:在DISK中(对应DB中的一个数据元素)在内存中(一个Buffer中)事务T:局部变量t在内存中(一个Buffer中)日志(LOG)在DISK中(即DB中)在内存中(一个Buffer中)OUTPUT(X)INPUT(X)Read(X,t)Write(X,t)FlushLog在此处修改数据4、事务例子T1: Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t); Output(A); Output(B);Abanktransfer5、SQL对事务的支持SQL标准提供了三个语句,允许应用程序声明事务和控制事务BeginTransactionCommitTransactionRollbackTransactionT1: Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t); Output(A); Output(B);Abanktransfer二、数据库的一致性和正确性一致性(consistency)正确性(correctness)1、一致性(Consistency)IntegrityorconsistencyconstraintsPredicatesdatamustsatisfyExamples:-xiskeyofrelationR-xyholdsinR-Domain(x)={Red,Blue,Green}1、一致性(Consistency)Consistentstate:satisfiesallintegrityconstraintsConsistentDB:DBinconsistentstate1、一致性(Consistency)DBwillnotalwayssatisfyconstraintsExample:a1+a2+….an=TOT(constraint)Transaction:Deposit$100ina2:a2a2+100 TOTTOT+100..50..1000..150..1000..150..1100a2TOTState1:

consistentState2:

“inconsistent”State3:

consistent事务的ACID性质Atomicity,Consistency,Isolation,DurabilityconsistencyoftransactionConsistentDBConsistentDB’T但事务内部不保证DB的一致性1、一致性(Consistency)2、正确性(Correctness)DBRealityDBshouldreflectrealworldDBshouldreflectrealworldExample:Atelephonenumber3601123--correctabcdefg--notcorrectCanbepreservedbyexplicitconstraints!2、正确性(Correctness)DBshouldreflectrealworldExample:Atelephonenumber3601123--correct9999999--Isitcorrect?Notcorrectinreality,butcanDBknowthis?Answer:NO!2、正确性(Correctness)CorrectnessofDB

CorrectnessofrealityCorrectnessofDB如果数据库在事务开始执行时是一致的,并且事务执行结束后数据库仍处于一致状态,则数据库满足正确性.ConsistencyofDB+ACIDoftransactionCorrectnessofDB2、正确性(Correctness)三、数据库系统故障分析ConsistencyofDB可能由于故障而被破坏事务故障介质故障系统故障1、事务故障发生在单个事务内部的故障可预期的事务故障:即应用程序可以发现的故障,如转帐时余额不足。由应用程序处理非预期的事务故障:如运算溢出、掉电等,导致事务被异常中止。应用程序无法处理此类故障,由系统进行处理2、介质故障硬故障(HardCrash),一般指磁盘损坏导致磁盘数据丢失,破坏整个数据库3、系统故障系统故障:软故障(SoftCrash),由于OS、DBMS软件问题或断电等问题导致内存数据丢失,但磁盘数据仍在影响所有正在运行的事务,破坏事务状态,但不破坏整个数据库4、数据库系统故障恢复策略目的恢复DB到一致状态基本原则冗余(Redundancy)实现方法定期转储整个数据库建立事务日志(log)通过备份和日志进行恢复4、数据库系统故障恢复策略t0t1t2转储运行事务Crash登记日志文件重装副本利用日志文件进行恢复继续运行事务登记日志文件介质故障恢复系统故障和事务故障恢复当发生故障时:(1)若是介质故障,则首先重装副本(2)利用日志进行事务故障恢复和系统故障恢复,一直恢复到故障发生点Therecoveryprocess四、Undo日志事务日志记录了所有更新操作的具体细节Undo日志、Redo日志、Undo/Redo日志日志文件的登记严格按事务执行的时间次序Undo日志文件中的内容事务的开始标记(<StartT>)事务的结束标记(<Commit,T>或<AbortT>)事务的更新操作记录,一般包括以下内容执行操作的事务标识操作对象更新前值1、Undo日志规则事务的每一个修改操作都生成一个日志记录<T,x,old-value>在x被写到磁盘之前,对应此修改的日志记录必须已被写到磁盘上当事务的所有修改结果都已写入磁盘后,将<Commit,T>日志记录写到磁盘上WriteAheadLogging(WAL日志)先写日志先写日志(Write-AheadLog)原则在数据被写到磁盘之前,对应此修改的日志记录必须已被写到磁盘上先写日志<T1,BeginTransaction><T1,A,1000,900>设T1将A修改为900时发生故障。设此时900已写到数据库,但还未来得及写该日志记录到磁盘上。根据恢复策略,T1在恢复应UNDO,但此时由于后写日志,A的更新操作在日志中没有记录,因此无法将A恢复到1000******************************************如果先写日志,则即使没有将900写到数据库中,也只不过多执行一次UNDO操作,不会影响数据库的一致性。后写日志<T1,BeginTransaction>1、Undo日志规则T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog

Output(A); Output(B);

FlushLog<Start,T1>

<T,A,1000>

<T,B,2000><Commit,T1>LogInitial:A=1000B=2000将日志记录从缓冲区写到Disk上将缓冲区中A的值写到Disk上1、Undo日志规则—故障1T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:1000B:2000…

<Start,T1>

<T1,A,1000>

<T1,B,2000>…

MemoryDisk1、Undo日志规则—故障2T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:900B:2000…

<Start,T1>

<T1,A,1000>

<T1,B,2000>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>MemoryDisk1、Undo日志规则—故障3T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:900B:2100…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>MemoryDisk1、Undo日志规则—故障4T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogSuccess!MemoryA:900B:2100A:900B:2100…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T>Disk2、基于Undo日志的恢复t0t1t2转储运行事务Crash登记日志文件重装副本利用日志文件进行恢复继续运行事务登记日志文件介质故障恢复系统故障和事务故障恢复TherecoveryprocessRecoveryHereDisk上的日志文件2、基于Undo日志的恢复从头扫描日志,找出所有没有<Commit,T>或<Abort,T>的所有事务,放入一个事务列表L中从尾部开始扫描日志记录<T,x,v>,如果TL,则

write(X,v)output(X)ForeachTLdowrite<Abort,T>tolog2、基于Undo日志的恢复—故障1T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:1000B:2000…

<Start,T1>

<T1,A,1000>

<T1,B,2000>…

MemoryDisk无须恢复!2、基于Undo日志的恢复—故障2T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:900B:2000…

<Start,T1>

<T1,A,1000>

<T1,B,2000>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>MemoryDiskWrite(B,2000)Output(B)Write(A,1000)Output(A)2、基于Undo日志的恢复—故障3T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogFailhereA:900B:2100A:900B:2100…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T1>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>MemoryDisk如何恢复?2、基于Undo日志的恢复—故障4T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FlushLogSuccess!MemoryA:900B:2100A:900B:2100…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T1>…

<Start,T1>

<T1,A,1000>

<T1,B,2000>

<Commit,T1>Disk需要恢复吗?2、基于Undo日志的恢复Whatiffailureduringrecovery?Noproblem!Justre-executetherecovery!Becauseeachrecoveryhassameeffect!3、Undo日志总结<T,x,v>记录修改前的旧值写入<Commit,T>到磁盘之前必须先将数据写入磁盘恢复时忽略已提交事务,只撤销未提交事务若磁盘上的日志文件中某事务有<Commit,T>,则肯定该事务已将所有数据都写回到磁盘了五、Redo日志在x被写到磁盘之前,对应该修改的Redo日志记录必须已被写到磁盘上(WAL)在数据写回磁盘前先写<Commit,T>日志记录日志中的数据修改记录<T,x,v>--Nowvisthenewvalue1、Redo日志规则T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog

Output(A); Output(B);

<Start,T1>

<T1,A,900>

<T1,B,2100><Commit,T1>LogInitial:A=1000B=20001、Redo日志规则—故障1T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FailhereA:900B:2100A:1000B:2000…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>…

BufferDisk1、Redo日志规则—故障2T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FailhereA:900B:2100A:1000B:2000…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>DiskBuffer1、Redo日志规则—故障3T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FailhereA:900B:2100A:900B:2000…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>DiskBuffer1、Redo日志规则—故障4T1:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog Output(A); Output(B);

FailhereA:900B:2100A:900B:2100…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>…

<Start,T1>

<T1,A,900>

<T1,B,2100>

<Commit,T1>DiskBuffer2、基于Redo日志的恢复从头扫描日志,找出所有有<Commit,T>的事务,放入一个事务列表L中从首部开始扫描日志记录<T,x,v>,如果TL,则

write(X,v)output(X)ForeachTLdowrite<Abort,T>tolog2、基于Redo日志的恢复恢复的基础没有<Commit,T>记录的操作必定没有改写磁盘数据,因此在恢复时可以不理会DifferfromUndologging有<Commit,T>记录的结果可能还未写回磁盘,因此在恢复时要RedoStilldifferfromUndologging3、Undovs.RedoUndo基于立即更新(ImmediatelyUpdate)Redo基于延迟更新(DeferredUpdate)3、Undovs.RedoT1:

Read(A,t); tt

-100; Write(A,t);

FlushLog

Output(A); Read(B,t); tt+100; Write(B,t);

FlushLog

Output(B);FlushLog<commit>T2:

Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t);

FlushLog<commit>

Output(A); Output(B);立即更新日志(Undolog)延迟更新日志(Redolog)MoreIOsButlessbuffersMorebuffersButlessIOs六、Undo/Redo日志在x被写到磁盘之前,对应该修改的日志记录必须已被写到磁盘上(WAL)日志中的数据修改记录<T,x,v,w>

--vistheoldvalue,wisthenewvalue可以立即更新,也可以延迟更新1、基于Undo/Redo日志的恢复正向扫描日志,将<commit>的事务放入Redo列表中,将没有结束的事务放入Undo列表反向扫描日志,对于<T,x,v,w>,若T在Undo列表中,则Write(x,v);Output(x)正向扫描日志,对于<T,x,v,w>,若T在Redo列表中,则Write(x,w);Output(x)对于Undo列表中的T,写入<abort,T>1、基于Undo/Redo日志的恢复发生故障时的日志<Start,T1><T1,B,2000,1900><Start,T2><T2,A,1000,900><Commit,T1><Start,T3><T3,C,3000,2000><T3,B,1900,1800><Commit,T2><Start,T4><T4,D,1000,1200>Undo列表{T3,T4};Redo{T1,T2}Undo

T4:D=1000

T3:B=1900

T3:C=3000Redo

T1:B=1900

T2:A=900Writelog

<Abort,T3>

<Abort,T4>1、基于Undo/Redo日志的恢复先U

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论