第九章數(shù)據(jù)庫保護(hù)_第1頁
第九章數(shù)據(jù)庫保護(hù)_第2頁
第九章數(shù)據(jù)庫保護(hù)_第3頁
第九章數(shù)據(jù)庫保護(hù)_第4頁
第九章數(shù)據(jù)庫保護(hù)_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章數(shù)據(jù)庫保護(hù)

12

事務(wù)并發(fā)控制34

數(shù)據(jù)庫的恢復(fù)SQLServer數(shù)據(jù)庫備份與恢復(fù)9.1事務(wù)事務(wù)(Transaction):數(shù)據(jù)庫應(yīng)用中構(gòu)成單一邏輯工作單元的操作集和。用戶定義的一個(gè)數(shù)據(jù)庫操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位。事務(wù)和程序是兩個(gè)概念:在關(guān)系數(shù)據(jù)庫中,一個(gè)事務(wù)可以是一條SQL語句,一組SQL語句或整個(gè)程序;一個(gè)應(yīng)用程序通常包含多個(gè)事務(wù)。事務(wù)是恢復(fù)和并發(fā)控制的基本單位。9.1.1事務(wù)的定義顯式定義方式

BEGINTRANSACTIONBEGINTRANSACTIONSQL語句

SQL語句。。。。。。。。。。

COMMITROLLBACK隱式方式當(dāng)用戶沒有顯式地定義事務(wù)時(shí),DBMS按缺省規(guī)定自動(dòng)劃分事務(wù)。COMMIT--提交事務(wù)正常結(jié)束;提交事務(wù)的所有操作(更新);事務(wù)中所有對數(shù)據(jù)庫的更新永久生效。ROLLBACK--回滾事務(wù)異常終止;事務(wù)運(yùn)行的過程中發(fā)生了故障,不能繼續(xù)執(zhí)行;將事務(wù)中對數(shù)據(jù)庫的所有已完成的操作全部撤消(更新操作);事務(wù)回滾到開始時(shí)的狀態(tài)。9.1.2事務(wù)的ACID特性事務(wù)的特性-ACID特性

原子性(Atomicity)一致性(Consistency)隔離性(Isolation)持續(xù)性(Durability)9.1.2事務(wù)的ACID特性事務(wù)是數(shù)據(jù)庫的邏輯工作單位。事務(wù)中包括的諸操作要么都做,要么都不做,是不可拆分的。由DBMS的事務(wù)管理子系統(tǒng)實(shí)現(xiàn).1.原子性9.1.2事務(wù)的ACID特性2.一致性事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài),即數(shù)據(jù)不會(huì)因?yàn)槭聞?wù)的執(zhí)行而遭到破壞。一致性狀態(tài):數(shù)據(jù)庫中只包含成功事務(wù)提交的結(jié)果。不一致狀態(tài):數(shù)據(jù)庫中包含失敗事務(wù)的結(jié)果。由DBMS的完整性子系統(tǒng)實(shí)現(xiàn)。9.1.2事務(wù)的ACID特性例:銀行轉(zhuǎn)帳:從帳號(hào)A中取出一萬元,存入帳號(hào)B。定義一個(gè)事務(wù),該事務(wù)包括兩個(gè)操作:

B=B+1

A=A-1BA這兩個(gè)操作要么全做,要么全不做。全做或者全不做,數(shù)據(jù)庫都處于一致性狀態(tài)。若只做一個(gè)操作,數(shù)據(jù)庫就處于不一致性狀態(tài)。9.1.2事務(wù)的ACID特性3.隔離性一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。(針對并發(fā)執(zhí)行而言的)一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他并發(fā)事務(wù)是隔離的;并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。由DBMS的并發(fā)控制子系統(tǒng)實(shí)現(xiàn)。9.1.2事務(wù)的ACID特性T1的修改被T2覆蓋了!

讀A=16

A←A-3寫回A=13①讀A=16

③A←A-1

寫回A=15

④T2T19.1.2事務(wù)的ACID特性4.持久性事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其執(zhí)行結(jié)果有任何影響;即使在寫入磁盤之前,系統(tǒng)發(fā)生故障,在下次啟動(dòng)之后,也應(yīng)保障數(shù)據(jù)更新的有效。保證事務(wù)ACID特性是事務(wù)處理的重要任務(wù);破壞事務(wù)ACID特性的因素:多個(gè)事務(wù)并行運(yùn)行時(shí),不同事務(wù)的操作交叉執(zhí)行;事務(wù)在運(yùn)行過程中被強(qiáng)行停止。注:由DBMS的恢復(fù)管理子系統(tǒng)實(shí)現(xiàn)。9.1.2事務(wù)的ACID特性

轉(zhuǎn)賬操作:T:read(A);A:=A-50;write(A);read(B);B:=B+50;write(B)。

轉(zhuǎn)賬操作:T:BEGINTRANSACTIONread(A);A:=A-50;write(A);if(A<0)ROLLBACK;else{read(B);B:=B+50;write(B);COMMIT;}9.1.3事務(wù)的狀態(tài)局部提交狀態(tài)活動(dòng)狀態(tài)提交狀態(tài)失敗狀態(tài)異常中止?fàn)顟B(tài)(1)活動(dòng)狀態(tài):事務(wù)開始運(yùn)行就進(jìn)入活動(dòng)狀態(tài),直到部分提交或失敗。

BEGIN-TRANSACTION:事務(wù)進(jìn)入活動(dòng)狀態(tài)。(2)局部提交狀態(tài):事務(wù)執(zhí)行完最后一條語句,即執(zhí)行完END-TRANSACTION命令之后進(jìn)入局部提交狀態(tài)。9.1.3事務(wù)的狀態(tài)(3)失敗狀態(tài):發(fā)現(xiàn)一個(gè)事務(wù)不能正常運(yùn)行下去時(shí)。DBMS消除事務(wù)中所有操作對數(shù)據(jù)庫和其他事務(wù)的影響,結(jié)束事務(wù)的運(yùn)行。(4)異常中止?fàn)顟B(tài):當(dāng)一個(gè)失敗事務(wù)對數(shù)據(jù)庫和其他事務(wù)的影響被消除,數(shù)據(jù)庫恢復(fù)到該事務(wù)開始執(zhí)行前的狀態(tài)之后,該失敗事務(wù)退出DBS,進(jìn)入異常結(jié)束狀態(tài)。(5)提交狀態(tài):當(dāng)一個(gè)事務(wù)成功地完成了所有操作,并且所有操作對數(shù)據(jù)庫的影響都已永久地存入數(shù)據(jù)庫之后,該事務(wù)退出DBS,進(jìn)入提交狀態(tài),正常結(jié)束。

COMMIT-TRANSACTION:事務(wù)進(jìn)入提交狀態(tài)。事務(wù)的提交狀態(tài)和異常中止?fàn)顟B(tài)都事務(wù)的結(jié)束狀態(tài)。9.2并發(fā)控制同時(shí)并發(fā)方式(simultaneousconcurrency)多處理機(jī)系統(tǒng)中,每個(gè)處理機(jī)可以運(yùn)行一個(gè)事務(wù),多個(gè)處理機(jī)可以同時(shí)運(yùn)行多個(gè)事務(wù),實(shí)現(xiàn)多個(gè)事務(wù)真正的并行運(yùn)行。事務(wù)并發(fā)執(zhí)行帶來的問題會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況可能會(huì)存取和存儲(chǔ)不正確的數(shù)據(jù),破壞事務(wù)一致性和數(shù)據(jù)庫的一致性9.2.1并發(fā)操作與數(shù)據(jù)的不一致性T1的修改被T2覆蓋了!

讀A=16

A←A-3寫回A=13①讀A=16

③A←A-1

寫回A=15

