adb08系統(tǒng)故障與恢復(fù)_第1頁
adb08系統(tǒng)故障與恢復(fù)_第2頁
adb08系統(tǒng)故障與恢復(fù)_第3頁
adb08系統(tǒng)故障與恢復(fù)_第4頁
adb08系統(tǒng)故障與恢復(fù)_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1第十章系統(tǒng)故障與恢復(fù)數(shù)據(jù)庫保護(hù)數(shù)據(jù)庫保護(hù):排除和防止各種對數(shù)據(jù)庫的干擾破壞,確保數(shù)據(jù)安全可靠;以及在數(shù)據(jù)庫遭到破壞后盡快地恢復(fù)數(shù)據(jù)庫保護(hù)通過四個方面來實現(xiàn)數(shù)據(jù)庫的恢復(fù)技術(shù)[thischapter]Dealwithfailure并發(fā)控制技術(shù)[NextChp.]Dealwithdatasharing完整性控制技術(shù)[notdiscuss]Enableconstraints安全性控制技術(shù)[notdiscuss]Authorizationandauthentication故障后,如何恢復(fù)?STEP1確定設(shè)備的故障狀態(tài)STEP2分析故障對DB的影響有哪些?STEP3設(shè)計恢復(fù)算法存有足夠的信息(故障前)DB的定期備份Log采取適當(dāng)措施,恢復(fù)數(shù)據(jù)庫(故障后)45數(shù)據(jù)庫的一致性和正確性事務(wù)的狀態(tài)及原語操作數(shù)據(jù)庫系統(tǒng)故障分析Undo日志Redo日志Undo/Redo日志Checkpoint主要內(nèi)容一、事務(wù)的狀態(tài)及原語操作事務(wù)(transaction)一個不可分割的操作序列,其中的操作要么都做,要么都不做1、事務(wù)事務(wù)的例子銀行轉(zhuǎn)帳:A帳戶轉(zhuǎn)帳到B帳戶100元。該處理包括了兩個更新步驟A=A-100B=B+100這兩個操作是不可分的:要么都做,要么都不作1、事務(wù)事務(wù)的ACID性質(zhì)原子性atomicity事務(wù)是不可分的原子,其中的操作要么都做,要么都不做一致性consistency事務(wù)的執(zhí)行保證數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)到另一個一致狀態(tài)隔離性Isolation多個事務(wù)一起執(zhí)行時相互獨立持久性Durability事務(wù)一旦成功提交,就在數(shù)據(jù)庫永久保存2、事務(wù)的狀態(tài)[inlogs]<StartT>TransactionThasstarted<CommitT>Thasfinishedsuccessfullyandallmodificationsarereflectedtodisks<AbortT>Thasbeenterminatedandallmodificationshavebeencanceled3、事務(wù)的原語操作input(x):diskblockwithx

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

dooutput(x)ifnecessary;數(shù)據(jù)X:在DISK中(對應(yīng)DB中的一個數(shù)據(jù)元素)在內(nèi)存中(一個Buffer中)事務(wù)T:局部變量t在內(nèi)存中(一個Buffer中)日志(LOG)在DISK中(即DB中)在內(nèi)存中(一個Buffer中)OUTPUT(X)INPUT(X)Read(X,t)Write(X,t)FlushLog在此處修改數(shù)據(jù)4、事務(wù)例子T1: Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t); Output(A); Output(B);Abanktransfer5、SQL對事務(wù)的支持SQL標(biāo)準(zhǔn)提供了三個語句,允許應(yīng)用程序聲明事務(wù)和控制事務(wù)BeginTransactionCommitTransactionRollbackTransactionT1: Read(A,t); tt