④事務(wù)T2事務(wù)T1數(shù)據(jù)不一致實(shí)例:飛機(jī)訂票系統(tǒng)并發(fā)控制機(jī)制的任務(wù)對并發(fā)操作進(jìn)行正確調(diào)度保證事務(wù)的隔離性保證數(shù)據(jù)庫的一致性

并發(fā)操作帶來的數(shù)據(jù)不一致性丟失更新(lostupdate)不可重復(fù)讀(non-repeatableread)讀“臟”數(shù)據(jù)(dirtyread)9.2.1并發(fā)操作與數(shù)據(jù)的不一致性1.丟失更新指兩個(gè)事務(wù)T1與T2從數(shù)據(jù)庫中讀入同一數(shù)據(jù)并修改,T2的提交結(jié)果破壞了T1提交的結(jié)果,導(dǎo)致T1的修改被丟失。T1T2①讀A=16

③A←A-1

寫回A=15

讀A=16

A←A-3寫回A=139.2.1并發(fā)操作與數(shù)據(jù)的不一致性2.不可重復(fù)讀指T1讀取數(shù)據(jù)后,T2執(zhí)行更新操作,使T1無法再現(xiàn)前一次讀取結(jié)果。

讀B=100B←B*2寫回B=200

①讀A=50

讀B=100

求和=150②

③讀A=50

讀B=200

求和=250(驗(yàn)算不對)T2T19.2.1并發(fā)操作與數(shù)據(jù)的不一致性不可重復(fù)讀包括三種情況:T1讀取某一數(shù)據(jù)后,T2對其做了修改,當(dāng)T1再次讀該數(shù)據(jù)時(shí),得到與前一次不同的值。T1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后,T2刪除了其中部分記錄,當(dāng)T1再次讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)某些記錄神密地消失了。T1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后,T2插入了一些記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)多了一些記錄。后兩種不可重復(fù)讀有時(shí)也稱為幻影現(xiàn)象。9.2.1并發(fā)操作與數(shù)據(jù)的不一致性3.讀“臟”數(shù)據(jù)指T1修改某一數(shù)據(jù),并將其寫回磁盤,T2讀取同一數(shù)據(jù)后,T1由于某種原因被撤消,這時(shí)T1已修改過的數(shù)據(jù)恢復(fù)原值,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,是不正確的數(shù)據(jù),又稱為“臟”數(shù)據(jù)。

讀C=200

①讀C=100C←C*2

寫回C②

③ROLLBACKC恢復(fù)為100T2T19.2.2封鎖并發(fā)控制的主要技術(shù)封鎖(Locking)時(shí)標(biāo)(Timestamp,時(shí)間戳)商用的DBMS一般都采用封鎖方法9.2.2封鎖1.什么是封鎖?封鎖就是事務(wù)T在對某個(gè)數(shù)據(jù)對象(如表、記錄等)操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)T就對該數(shù)據(jù)對象有了一定的控制,在事務(wù)T釋放它的鎖之前,其它的事務(wù)不能更新此數(shù)據(jù)對象。封鎖是實(shí)現(xiàn)并發(fā)控制的一個(gè)非常重要的技術(shù)。DBMS通常提供了多種類型的封鎖。一個(gè)事務(wù)對某個(gè)數(shù)據(jù)對象加鎖后究竟擁有什么樣的控制是由封鎖的類型決定的?;痉怄i類型排它鎖(eXclusivelock,簡記為X鎖)共享鎖(Sharelock,簡記為S鎖)9.2.2封鎖排它鎖(又稱寫鎖,簡稱X鎖)若事務(wù)T對數(shù)據(jù)對象A加上X鎖,則只允許T讀取和修改A,其它任何事務(wù)都不能再對A加任何類型的鎖,直到T釋放A上的鎖。

共享鎖(又稱讀鎖,簡稱S鎖)若事務(wù)T對數(shù)據(jù)對象A加上S鎖,則其它事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。9.2.2封鎖Y=Yes,相容的請求N=No,不相容的請求2.封鎖類型的相容矩陣XS-XNNYSNYY-YYYT2T1在鎖的相容矩陣中:最左邊一列表示事務(wù)T1已經(jīng)獲得的數(shù)據(jù)對象上的鎖的類型,其中橫線表示沒有加鎖。最上面一行表示另一事務(wù)T2對同一數(shù)據(jù)對象發(fā)出的封鎖請求。T2的封鎖請求能否被滿足用矩陣中的Y和N表示Y表示事務(wù)T2的封鎖要求與T1已持有的鎖相容,封鎖請求可以滿足N表示T2的封鎖請求與T1已持有的鎖沖突,T2的請求被拒絕9.2.2封鎖3.封鎖的粒度X鎖和S鎖都是加在某一個(gè)數(shù)據(jù)對象上的;封鎖的對象:邏輯單元,物理單元封鎖對象可以很大也可以很小例:對整個(gè)數(shù)據(jù)庫加鎖對某個(gè)屬性值加鎖封鎖對象的大小稱為封鎖粒度(Granularity)。多粒度封鎖(multiplegranularitylocking)在一個(gè)系統(tǒng)中同時(shí)支持多種封鎖粒度供不同的事務(wù)選擇。9.2.2封鎖封鎖粒度與系統(tǒng)并發(fā)度和并發(fā)控制開銷密切相關(guān).選擇封鎖粒度的原則封鎖的粒度越大,小,系統(tǒng)被封鎖的對象并發(fā)度系統(tǒng)開銷少,多,低,高,小,大,注:需要處理多個(gè)關(guān)系的大量元組的用戶事務(wù):以數(shù)據(jù)庫為封鎖粒度;需要處理大量元組的用戶事務(wù):以關(guān)系為封鎖粒度;只處理少量元組的用戶事務(wù):以元組為封鎖粒度。4.封鎖協(xié)議?運(yùn)用X鎖和S鎖對數(shù)據(jù)對象加鎖時(shí),需要約定一些規(guī)則:封鎖協(xié)議(LockingProtocol)。

?何時(shí)申請X鎖或S鎖;?持鎖時(shí)間、何時(shí)釋放?不同的封鎖協(xié)議,在不同的程度上為并發(fā)操作的正確調(diào)度提供一定的保證。?常用的封鎖協(xié)議:三級(jí)封鎖協(xié)議。9.2.2封鎖(1)一級(jí)封鎖協(xié)議事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。正常結(jié)束(COMMIT)非正常結(jié)束(ROLLBACK)?一級(jí)封鎖協(xié)議可防止丟失修改,并保證事務(wù)T是可恢復(fù)的。?在一級(jí)封鎖協(xié)議中,如果是讀數(shù)據(jù),不需要加鎖的,所以它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。9.2.2封鎖9.2.2封鎖

T1T2①

XlockA②

R(A)=16③

④A=A-1W(A)=15CommitUnlockA⑤

XlockA等待等待等待等待獲得XlockA讀A=15A=A-3W(A)=12CommitUnlockA

沒有丟失修改

事務(wù)T1在讀A進(jìn)行修改之前先對A加X鎖當(dāng)T2再請求對A加X鎖時(shí)被拒絕T2只能等待T1釋放A上的鎖后T2獲得對A的X鎖這時(shí)T2讀到的A已經(jīng)是T1更新過的值15T2按此新的A值進(jìn)行運(yùn)算,并將結(jié)果值A(chǔ)=14送回到磁盤。避免了丟失T1的更新。

讀A=15①

XLOCK(A)

獲得②

讀A=16

A=A-1

寫回A=15③

④RollbackUNLOCK(A)

T2T1例:讀“臟”數(shù)據(jù)9.2.2封鎖

(2)二級(jí)封鎖協(xié)議事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)T在讀取數(shù)據(jù)R前必須先加S鎖,讀完后即可釋放S鎖。?可以防止丟失修改和讀“臟”數(shù)據(jù)。由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。9.2.2封鎖9.2.2封鎖T1T2①XlockC

讀C=100C=C*2

寫回C=200②

③ROLLBACK(C恢復(fù)為100)UnlockC④

SlockC等待等待等待等待獲得SlockC讀C=100CommitCUnlockC不讀“臟”數(shù)據(jù)事務(wù)T1在對C進(jìn)行修改之前,先對C加X鎖,修改其值后寫回磁盤T2請求在C上加S鎖,因T1已在C上加了X鎖,T2只能等待T1因某種原因被撤銷,C恢復(fù)為原值100T1釋放C上的X鎖后T2獲得C上的S鎖,讀C=100。避免了T2讀“臟”數(shù)據(jù)(3)三級(jí)封鎖協(xié)議事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)T在讀取數(shù)據(jù)R前必須先加S鎖,直到事務(wù)結(jié)束才釋放。?可以防止丟失修改和讀“臟”數(shù)據(jù),還防止了不可重復(fù)讀。9.2.2封鎖9.2.2封鎖可重復(fù)讀事務(wù)T1在讀A,B之前,先對A,B加S鎖其他事務(wù)只能再對A,B加S鎖,而不能加X鎖,即其他事務(wù)只能讀A,B,而不能修改當(dāng)T2為修改B而申請對B的X鎖時(shí)被拒絕只能等待T1釋放B上的鎖T1為驗(yàn)算再讀A,B,這時(shí)讀出的B仍是100,求和結(jié)果仍為150,即可重復(fù)讀T1結(jié)束才釋放A,B上的S鎖。T2才獲得對B的X鎖T1T2①

SlockASlockB

讀A=50

讀B=100

求和=150②③讀A=50

讀B=100

求和=150CommitUnlockAUnlockB④

XlockB等待等待等待等待等待等待獲得XlockB讀B=100B←B*2寫回B=200CommitUnlockB三級(jí)協(xié)議的主要區(qū)別:9.2.2封鎖9.2.2封鎖1)活鎖T1T2T3T4LockR…UnlockLockR等待等待等待等待等待等待等待LockR等待LockR…UnlockLockR等待等待等待LockR如何避免活鎖-先來先服務(wù)

當(dāng)多個(gè)事務(wù)請求封鎖同一數(shù)據(jù)對象時(shí):按請求封鎖的先后次序?qū)@些事務(wù)排隊(duì);該數(shù)據(jù)對象上的鎖一旦釋放,首先批準(zhǔn)申請隊(duì)列中第一個(gè)事務(wù)獲得鎖。5.活鎖和死鎖9.2.2封鎖2)死鎖T1T2LockR1LockR2等待等待等待等待LockR2…LockR1等待等待等待解決方法預(yù)防死鎖死鎖的診斷與解除9.2.2封鎖3)死鎖的預(yù)防產(chǎn)生死鎖的原因是兩個(gè)或多個(gè)事務(wù)都已封鎖了一些數(shù)據(jù)對象,然后又都請求對已為其他事務(wù)封鎖的數(shù)據(jù)對象加鎖,從而出現(xiàn)死等待。預(yù)防死鎖的發(fā)生就是要破壞產(chǎn)生死鎖的條件。常用方法:一次封鎖法順序封鎖法9.2.2封鎖(1)一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。存在的問題:降低并發(fā)度擴(kuò)大封鎖范圍;難以事先精確確定封鎖對象,只能將以后可能要用到的數(shù)據(jù)全部加鎖,勢必更加擴(kuò)大封鎖范圍,從而進(jìn)一步降低系統(tǒng)的并發(fā)度。9.2.2封鎖預(yù)先對數(shù)據(jù)對象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序?qū)嵭蟹怄i。存在的問題:維護(hù)成本高;由于事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動(dòng)態(tài)決定,因此很難按規(guī)定順序施加封鎖。(2)順序封鎖法9.2.2封鎖4)死鎖的診斷與解除(普遍采用)允許死鎖發(fā)生解除死鎖由DBMS的并發(fā)控制子系統(tǒng)定期檢測系統(tǒng)中是否存在死鎖;一旦檢測到死鎖,就要設(shè)法解除。常用方法:超時(shí)法事務(wù)等待圖法9.2.2封鎖(1)超時(shí)法如果一個(gè)事務(wù)的等待時(shí)間超過了規(guī)定的時(shí)限,就認(rèn)為發(fā)生了死鎖。優(yōu)點(diǎn):實(shí)現(xiàn)簡單缺點(diǎn):有可能誤判死鎖;時(shí)限若設(shè)置得太長,死鎖發(fā)生后不能及時(shí)發(fā)現(xiàn)。9.2.2封鎖(2)等待圖法用事務(wù)等待圖動(dòng)態(tài)反映所有事務(wù)的等待情況:事務(wù)等待圖是一個(gè)有向圖G=(T,U)T為結(jié)點(diǎn)的集合:每個(gè)結(jié)點(diǎn)表示正運(yùn)行的事務(wù)U為邊的集合:每條邊表示事務(wù)等待的情況若T1等待T2,則T1,T2之間劃一條有向邊,從T1指向T2。9.2.2封鎖并發(fā)控制子系統(tǒng)周期性地檢測事務(wù)等待圖,如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。解除死鎖:選擇一個(gè)處理死鎖代價(jià)最小的事務(wù),將其撤消,釋放此事務(wù)持有的所有的鎖,使其它事務(wù)能繼續(xù)運(yùn)行下去。9.2.3并發(fā)操作的調(diào)度

由于計(jì)算機(jī)系統(tǒng)對并發(fā)操作的調(diào)度是隨機(jī)的,而且不同的調(diào)度可能會(huì)產(chǎn)生不同的結(jié)果:一.什么樣的并發(fā)操作調(diào)度是正確的?二.如何保證并發(fā)操作調(diào)度的正確性?一.什么樣的并發(fā)操作調(diào)度是正確的?將所有事務(wù)串行起來的調(diào)度策略一定是正確的調(diào)度策略。多個(gè)事務(wù)的并行執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行這些事務(wù)時(shí)的結(jié)果相同,這種調(diào)度策略稱為可串行化的調(diào)度。9.2.3并發(fā)操作的調(diào)度可串行性是并發(fā)事務(wù)正確性的準(zhǔn)則。一個(gè)給定的并發(fā)調(diào)度,可串行化<=>正確調(diào)度例:現(xiàn)在有兩個(gè)事務(wù),分別包含下列操作:事務(wù)T1:讀B;A=B-1;寫回A;事務(wù)T2:讀A;B=A+1;寫回B;假設(shè):A,B的初值均為5。則:若T1->T2,A=4B=5;

若T2->T1,A=5B=6;9.2.3并發(fā)操作的調(diào)度對這兩個(gè)事務(wù)的不同調(diào)度策略:串行執(zhí)行串行調(diào)度策略1串行調(diào)度策略2交錯(cuò)執(zhí)行不可串行化的調(diào)度可串行化的調(diào)度串行執(zhí)行SlockBY=B=5UnlockBXlockAA=Y-1寫回A(=4)UnlockA

SlockAX=A=4UnlockAXlockBB=X+1寫回B(=5)UnlockB

T1T2

SlockBY=B=6UnlockBXlockAA=Y-1寫回A(=5)UnlockA

SlockAX=A=5UnlockAXlockBB=X+1寫回B(=6)UnlockB

T1T2正確調(diào)度交錯(cuò)執(zhí)行SlockBY=B=5

UnlockB

XlockAA=Y-1寫回A(=4)

UnlockA

SlockAX=A=5

UnlockA

XlockBB=X+1寫回B(=6)

UnlockBT1T2錯(cuò)誤調(diào)度SlockBY=B=5UnlockBXlockA

A=Y-1寫回A(=4)UnlockA

SlockA

等待等待等待X=A=4UnlockAXlockBB=X+1寫回B(=5)UnlockBT1T2正確調(diào)度9.2.3并發(fā)操作的調(diào)度提供一定的手段保證調(diào)度的可串行化。二.如何保證并發(fā)操作調(diào)度的正確性?