-100; Write(A,t); Read(B,t); tt+100; Write(B,t); Output(A); Output(B);Abanktransfer二、數(shù)據(jù)庫的一致性和正確性一致性(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事務(wù)的ACID性質(zhì)Atomicity,Consistency,Isolation,DurabilityconsistencyoftransactionConsistentDBConsistentDB’T但事務(wù)內(nèi)部不保證DB的一致性1、一致性(Consistency)2、正確性(Correctness)DBRealityDBshouldreflectrealworldDBshouldreflectrealworldExample:Atelephonenumber3601123--correctabcdefg--notcorrectCanbepreservedbyexplicitconstraints!2、正確性(Correctness)DBshouldreflectrealworldExample:Atelephonenumber3601123--correct9999999--Isitcorrect?Notcorrectinreality,butcanDBknowthis?Answer:NO!2、正確性(Correctness)CorrectnessofDB

CorrectnessofrealityCorrectnessofDB如果數(shù)據(jù)庫在事務(wù)開始執(zhí)行時是一致的,并且事務(wù)執(zhí)行結(jié)束后數(shù)據(jù)庫仍處于一致狀態(tài),則數(shù)據(jù)庫滿足正確性.ConsistencyofDB+ACIDoftransactionCorrectnessofDB2、正確性(Correctness)三、數(shù)據(jù)庫系統(tǒng)故障分析ConsistencyofDB可能由于故障而被破壞事務(wù)故障介質(zhì)故障系統(tǒng)故障1、事務(wù)故障發(fā)生在單個事務(wù)內(nèi)部的故障可預(yù)期的事務(wù)故障:即應(yīng)用程序可以發(fā)現(xiàn)的故障,如轉(zhuǎn)帳時余額不足。由應(yīng)用程序處理非預(yù)期的事務(wù)故障:如運(yùn)算溢出、掉電等,導(dǎo)致事務(wù)被異常中止。應(yīng)用程序無法處理此類故障,由系統(tǒng)進(jìn)行處理2、介質(zhì)故障硬故障(HardCrash),一般指磁盤損壞導(dǎo)致磁盤數(shù)據(jù)丟失,破壞整個數(shù)據(jù)庫3、系統(tǒng)故障系統(tǒng)故障:軟故障(SoftCrash),由于OS、DBMS軟件問題或斷電等問題導(dǎo)致內(nèi)存數(shù)據(jù)丟失,但磁盤數(shù)據(jù)仍在影響所有正在運(yùn)行的事務(wù),破壞事務(wù)狀態(tài),但不破壞整個數(shù)據(jù)庫4、數(shù)據(jù)庫系統(tǒng)故障恢復(fù)策略目的恢復(fù)DB到一致狀態(tài)基本原則冗余(Redundancy)實現(xiàn)方法定期轉(zhuǎn)儲整個數(shù)據(jù)庫建立事務(wù)日志(log)通過備份和日志進(jìn)行恢復(fù)4、數(shù)據(jù)庫系統(tǒng)故障恢復(fù)策略t0t1t2轉(zhuǎn)儲運(yùn)行事務(wù)Crash登記日志文件重裝副本利用日志文件進(jìn)行恢復(fù)繼續(xù)運(yùn)行事務(wù)登記日志文件介質(zhì)故障恢復(fù)系統(tǒng)故障和事務(wù)故障恢復(fù)當(dāng)發(fā)生故障時:(1)若是介質(zhì)故障,則首先重裝副本(2)利用日志進(jìn)行事務(wù)故障恢復(fù)和系統(tǒng)故障恢復(fù),一直恢復(fù)到故障發(fā)生點Therecoveryprocess四、Undo日志事務(wù)日志記錄了所有更新操作的具體細(xì)節(jié)Undo日志、Redo日志、Undo/Redo日志日志文件的登記嚴(yán)格按事務(wù)執(zhí)行的時間次序Undo日志文件中的內(nèi)容事務(wù)的開始標(biāo)記(<StartT>)事務(wù)的結(jié)束標(biāo)記(<Commit,T>或<AbortT>)事務(wù)的更新操作記錄,一般包括以下內(nèi)容執(zhí)行操作的事務(wù)標(biāo)識操作對象更新前值1、Undo日志規(guī)則事務(wù)的每一個修改操作都生成一個日志記錄<T,x,old-value>在x被寫到磁盤之前,對應(yīng)此修改的日志記錄必須已被寫到磁盤上當(dāng)事務(wù)的所有修改結(jié)果都已寫入磁盤后,將<Commit,T>日志記錄寫到磁盤上WriteAheadLogging(WAL日志)先寫日志先寫日志(Write-AheadLog)原則在數(shù)據(jù)被寫到磁盤之前,對應(yīng)此修改的日志記錄必須已被寫到磁盤上先寫日志<T1,BeginTransaction><T1,A,1000,900>設(shè)T1將A修改為900時發(fā)生故障。設(shè)此時900已寫到數(shù)據(jù)庫,但還未來得及寫該日志記錄到磁盤上。根據(jù)恢復(fù)策略,T1在恢復(fù)應(yīng)UNDO,但此時由于后寫日志,A的更新操作在日志中沒有記錄,因此無法將A恢復(fù)到1000******************************************如果先寫日志,則即使沒有將900寫到數(shù)據(jù)庫中,也只不過多執(zhí)行一次UNDO操作,不會影響數(shù)據(jù)庫的一致性。后寫日志<T1,BeginTransaction>1、Undo日志規(guī)則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將日志記錄從緩沖區(qū)寫到Disk上將緩沖區(qū)中A的值寫到Disk上1、Undo日志規(guī)則—故障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日志規(guī)則—故障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日志規(guī)則—故障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日志規(guī)則—故障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日志的恢復(fù)t0t1t2轉(zhuǎn)儲運(yùn)行事務(wù)Crash登記日志文件重裝副本利用日志文件進(jìn)行恢復(fù)繼續(xù)運(yùn)行事務(wù)登記日志文件介質(zhì)故障恢復(fù)系統(tǒng)故障和事務(wù)故障恢復(fù)TherecoveryprocessRecoveryHereDisk上的日志文件2、基于Undo日志的恢復(fù)從頭掃描日志,找出所有沒有<Commit,T>或<Abort,T>的所有事務(wù),放入一個事務(wù)列表L中從尾部開始掃描日志記錄<T,x,v>,如果TL,則

write(X,v)output(X)ForeachTLdowrite<Abort,T>tolog2、基于Undo日志的恢復(fù)—故障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無須恢復(fù)!2、基于Undo日志的恢復(fù)—故障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日志的恢復(fù)—故障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如何恢復(fù)?2、基于Undo日志的恢復(fù)—故障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需要恢復(fù)嗎?2、基于Undo日志的恢復(fù)Whatiffailureduringrecovery?Noproblem!Justre-executetherecovery!Becauseeachrecoveryhassameeffect!3、Undo日志總結(jié)<T,x,v>記錄修改前的舊值寫入<Commit,T>到磁盤之前必須先將數(shù)據(jù)寫入磁盤恢復(fù)時忽略已提交事務(wù),只撤銷未提交事務(wù)若磁盤上的日志文件中某事務(wù)有<Commit,T>,則肯定該事務(wù)已將所有數(shù)據(jù)都寫回到磁盤了五、Redo日志在x被寫到磁盤之前,對應(yīng)該修改的Redo日志記錄必須已被寫到磁盤上(WAL)在數(shù)據(jù)寫回磁盤前先寫<Commit,T>日志記錄日志中的數(shù)據(jù)修改記錄<T,x,v>--Nowvisthenewvalue1、Redo日志規(guī)則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日志規(guī)則—故障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日志規(guī)則—故障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日志規(guī)則—故障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日志規(guī)則—故障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日志的恢復(fù)從頭掃描日志,找出所有有<Commit,T>的事務(wù),放入一個事務(wù)列表L中從首部開始掃描日志記錄<T,x,v>,如果TL,則

write(X,v)output(X)ForeachTLdowrite<Abort,T>tolog2、基于Redo日志的恢復(fù)恢復(fù)的基礎(chǔ)沒有<Commit,T>記錄的操作必定沒有改寫磁盤數(shù)據(jù),因此在恢復(fù)時可以不理會DifferfromUndologging有<Commit,T>記錄的結(jié)果可能還未寫回磁盤,因此在恢復(fù)時要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被寫到磁盤之前,對應(yīng)該修改的日志記錄必須已被寫到磁盤上(WAL)日志中的數(shù)據(jù)修改記錄<T,x,v,w>

--vistheoldvalue,wisthenewvalue可以立即更新,也可以延遲更新1、基于Undo/Redo日志的恢復(fù)正向掃描日志,將<commit>的事務(wù)放入Redo列表中,將沒有結(jié)束的事務(wù)放入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日志的恢復(fù)發(fā)生故障時的日志<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日志的恢復(fù)先U

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論