兩段鎖協(xié)議是保證并發(fā)調(diào)度可串行性的封鎖協(xié)議。要求:每個(gè)事務(wù)分兩個(gè)階段進(jìn)行數(shù)據(jù)的加鎖和解鎖.

加鎖階段:每個(gè)事務(wù)開始運(yùn)行后即進(jìn)入加鎖階段,申請獲得所需要的所有鎖。(不能釋放鎖,又稱為擴(kuò)展階段)

解鎖階段:當(dāng)一個(gè)事務(wù)第一次釋放鎖時(shí),該事務(wù)進(jìn)入解鎖階段。(不能再申請任何鎖,又稱為收縮階段)9.2.3并發(fā)操作的調(diào)度例:事務(wù)1的封鎖序列:

SlockA...SlockB...XlockC...UnlockB...UnlockA...UnlockC;事務(wù)2的封鎖序列:

SlockA...UnlockA...SlockB...XlockC...UnlockC...UnlockB;事務(wù)1遵守兩段鎖協(xié)議,而事務(wù)2不遵守兩段協(xié)議。9.2.3并發(fā)操作的調(diào)度

若并行執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議,則對這些事務(wù)的所有并行調(diào)度策略都是可串行化的。

所有遵守兩段鎖協(xié)議的事務(wù),其并行執(zhí)行的結(jié)果一定是正確的。注:事務(wù)遵守兩段鎖協(xié)議是可串行化調(diào)度的充分條件,而不是必要條件。9.2.3并發(fā)操作的調(diào)度SlockB讀B=5Y=BXlockA

A=Y-1寫回A=4UnlockBUnlockA

SlockA

等待等待等待等待SlockA讀A=4Y=AXlockBB=Y+1寫回B=5UnlockBUnlockA

SlockB讀B=5Y=BUnlockBXlockA

A=Y-1寫回A=4UnlockA

SlockA等待等待等待SlockA讀A=4X=AUnlockAXlockBB=X+1寫回B=5UnlockB

(a)遵守兩段鎖協(xié)議(b)不遵守兩段鎖協(xié)議SlockB讀B=5Y=BUnlockBXlockAA=Y-1寫回A=4UnlockASlockA讀A=5X=AUnlockAXlockB等待XlockBB=X+1寫回B=6UnlockB

(c)不遵守兩段鎖協(xié)議T1T2

T1T2T1T29.2.3并發(fā)操作的調(diào)度兩段鎖協(xié)議與防止死鎖的一次封鎖法:一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行,因此一次封鎖法遵守兩段鎖協(xié)議;但是兩段鎖協(xié)議并不要求事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,因此遵守兩段鎖協(xié)議的事務(wù)可能發(fā)生死鎖。T1SlockB讀B=5

XlockA等待等待T2

SlockA讀A=5

XlockB等待

遵守兩段鎖協(xié)議的事務(wù)發(fā)生死鎖封鎖粒度封鎖對象的大小稱為封鎖粒度(Granularity)封鎖的對象:邏輯單元,物理單元例:在關(guān)系數(shù)據(jù)庫中,封鎖對象:邏輯單元:屬性值、屬性值集合、元組、關(guān)系、索引項(xiàng)、整個(gè)索引、整個(gè)數(shù)據(jù)庫等物理單元:頁(數(shù)據(jù)頁或索引頁)、物理記錄等選擇封鎖粒度原則封鎖粒度與系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。封鎖的粒度越大,數(shù)據(jù)庫所能夠封鎖的數(shù)據(jù)單元就越少,并發(fā)度就越小,系統(tǒng)開銷也越小;封鎖的粒度越小,并發(fā)度較高,但系統(tǒng)開銷也就越大選擇封鎖粒度的原則(續(xù))例若封鎖粒度是數(shù)據(jù)頁,事務(wù)T1需要修改元組L1,則T1必須對包含L1的整個(gè)數(shù)據(jù)頁A加鎖。如果T1對A加鎖后事務(wù)T2要修改A中元組L2,則T2被迫等待,直到T1釋放A。如果封鎖粒度是元組,則T1和T2可以同時(shí)對L1和L2加鎖,不需要互相等待,提高了系統(tǒng)的并行度。又如,事務(wù)T需要讀取整個(gè)表,若封鎖粒度是元組,T必須對表中的每一個(gè)元組加鎖,開銷極大

AnIntroductiontoDatabaseSystem選擇封鎖粒度的原則(續(xù))多粒度封鎖(MultipleGranularityLocking)

在一個(gè)系統(tǒng)中同時(shí)支持多種封鎖粒度供不同的事務(wù)選擇選擇封鎖粒度同時(shí)考慮封鎖開銷和并發(fā)度兩個(gè)因素,適當(dāng)選擇封鎖粒度需要處理多個(gè)關(guān)系的大量元組的用戶事務(wù):以數(shù)據(jù)庫為封鎖單位需要處理大量元組的用戶事務(wù):以關(guān)系為封鎖單元只處理少量元組的用戶事務(wù):以元組為封鎖單位11.6.1多粒度封鎖多粒度樹以樹形結(jié)構(gòu)來表示多級(jí)封鎖粒度根結(jié)點(diǎn)是整個(gè)數(shù)據(jù)庫,表示最大的數(shù)據(jù)粒度葉結(jié)點(diǎn)表示最小的數(shù)據(jù)粒度

多粒度封鎖(續(xù))例:三級(jí)粒度樹。根結(jié)點(diǎn)為數(shù)據(jù)庫,數(shù)據(jù)庫的子結(jié)點(diǎn)為關(guān)系,關(guān)系的子結(jié)點(diǎn)為元組。數(shù)據(jù)庫關(guān)系Rn關(guān)系R1元組元組元組元組……

……

……三級(jí)粒度樹多粒度封鎖協(xié)議允許多粒度樹中的每個(gè)結(jié)點(diǎn)被獨(dú)立地加鎖對一個(gè)結(jié)點(diǎn)加鎖意味著這個(gè)結(jié)點(diǎn)的所有后裔結(jié)點(diǎn)也被加以同樣類型的鎖在多粒度封鎖中一個(gè)數(shù)據(jù)對象可能以兩種方式封鎖:顯式封鎖和隱式封鎖顯式封鎖和隱式封鎖顯式封鎖:直接加到數(shù)據(jù)對象上的封鎖隱式封鎖:該數(shù)據(jù)對象沒有獨(dú)立加鎖,是由于其上級(jí)結(jié)點(diǎn)加鎖而使該數(shù)據(jù)對象加上了鎖顯式封鎖和隱式封鎖的效果是一樣的顯式封鎖和隱式封鎖(續(xù))系統(tǒng)檢查封鎖沖突時(shí)要檢查顯式封鎖還要檢查隱式封鎖例如事務(wù)T要對關(guān)系R1加X鎖系統(tǒng)必須搜索其上級(jí)結(jié)點(diǎn)數(shù)據(jù)庫、關(guān)系R1還要搜索R1的下級(jí)結(jié)點(diǎn),即R1中的每一個(gè)元組如果其中某一個(gè)數(shù)據(jù)對象已經(jīng)加了不相容鎖,則T必須等待顯式封鎖和隱式封鎖(續(xù))對某個(gè)數(shù)據(jù)對象加鎖,系統(tǒng)要檢查

該數(shù)據(jù)對象有無顯式封鎖與之沖突

所有上級(jí)結(jié)點(diǎn)檢查本事務(wù)的顯式封鎖是否與該數(shù)據(jù)對象上的隱式封鎖沖突:(由上級(jí)結(jié)點(diǎn)已加的封鎖造成的)所有下級(jí)結(jié)點(diǎn)看上面的顯式封鎖是否與本事務(wù)的隱式封鎖(將加到下級(jí)結(jié)點(diǎn)的封鎖)沖突11.6.2意向鎖引進(jìn)意向鎖(intentionlock)目的提高對某個(gè)數(shù)據(jù)對象加鎖時(shí)系統(tǒng)的檢查效率意向鎖(續(xù))如果對一個(gè)結(jié)點(diǎn)加意向鎖,則說明該結(jié)點(diǎn)的下層結(jié)點(diǎn)正在被加鎖對任一結(jié)點(diǎn)加基本鎖,必須先對它的上層結(jié)點(diǎn)加意向鎖例如,對任一元組加鎖時(shí),必須先對它所在的數(shù)據(jù)庫和關(guān)系加意向鎖常用意向鎖意向共享鎖(IntentShareLock,簡稱IS鎖)意向排它鎖(IntentExclusiveLock,簡稱IX鎖)共享意向排它鎖(ShareIntentExclusiveLock,簡稱SIX鎖)意向鎖(續(xù))IS鎖如果對一個(gè)數(shù)據(jù)對象加IS鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加S鎖。例如:事務(wù)T1要對R1中某個(gè)元組加S鎖,則要首先對關(guān)系R1和數(shù)據(jù)庫加IS鎖意向鎖(續(xù))IX鎖如果對一個(gè)數(shù)據(jù)對象加IX鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加X鎖。例如:事務(wù)T1要對R1中某個(gè)元組加X鎖,則要首先對關(guān)系R1和數(shù)據(jù)庫加IX鎖意向鎖(續(xù))SIX鎖如果對一個(gè)數(shù)據(jù)對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例:對某個(gè)表加SIX鎖,則表示該事務(wù)要讀整個(gè)表(所以要對該表加S鎖),同時(shí)會(huì)更新個(gè)別元組(所以要對該表加IX鎖)。意向鎖(續(xù))意向鎖的相容矩陣意向鎖(續(xù))鎖的強(qiáng)度鎖的強(qiáng)度是指它對其他鎖的排斥程度一個(gè)事務(wù)在申請封鎖時(shí)以強(qiáng)鎖代替弱鎖是安全的,反之則不然意向鎖(續(xù))具有意向鎖的多粒度封鎖方法申請封鎖時(shí)應(yīng)該按自上而下的次序進(jìn)行釋放封鎖時(shí)則應(yīng)該按自下而上的次序進(jìn)行例如:事務(wù)T1要對關(guān)系R1加S鎖要首先對數(shù)據(jù)庫加IS鎖檢查數(shù)據(jù)庫和R1是否已加了不相容的鎖(X或IX)不再需要搜索和檢查R1中的元組是否加了不相容的鎖(X鎖)意向鎖(續(xù))具有意向鎖的多粒度封鎖方法提高了系統(tǒng)的并發(fā)度減少了加鎖和解鎖的開銷在實(shí)際的數(shù)據(jù)庫管理系統(tǒng)產(chǎn)品中得到廣泛應(yīng)用9.3數(shù)據(jù)庫的恢復(fù)故障是不可避免的:計(jì)算機(jī)硬件故障;系統(tǒng)軟件和應(yīng)用軟件的錯(cuò)誤;操作員的失誤;惡意的破壞。故障的影響:運(yùn)行事務(wù)非正常中斷,影響數(shù)據(jù)正確性;破壞數(shù)據(jù)庫,導(dǎo)致部分或全部數(shù)據(jù)丟失。9.3.1存儲(chǔ)器的結(jié)構(gòu)1.存儲(chǔ)器的類型從存儲(chǔ)器的訪問速度、容量和恢復(fù)能力角度考察,計(jì)算機(jī)系統(tǒng)的存儲(chǔ)介質(zhì)可分成三類。(1)易失性存儲(chǔ)器:指內(nèi)存和Cache。在系統(tǒng)發(fā)生故障時(shí),存儲(chǔ)的信息會(huì)立即丟失。但這一類存儲(chǔ)器的訪問速度非??臁#?)非易失性存儲(chǔ)器:指磁盤和磁帶。在系統(tǒng)發(fā)生故障時(shí),存儲(chǔ)的信息不會(huì)丟失。(3)穩(wěn)定存儲(chǔ)器:一個(gè)理論概念,存儲(chǔ)在穩(wěn)定存儲(chǔ)器上的信息是不會(huì)丟失的。2.穩(wěn)定存儲(chǔ)器的實(shí)現(xiàn)

(1)數(shù)據(jù)備份

將計(jì)算機(jī)系統(tǒng)中硬盤上的數(shù)據(jù)通過適當(dāng)?shù)男问睫D(zhuǎn)錄到可脫機(jī)保存的介質(zhì)(如磁帶、光盤)上,以便需要時(shí)再寫入到計(jì)算機(jī)系統(tǒng)中使用。數(shù)據(jù)庫的備份不是簡單地做拷貝,它有一套備份和恢復(fù)機(jī)制。目前采用地備份措施在硬件一級(jí)有磁盤鏡像、磁盤陣列(RAID)、雙機(jī)容錯(cuò)等;在軟件一級(jí)有數(shù)據(jù)拷貝。(2)數(shù)據(jù)銀行(DataBank)

利用計(jì)算機(jī)網(wǎng)絡(luò)把數(shù)據(jù)傳輸?shù)竭h(yuǎn)程的計(jì)算機(jī)存儲(chǔ)系統(tǒng)(即“數(shù)據(jù)銀行”)。對數(shù)據(jù)的寫操作,既要寫到本地的存儲(chǔ)器中,也要寫到遠(yuǎn)程的數(shù)據(jù)庫中,以防止數(shù)據(jù)的丟失。9.3.1存儲(chǔ)器的結(jié)構(gòu)數(shù)據(jù)在磁盤上以“塊”的定長存儲(chǔ)單位形式組織。塊是內(nèi)、外存數(shù)據(jù)交換的基本單位。磁盤中的塊稱為“物理塊”,內(nèi)存中臨時(shí)存放物理塊內(nèi)容的塊稱為“緩沖塊”,所有的緩沖塊組成了“磁盤緩沖區(qū)”。數(shù)據(jù)從物理塊到緩沖塊,稱為輸入(Input)操作;數(shù)據(jù)從緩沖塊到物理塊,稱為輸出(Output)操作。Input(A):把物理塊A的內(nèi)容傳到內(nèi)存的緩沖塊中。Output(B):把緩沖塊B的內(nèi)容傳送到磁盤中恰當(dāng)?shù)奈锢韷K中。9.3.1存儲(chǔ)器的結(jié)構(gòu)3.?dāng)?shù)據(jù)訪問read(X):把數(shù)據(jù)項(xiàng)X的值送到工作區(qū)中的局部變量xi。write(X):把局部變量xi的值送到緩沖塊中X數(shù)據(jù)項(xiàng)。9.3.1存儲(chǔ)器的結(jié)構(gòu)

每個(gè)事務(wù)Ti有一個(gè)專用工作區(qū),存放它訪問和修改的數(shù)據(jù)項(xiàng)值。在事務(wù)開始時(shí),產(chǎn)生這個(gè)工作區(qū);在事務(wù)結(jié)束(提交或中止)時(shí),工作區(qū)被撤銷。事務(wù)Ti工作區(qū)中數(shù)據(jù)項(xiàng)X用xi表示。4.恢復(fù)與原子性的聯(lián)系

9.3.1存儲(chǔ)器的結(jié)構(gòu)

讀B=1000B=B+1=1100寫B(tài)=1100

讀A=2000A=A-100=1900

寫A=1900AB

系統(tǒng)重新啟動(dòng)時(shí),可能采取下列兩種操作之一:(1)重新執(zhí)行事務(wù),此時(shí)將導(dǎo)致數(shù)據(jù)庫中A的值為1800,而不是1900,B的值為1100。(2)不重新執(zhí)行事務(wù),此時(shí)將導(dǎo)致數(shù)據(jù)庫中A的值為1900,B的值為1000。

這兩種操作方式都使系統(tǒng)進(jìn)入不一致狀態(tài),因此都是錯(cuò)誤的操作。9.3.2恢復(fù)的原則和實(shí)現(xiàn)方法恢復(fù)操作的基本原則:冗余利用存儲(chǔ)在系統(tǒng)其它地方的冗余數(shù)據(jù)來重建數(shù)據(jù)庫中已被破壞或不正確的那部分?jǐn)?shù)據(jù)?;謴?fù)的實(shí)現(xiàn)技術(shù):復(fù)雜一個(gè)大型數(shù)據(jù)庫產(chǎn)品,恢復(fù)子系統(tǒng)的代碼要占全部代碼的10%以上。9.3.2恢復(fù)的原則和實(shí)現(xiàn)方法數(shù)據(jù)庫恢復(fù)具體實(shí)現(xiàn)方法:1.轉(zhuǎn)儲(chǔ)和建立日志;數(shù)據(jù)轉(zhuǎn)儲(chǔ):定期地將整個(gè)數(shù)據(jù)庫復(fù)制到磁帶或另一個(gè)磁盤。登錄日志文件:記錄事務(wù)對數(shù)據(jù)庫的更新操作2.數(shù)據(jù)庫恢復(fù)UNDO:數(shù)據(jù)庫未被破壞,但某些數(shù)據(jù)不可靠,受到懷疑,只要撤銷所有不可靠的修改,把數(shù)據(jù)庫恢復(fù)到正確的狀態(tài)。

REDO:數(shù)據(jù)庫已被破壞,數(shù)據(jù)庫已不能用了,裝入最近一次拷貝的數(shù)據(jù)庫備份到新的磁盤,然后利用日志庫執(zhí)行“重做”處理,將這兩個(gè)數(shù)據(jù)庫狀態(tài)之間的所有更新重做一遍。

9.3.3故障類型和恢復(fù)方法一.事務(wù)故障某個(gè)事務(wù)在運(yùn)行過程中由于種種原因未運(yùn)行至正常終點(diǎn)(COMMIT或顯示ROLLBACK)就夭折了。常見原因:輸入數(shù)據(jù)有誤;運(yùn)算溢出;違反了某些完整性限制;某些應(yīng)用程序出錯(cuò);并行事務(wù)發(fā)生死鎖等。9.3.3故障類型和恢復(fù)方法例如:銀行轉(zhuǎn)賬事務(wù),這個(gè)事務(wù)把一筆金額從一個(gè)賬戶甲轉(zhuǎn)給另一個(gè)賬戶乙。

BEGINTRANSACTION

讀賬戶甲的余額BALANCE;

BALANCE=BALANCE-AMOUNT;(AMOUNT為轉(zhuǎn)賬金額)

寫回BALANCE;

IF(BALANCE<0)THEN{

打印'金額不足,不能轉(zhuǎn)賬';

ROLLBACK;(撤銷剛才的修改,恢復(fù)事務(wù))}ELSE{

讀賬戶乙的余額BALANCE1;

BALANCE1=BALANCE1+AMOUNT;寫回BALANCE1;

COMMIT;

}9.3.3故障類型和恢復(fù)方法事務(wù)內(nèi)部故障有的是可以通過事務(wù)程序本身發(fā)現(xiàn)的,但有些是非預(yù)期的,則不能由事務(wù)程序處理。發(fā)生事務(wù)故障時(shí),夭折的事務(wù)可能已把對數(shù)據(jù)庫的部分修改寫回磁盤。事務(wù)故障的恢復(fù):撤消事務(wù)(UNDO)在不影響其他事務(wù)運(yùn)行情況下,強(qiáng)行回滾該事務(wù),清除該事務(wù)對數(shù)據(jù)庫的所有修改,使得這個(gè)事務(wù)象根本沒有啟動(dòng)過一樣。事務(wù)故障的恢復(fù)由系統(tǒng)自動(dòng)完成,不需要用戶干預(yù)。9.3.3故障類型和恢復(fù)方法二.系統(tǒng)故障(軟故障)造成系統(tǒng)停止運(yùn)轉(zhuǎn)的任何事件,使得系統(tǒng)要重新啟動(dòng)。內(nèi)存中數(shù)據(jù)庫緩沖區(qū)的信息將全部丟失,而外部存儲(chǔ)設(shè)備上的數(shù)據(jù)不受影響,所有運(yùn)行事務(wù)非正常終止。常見原因:特定類型的硬件錯(cuò)誤(CPU故障);操作系統(tǒng)故障;DBMS代碼錯(cuò)誤;突然停電等。9.3.3故障類型和恢復(fù)方法

系統(tǒng)故障的恢復(fù):清除尚未完成的事務(wù)對數(shù)據(jù)庫的所有修改:系統(tǒng)重新啟動(dòng)時(shí),讓所有非正常終止的事務(wù)回滾,強(qiáng)行撤消(UNDO)所有未完成事務(wù);將緩沖區(qū)中已完成事務(wù)提交的結(jié)果寫入數(shù)據(jù)庫:系統(tǒng)重新啟動(dòng)時(shí),恢復(fù)程序需要重做(REDO)所有已提交的事務(wù),將數(shù)據(jù)庫恢復(fù)到一致狀態(tài)。9.3.3故障類型和恢復(fù)方法恢復(fù)步驟:1. 正向掃描日志文件(從前向后)Redo隊(duì)列:在故障發(fā)生前已經(jīng)提交的事務(wù)Undo隊(duì)列:在故障發(fā)生時(shí)尚未完成的事務(wù) 2.對Undo隊(duì)列事務(wù)進(jìn)行UNDO處理

反向掃描日志文件,對每個(gè)UNDO事務(wù)的更新操作執(zhí)行逆操作,將更新前的值入庫。

3.對Redo隊(duì)列事務(wù)進(jìn)行REDO處理

正向掃描日志文件,對每個(gè)REDO事務(wù)重新執(zhí)行登記的操作,將更新后的值入庫。9.3.3故障類型和恢復(fù)方法三.介質(zhì)故障(硬故障--破壞性最大)指外存故障,使存儲(chǔ)在外存中的數(shù)據(jù)部分丟失或全部丟失,并影響正在存取這部分?jǐn)?shù)據(jù)的所有事務(wù)。常見原因:磁盤損壞;磁頭碰撞;瞬時(shí)強(qiáng)磁干擾等。(1)重新轉(zhuǎn)儲(chǔ)后備副本到新的磁盤,使數(shù)據(jù)庫恢復(fù)到最近一次轉(zhuǎn)儲(chǔ)時(shí)的一致狀態(tài)。(2)在日志中找出轉(zhuǎn)儲(chǔ)以后所有已提交的事務(wù)。(3)對已提交的事務(wù)進(jìn)行REDO處理,將數(shù)據(jù)庫恢復(fù)到故障前某一時(shí)刻的一致狀態(tài)。利用數(shù)據(jù)庫備份恢復(fù)利用日志備份恢復(fù)備份即時(shí)點(diǎn)某事務(wù)即時(shí)點(diǎn)故障即時(shí)點(diǎn)9.3.3故障類型和恢復(fù)方法恢復(fù)步驟:注:介質(zhì)故障的恢復(fù)需要DBA介入一、恢復(fù)技術(shù)中的重要文件:日志文件?日志文件:用來記錄事務(wù)對數(shù)據(jù)庫的操作信息的文件。?日志文件的格式:(1)以記錄為單位的日志文件。(2)以數(shù)據(jù)塊為單位的日志文件。為保證事務(wù)的原子性,在執(zhí)行一個(gè)數(shù)據(jù)庫更新操作規(guī)程時(shí),可以首先把描述更新操作的信息寫入日志文件,而不修改數(shù)據(jù)庫本身。當(dāng)事務(wù)提交時(shí),再使用日志中更新操作信息實(shí)現(xiàn)數(shù)據(jù)庫的更新。?日志使用機(jī)制:補(bǔ)充:數(shù)據(jù)庫恢復(fù)實(shí)現(xiàn)技術(shù)1、常用的一些日志記錄格式T:事務(wù)名,執(zhí)行WRITE(Q)操作的事務(wù)。X:數(shù)據(jù)項(xiàng)名,Q的唯一名字。V1:原始值,Q在執(zhí)行WRITE(Q)之前的值。V2:新值,Q在執(zhí)行WRITE(Q)之后的值。(1)<T,start>:事務(wù)T已經(jīng)開始。(2)<T,X,V1,V2>:事務(wù)T在數(shù)據(jù)項(xiàng)X上執(zhí)行的寫操作。X在執(zhí)行寫操作之前的值為V1,執(zhí)行寫操作之后的值為V2。(3)<T,commit>:事務(wù)T已經(jīng)提交。注:為保證日志在系統(tǒng)和磁盤發(fā)生故障時(shí)仍可使用,必須將它存儲(chǔ)在永恒存儲(chǔ)器上。二、恢復(fù)技術(shù)1、推遲更新技術(shù)該事務(wù)對數(shù)據(jù)庫的所有更新操作記錄在日志中,把所有數(shù)據(jù)庫更新操作推遲到該事務(wù)提交時(shí)執(zhí)行。推遲更新協(xié)議:(1)每個(gè)事務(wù)在到達(dá)提交點(diǎn)之前不能更新數(shù)據(jù)庫。(2)在一個(gè)事務(wù)的所有更新操作對應(yīng)的日志記錄寫入永恒存儲(chǔ)器之前,該事務(wù)不能到達(dá)提交點(diǎn)。注:一事務(wù)到達(dá)提交時(shí),稱該事務(wù)進(jìn)入部分提交狀態(tài)。?推遲技術(shù)執(zhí)行事務(wù)T的過程:(1)T開始執(zhí)行,記錄<T,start>;(2)T發(fā)出WRITE(X)操作,記錄<T,X,V1,V2>;(3)T達(dá)部分提交狀態(tài)時(shí),記錄<T,commit>,并將日志中形如<T,X,V1,V2>的記錄,把數(shù)據(jù)庫中數(shù)據(jù)項(xiàng)X更新為新值V2。(4)數(shù)據(jù)庫真正的被事務(wù)T更新,T進(jìn)入提交狀態(tài)。?由于推遲更新技術(shù)僅需新值,所以可以簡化日志結(jié)構(gòu)為<T,X,V2>。實(shí)例:銀行數(shù)據(jù)庫系統(tǒng)中:事務(wù)T1:從賬號(hào)A向賬號(hào)B轉(zhuǎn)儲(chǔ)50元;事務(wù)T2:從賬號(hào)C支出100元。兩事務(wù)分別定義如下:T1:READ(A);T2:READ(C);A:=A-50;C:=C-100;WRITE(A);WRITE(C);READ(B);B:=B+50;WRITE(B);返回

設(shè)A,B和C的初值分別是1000元、2000元和700元。且T1與T2按串行調(diào)度<T1,T2>日志中所包含的有關(guān)T1、T2的信息如下:<T1,START><T2,START><T1,A,950><T2,C,600><T1,B,2050><T2,COMMIT><T1,commit>說明:?數(shù)據(jù)庫中A、B值僅有在<T1,COMMIT>寫入日志后才能被更改。?數(shù)據(jù)庫中C值僅有在<T2,COMMIT>寫入日志后才能被更改。?日志與數(shù)據(jù)庫變化過程實(shí)例:日志記錄數(shù)據(jù)庫<T1,START>

<T1,A,950><T1,B,2050><T1,COMMIT>A=950B=2050<T2,START><T2,C,600><T2,COMMIT>C=600?針對推遲更新技術(shù)DBMS所采用的恢復(fù)機(jī)制:(故障發(fā)生后,確定需要重做的事務(wù)T)REDO(T):FOR日志中每個(gè)形如(T,X,V)的記錄DO

把數(shù)據(jù)庫中數(shù)據(jù)項(xiàng)X的值改為V;ENDFOR注:REDO操作必須是冪等的,即執(zhí)行多次和執(zhí)行一次的效果相同。故障實(shí)例1:設(shè)故障恰好發(fā)生在T1的WRITE(B)操作信息被寫入日志之后。日志內(nèi)容如下:

T1T2<T1,start><T1,A,950><T1,B,2050>數(shù)據(jù)庫中A、B值未改變。數(shù)據(jù)庫恢復(fù)機(jī)制:不采取任何恢復(fù)行動(dòng)。結(jié)果:A=1000,B=2000,C=700。時(shí)間故障實(shí)例2:設(shè)故障恰好發(fā)生在T2的WRITE(C)操作之后。日志內(nèi)容如下:

T1T2<T1,start><T1,A,950><T1,B,2050><T1,commit><T2,start><T2,C,600>數(shù)據(jù)庫中A、B值已改變,C值未改變。數(shù)據(jù)庫恢復(fù)機(jī)制:需要執(zhí)行REDO(T1)。結(jié)果:A=950,B=2050,C=700。時(shí)間故障實(shí)例3:設(shè)故障恰好發(fā)生在<T2,commit>之后。日志內(nèi)容如下:

T1T2<T1,start><T1,A,950><T1,B,2050><T1,commit><T2,start><T2,C,600><T2,commit>數(shù)據(jù)庫中A、B、C值已改變。數(shù)據(jù)庫恢復(fù)機(jī)制:需要執(zhí)行REDO(T1),REDO(T2)。結(jié)果:A=950,B=2050,C=600。時(shí)間2、即時(shí)更新技術(shù)?非提交更新:處于活動(dòng)狀態(tài)的事務(wù)直接在數(shù)據(jù)庫上實(shí)施的更新。?即時(shí)更新協(xié)議:(1)在所有<T,X,V1,V2>型日志記錄安全地存儲(chǔ)到永恒存儲(chǔ)器之前,事務(wù)T不能更新數(shù)據(jù)庫。(2)在所有<T,X,V1,V2>型日志記錄安全地存儲(chǔ)到永恒存儲(chǔ)器之前,不允許事務(wù)T提交。即時(shí)更新技術(shù)運(yùn)行事務(wù)T的過程:(1)T開始執(zhí)行時(shí),記錄<T,start>。(2)T發(fā)出WRITE(X)操作,在日志中記錄<T,X,V1,V2>,再直接在數(shù)據(jù)庫上執(zhí)行WRITE(X)。(3)T達(dá)部分提交狀態(tài)時(shí),記錄<T,commit>。(4)數(shù)據(jù)庫真正的被事務(wù)T更新,T進(jìn)入提交狀態(tài)。T1和T2同前實(shí)例。日志中所包含的有關(guān)T1、T2的信息如下:<T1,START><T2,START><T1,A,1000,950><T2,C,700,600><T1,B,2000,2050><T2,COMMIT><T1,commit>?日志與數(shù)據(jù)庫變化過程實(shí)例:日志記錄數(shù)據(jù)庫<T1,START>

<T1,A,1000,950>A=950<T1,B,2000,2050>B=2050

<T1,COMMIT><T2,START><T2,C,700,600>

C=600<T2,COMMIT>

?針對即時(shí)更新技術(shù)DBMS所采用的恢復(fù)機(jī)制:UNDO(T):FOR日志中每個(gè)形如(T,X,V1,V2)的記錄DO

把數(shù)據(jù)庫中數(shù)據(jù)項(xiàng)X的值改為V1;ENDFORREDO(T):FOR日志中每個(gè)形如(T,X,V1,V2)的記錄DO

把數(shù)據(jù)庫中數(shù)據(jù)項(xiàng)X的值改為V2;ENDFOR注:UNDO、REDO操作必須是冪等的,即執(zhí)行多次和執(zhí)行一次的效果相同。?數(shù)據(jù)庫恢復(fù)過程:(1)從后向前掃描日志記錄,建立兩個(gè)事務(wù)表:提交事務(wù)表:含日志中有<Ti,commit>的所有事務(wù)Ti。未提交事務(wù)表:含日志中具有<Ti,start>,但不具有<Ti,commit>的所有事務(wù)Ti。(2)對提交事務(wù)表中的每個(gè)事務(wù)執(zhí)行READO(T)。(3)對未提交事務(wù)表中的每個(gè)事務(wù)執(zhí)行UNDO(T),從日志刪除T信息。故障實(shí)例1:設(shè)故障恰好發(fā)生在T1的WRITE(B)操作信息被寫入日志之后。日志內(nèi)容如下:

T1<T1,start><T1,A,1000,950><T1,B,2000,2050>數(shù)據(jù)庫中A、B值已改變。數(shù)據(jù)庫恢復(fù)機(jī)制:因?yàn)門1未真正提交,所以UNDO(T1),A、B被恢復(fù)A=1000,B=2000。時(shí)間故障實(shí)例2:設(shè)故障恰好發(fā)生在T2的WRITE(C)操作寫入日志之后。日志內(nèi)容如下:

T1T2<T1,start><T1,A,1000,950><T1,B,2000,2050>

<T1,commit><T2,start><T2,C,700,600>數(shù)據(jù)庫中A、B、C值已改變。數(shù)據(jù)庫恢復(fù)機(jī)制:因?yàn)門1已提交、T2未提交,要執(zhí)行UNDO(T2)、REDO(T1)。結(jié)果:A=950,B=2050,C=700。注:UNDO(T2)須先執(zhí)行。時(shí)間故障實(shí)例3:設(shè)故障恰好發(fā)生在<T2,commit>之后。日志內(nèi)容如下:

T1T2<T1,start><T1,A,1000,950><T1,B,2000,2050>

<T1,commit><T2,start><T2,C,700,600><T2,commit>數(shù)據(jù)庫中A、B、C值已改變。數(shù)據(jù)庫恢復(fù)機(jī)制:因?yàn)門1、T2都已提交,需要執(zhí)行REDO(T1),REDO(T2)。結(jié)果:A=950,B=2050,C=600。時(shí)間3、其它恢復(fù)技術(shù)及輔助技術(shù):1>緩沖技術(shù)(輔助作用)(1)日志緩沖技術(shù)目的:成批地向永恒存儲(chǔ)器輸出日志記錄,減少I/O操作,提高效率。(2)數(shù)據(jù)庫緩沖技術(shù)2>檢測點(diǎn)技術(shù)(輔助作用)?原數(shù)據(jù)庫恢復(fù)技術(shù)存在問題:(1)搜索日志耗時(shí)長。(2)重復(fù)執(zhí)行了已成功的REDO操作。

解決辦法:增加檢測點(diǎn)法在日志中增加一類新記錄:<checkpoint>,數(shù)據(jù)庫恢復(fù)機(jī)制定期執(zhí)行如下操作,建立檢測點(diǎn):1)將當(dāng)前緩存中所有日志記錄輸出到永恒存儲(chǔ)器2)將所有緩沖區(qū)中被修改的數(shù)據(jù)塊寫入磁盤3)將日志記錄<checkpoint>寫入永恒存儲(chǔ)器?使用檢測點(diǎn)法對數(shù)據(jù)庫恢復(fù)技術(shù)的改進(jìn):

在<checkpoint>之前的事務(wù)都已經(jīng)提交,僅需對最近建立的檢測點(diǎn)之后開始執(zhí)行或處于活動(dòng)狀態(tài)的事務(wù)進(jìn)REDO或UNDO操作。9.4SQLServer數(shù)據(jù)庫備份與恢復(fù)--要備份的數(shù)據(jù)庫名->右擊“任務(wù)”-->單擊“備份”,如圖:

完整備份

包含數(shù)據(jù)庫中全部數(shù)據(jù)和日志文件信息,也稱為是全庫備份或者海量備份。

優(yōu)點(diǎn):恢復(fù)操作簡便,只需要將最近一次的備份恢復(fù)。缺點(diǎn):完全備份所占的存儲(chǔ)空間很大且備份的時(shí)間較長。9.4.1數(shù)據(jù)庫備份方法BACKUPDATABASEdatabase_nameTO{DISK|TAPE}='physical_backup_device_name'例1:在某一個(gè)時(shí)間點(diǎn),對數(shù)據(jù)庫Sample做一個(gè)完全備份,備份到文件D:\backup\Sample_full.bak:

BACKUPDATABASESampleTODISK=’D:\backup\Sample_full.bak’

差異備份只記錄自上次數(shù)據(jù)庫備份后發(fā)生更改的數(shù)據(jù)。優(yōu)點(diǎn):比完整備份小且備份速度快,主要用于使用頻繁的系統(tǒng),可以經(jīng)常地備份,將減少丟失數(shù)據(jù)的危險(xiǎn)。缺點(diǎn):需要使用完整備份和差異備份一起來進(jìn)行恢復(fù)。注意:使用差異數(shù)據(jù)庫備份將數(shù)據(jù)庫還原到差異數(shù)據(jù)庫備份完成時(shí)的那一點(diǎn)。若要恢復(fù)到精確的故障點(diǎn),必須使用事務(wù)日志備份。9.4.1數(shù)據(jù)庫備份方法BACKUPDATABASEdatabase_nameTO{DISK|TAPE}='physical_backup_device_name'WITHDIFFERENTIAL例2:若干時(shí)間過去了,Sample數(shù)據(jù)庫的內(nèi)容發(fā)生一些變化,需要做一個(gè)差異備份:

BACKUPDATABASESampleTODISK=’D:\backup\Sample_1.bak’WITHDIFFERENTIAL9.4.1數(shù)據(jù)庫備份方法建議在執(zhí)行差異數(shù)據(jù)庫備份時(shí)使用如下過程:創(chuàng)建定期的完整數(shù)據(jù)庫備份。在每個(gè)完整數(shù)據(jù)庫備份之間定期創(chuàng)建差異數(shù)據(jù)庫備份。如果使用完全恢復(fù)模型或大容量日志記錄恢復(fù)模型,則創(chuàng)建事務(wù)日志備份的頻率比差異數(shù)據(jù)庫備份大。

還原差異數(shù)據(jù)庫備份的順序?yàn)椋哼€原最新的數(shù)據(jù)庫備份。還原到最后一次的差異數(shù)據(jù)庫備份。如果使用完全恢復(fù)或大容量日志記錄恢復(fù),則應(yīng)用自上次創(chuàng)建差異數(shù)據(jù)庫備份后創(chuàng)建的所有事務(wù)日志備份。

日志文件備份當(dāng)數(shù)據(jù)庫信息更改時(shí),其更新操作將記入日志文件,將這部分操作信息進(jìn)行備份??偅喝罩緜浞荼韧暾麄浞菔褂玫馁Y源少,可以使用事務(wù)日志備份將數(shù)據(jù)庫恢復(fù)到特定的即時(shí)點(diǎn)或恢復(fù)到故障點(diǎn)。9.4.1數(shù)據(jù)庫備份方法BACKUPLOG{database_name|@database_name_var}TO{DISK|TAPE}='physical_backup_device_name‘例3:再過了若干時(shí)間,下列命令將數(shù)據(jù)庫Sample的日志備份到D:\backup\Sample_log.bak:

BACKUPLOGSampleTODISK=’D:\backup\Sample_lo

溫馨提示

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

評(píng)論

0/150

提交評(píng)論