《數(shù)據(jù)庫原理及應(yīng)用 》課件ch7_第1頁
《數(shù)據(jù)庫原理及應(yīng)用 》課件ch7_第2頁
《數(shù)據(jù)庫原理及應(yīng)用 》課件ch7_第3頁
《數(shù)據(jù)庫原理及應(yīng)用 》課件ch7_第4頁
《數(shù)據(jù)庫原理及應(yīng)用 》課件ch7_第5頁
已閱讀5頁,還剩187頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章數(shù)據(jù)庫管理本章主要內(nèi)容在本章,我們先討論事務(wù)概念和基本性質(zhì),然后再使用事務(wù)處理的概念和技術(shù)研究數(shù)據(jù)庫恢復(fù)技術(shù)及SQLServer數(shù)據(jù)恢復(fù)技術(shù)和數(shù)據(jù)庫的并發(fā)控制及SQLServer的并發(fā)控制,最后討論了數(shù)據(jù)庫的安全性和完整性以及SQLServer的安全性管理和SQLServer的完整性策略。

本章學(xué)習(xí)目標(biāo)理解并掌握數(shù)據(jù)庫恢復(fù)技術(shù)熟練掌握并發(fā)控制理解數(shù)據(jù)庫的安全性掌握數(shù)據(jù)庫的完整性7.1數(shù)據(jù)庫管理概述數(shù)據(jù)庫管理(DatabaseAdministration)是有關(guān)建立、存儲、修改和存取數(shù)據(jù)庫中信息的技術(shù),是指為保證數(shù)據(jù)庫系統(tǒng)的正常運(yùn)行和服務(wù)質(zhì)量,有關(guān)人員須進(jìn)行的技術(shù)管理工作。負(fù)責(zé)這些技術(shù)管理工作的個人或集體稱為數(shù)據(jù)庫管理員(DBA)。數(shù)據(jù)庫管理的主要內(nèi)容有:數(shù)據(jù)庫的建立、數(shù)據(jù)庫的調(diào)整、數(shù)據(jù)庫的重組、數(shù)據(jù)庫的重構(gòu)、數(shù)據(jù)庫的安全控制、數(shù)據(jù)的完整性控制和對用戶提供技術(shù)支持。在數(shù)據(jù)庫系統(tǒng)正確有效運(yùn)行的過程中,一個很重要的問題就是如何保障數(shù)據(jù)庫的一致性,這就需要DBMS對數(shù)據(jù)庫的各種操作進(jìn)行監(jiān)控,因此引入一個在邏輯上“最小”的操作單位以便有效地完成這種監(jiān)控是是十分必要地,這就引入事物概念的必要背景。有了事物概念,對數(shù)據(jù)庫操作的監(jiān)控就是對數(shù)據(jù)庫事務(wù)的管理。數(shù)據(jù)庫事務(wù)管理的目標(biāo)是保證數(shù)據(jù)一致性。事務(wù)的并發(fā)操作會引起修改丟失、讀“臟”數(shù)據(jù)和不可重復(fù)讀等基本問題;數(shù)據(jù)庫故障會引起數(shù)據(jù)的破壞與損失等嚴(yán)重后果。所有這些都將破壞數(shù)據(jù)庫的一致性,因此,事務(wù)并發(fā)控制和數(shù)據(jù)庫故障恢復(fù)就是數(shù)據(jù)庫事務(wù)管理中兩項基本課題。

數(shù)據(jù)庫的安全性和完整性也屬于數(shù)據(jù)庫管理的范疇,一般而言,數(shù)據(jù)庫安全性是保護(hù)數(shù)據(jù)庫以防止非法用戶惡意造成的破壞,數(shù)據(jù)庫完整性則是保護(hù)數(shù)據(jù)庫以防止合法用戶無意中造成的破壞。也就是說,安全性是確保用戶被限制在其想做的事情的范圍之內(nèi),完整性則是確保用戶所做的事情是正確的。安全性措施的防泛對象是非法用戶的進(jìn)入和合法用戶的非法操作,完整性措施的防范對象是不合語義的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。在本章,我們先討論事務(wù)概念和基本性質(zhì),然后研究數(shù)據(jù)庫的并發(fā)控制與數(shù)據(jù)庫故障恢復(fù),最后討論數(shù)據(jù)庫的安全性和完整性。7.2數(shù)據(jù)庫恢復(fù)技術(shù)本節(jié)講解數(shù)據(jù)庫恢復(fù)技術(shù),包括數(shù)據(jù)庫運(yùn)行中可能發(fā)生的故障類型,數(shù)據(jù)庫恢復(fù)中最經(jīng)常使用的技術(shù)——數(shù)據(jù)轉(zhuǎn)儲和登錄日志文件。講解日志文件的內(nèi)容及作用,登記日志文件所要遵循的原則,針對事務(wù)故障、系統(tǒng)故障和介質(zhì)故障等不同故障的恢復(fù)策略和恢復(fù)方法。具有檢查點(diǎn)的恢復(fù)技術(shù)。數(shù)據(jù)庫鏡像功能。在討論數(shù)據(jù)庫恢復(fù)技術(shù)之前先講解事物的基本概念和事物的性質(zhì)。1.事務(wù)(Transaction)的概念1)事務(wù)的基本概念是用戶定義的一個操作序列,這些操作要么全做,要么全不做,是一個不可分割的工作單位。數(shù)據(jù)庫事務(wù)是指作為單個邏輯工作單元執(zhí)行的一系列操作。設(shè)想網(wǎng)上書店系統(tǒng)中購書的一次交易,其付款過程至少包括以下幾步數(shù)據(jù)庫操作:更新用戶所購圖書的庫存信息保存用戶付款信息,可能包括與銀行系統(tǒng)的交互生成訂單并且保存到數(shù)據(jù)庫中更新用戶相關(guān)信息,例如購書數(shù)量等等正常的情況下,這些操作將順利進(jìn)行,最終交易成功,與交易相關(guān)的所有數(shù)據(jù)庫信息也成功地更新。但是,如果在這一系列過程中任何一個環(huán)節(jié)出了差錯,例如在更新圖書庫存信息時發(fā)生異常、該顧客銀行帳戶存款不足等,都將導(dǎo)致交易失敗。一旦交易失敗,數(shù)據(jù)庫中所有信息都必須保持交易前的狀態(tài)不變,比如最后一步更新用戶信息時失敗而導(dǎo)致交易失敗,那么必須保證這筆失敗的交易不影響數(shù)據(jù)庫的狀態(tài)——庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。否則,數(shù)據(jù)庫的信息將會一片混亂而不可預(yù)測。數(shù)據(jù)庫事務(wù)正是用來保證這種情況下交易的平穩(wěn)性和可預(yù)測性的技術(shù)。下面再看一個例子:網(wǎng)上書店系統(tǒng)銀行轉(zhuǎn)賬,事務(wù)T從A賬戶過戶到B賬戶100元。Read(A);A:=A-100;Write(A);Read(B);B:=B+100;Write(B);Read(X):從數(shù)據(jù)庫傳遞數(shù)據(jù)項X到事物的工作區(qū)中。Write(X):從事物的工作區(qū)中待數(shù)據(jù)項X寫回數(shù)據(jù)庫。按照事物的定義,這兩個操作要么都執(zhí)行成功,要么都不執(zhí)行。2)SQL中事物的定義在SQL語言中,定義事務(wù)的語句有一下三條:BeginTransactionCommitRollback

事務(wù)通常是以BeginTransaction開始,以Commit或Rollback結(jié)束。Commit表示提交,即提交事務(wù)的所有操作。具體地說就是將事務(wù)中所有對數(shù)據(jù)庫的更新寫回到磁盤上的物理數(shù)據(jù)庫中去,事務(wù)正常結(jié)束。Rollback表示回滾,即在事務(wù)運(yùn)行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)執(zhí)行,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有已完成的操作全部撤消,滾回到事務(wù)開始時的狀態(tài)。這里的操作指對數(shù)據(jù)庫的更新操作。例如:定義一個簡單的事物。BeginTransactionUse圖書表GoUpdate圖書表Set圖書價格=圖書價格*1.1Where圖書類型編碼=01GoDeleteFrom圖書表Where圖書編號=9787040084894CommitTransactionGo從BeginTransaction到CommitTransaction只有兩個操作,按照事物的定義,這兩個操作要么都執(zhí)行成功,要么都不執(zhí)行。2.事務(wù)的特性事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會永久更新面向數(shù)據(jù)的資源。通過將一組相關(guān)操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復(fù)并使應(yīng)用程序更加可靠。一個邏輯工作單元要成為事務(wù),必須滿足所謂的事務(wù)的四個特性:即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability)。這個四個特性也簡稱為ACID特性。1)原子性事務(wù)必須是原子工作單元,對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。通常,與某個事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個子集,則可能會破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)處理操作子集的可能性。2)一致性事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。因此當(dāng)數(shù)據(jù)庫只包含成功事務(wù)提交的結(jié)果時,就說數(shù)據(jù)庫處于一致性狀態(tài)。如果數(shù)據(jù)庫系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有已完成的操作全部撤消,滾回到事務(wù)開始時的一致狀態(tài)。例如上面提到的某公司銀行中有A,B兩個賬號,現(xiàn)在公司想從賬號A中取出100元,存入賬號B。那么就可以定義一個事物,該事物包括兩個操作,第一個操作是從賬號A中減去100元,第二個操作是向賬號B中加入100元。這兩個操作要么全做,要么全不做。全做或者全不做,數(shù)據(jù)庫都處于一致性狀態(tài)。如果只做一個操作則用戶邏輯上就會發(fā)生錯誤,少了100元,這時數(shù)據(jù)庫處于不一致狀態(tài)??墒且恢滦耘c原子性是密切相關(guān)的。3)隔離性一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。例如,對任何一對是事物T1和T2,在T1看來,T2要么在T1開始之前已經(jīng)結(jié)束,要么在T1完成之后再開始執(zhí)行。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。4)持續(xù)性持續(xù)性也稱永久性(Permanence),一個事物一旦提交之后,不管DBMS發(fā)生什么故障,該事物對數(shù)據(jù)庫的所有更新操作都會永遠(yuǎn)保留在數(shù)據(jù)庫中,不會丟失。事務(wù)是恢復(fù)和并發(fā)控制的基本單位。保證事務(wù)ACID特性是事務(wù)處理的重要任務(wù)。事務(wù)ACID特性可能遭到破壞的因素有:(1)多個事務(wù)并行運(yùn)行時,不同事務(wù)的操作交叉執(zhí)行。(2)事務(wù)在運(yùn)行過程中被強(qiáng)行停止。在第一種情況下,數(shù)據(jù)庫管理系統(tǒng)必須保證多個事務(wù)的交叉運(yùn)行不影響這些事務(wù)的原子性。在第二種情況下,數(shù)據(jù)庫管理系統(tǒng)必須保證被強(qiáng)行終止的事務(wù)對數(shù)據(jù)庫和其它事務(wù)沒有任何影響。這些就是數(shù)據(jù)庫管理系統(tǒng)中恢復(fù)機(jī)制和并發(fā)機(jī)制的責(zé)任。7.2.1數(shù)據(jù)庫恢復(fù)基本概念

當(dāng)前計算機(jī)硬、軟件技術(shù)已經(jīng)發(fā)展到相當(dāng)高的水平,人們采取了各種保護(hù)措施來防止數(shù)據(jù)庫的安全性和完整性被破壞,保證并行事務(wù)的正確執(zhí)行。但計算機(jī)系統(tǒng)中硬件的故障、系統(tǒng)軟件和應(yīng)用軟件的錯誤、操作員的失誤以及惡意的破壞仍然是不可避免的。這些故障輕則造成運(yùn)行事務(wù)非正常中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分?jǐn)?shù)據(jù)丟失。因此數(shù)據(jù)庫管理系統(tǒng)必須具有把數(shù)據(jù)全部從錯誤狀態(tài)恢復(fù)到某一已知的正確狀態(tài)(亦稱為完整狀態(tài)或一致狀態(tài))的功能,這就是數(shù)據(jù)庫的恢復(fù)?;謴?fù)子系統(tǒng)是數(shù)據(jù)庫管理系統(tǒng)的一個重要組成部分,而且還相當(dāng)龐大,常常占整個系統(tǒng)代碼的百分之十以上。故障恢復(fù)是否考慮周到和行之有效,是數(shù)據(jù)庫系統(tǒng)性能的一個重要指標(biāo)。事務(wù)是數(shù)據(jù)庫的基本工作單位。一個事務(wù)中包含的操作要么全部完成,要么全部不做,二者必居其一。如果數(shù)據(jù)庫中只包含成功事務(wù)提交的結(jié)果,就說此數(shù)據(jù)庫處于一致性狀態(tài)。保證數(shù)據(jù)一致性是對數(shù)據(jù)庫的最基本要求。如果數(shù)據(jù)庫系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫。這時數(shù)據(jù)庫就處于一種不正確的狀態(tài),或者說是不一致狀態(tài),就需要DBMS(數(shù)據(jù)庫管理系統(tǒng))的恢復(fù)子系統(tǒng)根據(jù)故障類型采取相應(yīng)的措施,將數(shù)據(jù)庫恢復(fù)到某種一致狀態(tài)。數(shù)據(jù)庫系統(tǒng)中可能發(fā)生各種各樣的故障,大致可以分為以下幾類:1、事務(wù)故障(TaskCrash)事務(wù)內(nèi)部故障有些是預(yù)期性的,可通過事務(wù)程序本身發(fā)現(xiàn),并讓事務(wù)滾回,撤消錯誤的修改,恢復(fù)數(shù)據(jù)庫到正確狀態(tài)。但更多的故障是非預(yù)期的,如輸入數(shù)據(jù)的錯誤、運(yùn)算溢出、違反了某些完整性限制。某些應(yīng)用程序的錯誤以及并行事務(wù)發(fā)生死鎖等,使事務(wù)未運(yùn)行至正常終點(diǎn)就夭折了。這類故障稱事務(wù)故障。事務(wù)故障意味著事務(wù)沒有達(dá)到預(yù)期的終點(diǎn)((Commit或者顯示Rollback),因此數(shù)據(jù)庫可能處于不正確狀態(tài),系統(tǒng)就要強(qiáng)行滾回此事務(wù),即撤消該事務(wù)已經(jīng)作出的任何對數(shù)據(jù)庫的修改,使得該事務(wù)好像根本沒有啟動一樣。2、系統(tǒng)范圍的故障(軟故障,SoftCrash)系統(tǒng)在運(yùn)行過程中,由于某種原因,如操作系統(tǒng)或DBMS代碼錯誤、操作員操作失誤、特定類型的硬件錯誤(如CPU故障)、突然停電等造成系統(tǒng)停止運(yùn)行,致使所有正在運(yùn)行的事務(wù)都以非正常方式終止。這時內(nèi)存中數(shù)據(jù)庫緩沖區(qū)的信息全部丟失,但存儲在外部存儲設(shè)備上的數(shù)據(jù)未受影響,此類型為系統(tǒng)故障。發(fā)生系統(tǒng)故障時,一些尚未完成的事務(wù)的結(jié)果可能已送入物理數(shù)據(jù)庫,為保證數(shù)據(jù)的一致性,需要清除這些事務(wù)對數(shù)據(jù)庫的所有修改。但由于無法確定究竟哪些事務(wù)已更新過數(shù)據(jù)庫,因此系統(tǒng)重新啟動后,恢復(fù)程序要強(qiáng)行撤銷(Undo)所有未完成事務(wù),使這些事務(wù)像沒有運(yùn)行過一樣。另一方面,發(fā)生系統(tǒng)故障時,有些已完成事務(wù)提交的結(jié)果可能還有一部分甚至全部留在緩沖區(qū),尚未寫回到磁盤上的物理數(shù)據(jù)庫中,系統(tǒng)故障使得這些事務(wù)對數(shù)據(jù)庫中的修改部分或全部丟失,這也會使數(shù)據(jù)庫處于不一致狀態(tài),因此應(yīng)將這些事務(wù)已提交的結(jié)果重新寫入數(shù)據(jù)庫。同樣,由于無法確定哪些事務(wù)的提交結(jié)果尚未寫入物理數(shù)據(jù)庫,所以系統(tǒng)重新啟動后,恢復(fù)程序除需要撤銷所有未完成事務(wù)外,還需要重做(Redo)所有已提交的事務(wù),以將數(shù)據(jù)庫真正恢復(fù)到一致狀態(tài)。

3、介質(zhì)故障(硬故障,HardCrash)硬故障指外存故障,如磁盤損壞、磁頭碰撞或操作系統(tǒng)的某種潛在錯誤,瞬時強(qiáng)磁場干擾等,使存儲在外存中的數(shù)據(jù)部分丟失或全部丟失。這類故障比前兩類故障的可能性小得多,但破壞性最大。發(fā)生介質(zhì)故障后,這時需要裝入數(shù)據(jù)庫發(fā)生介質(zhì)故障前某個時刻的數(shù)據(jù)副本,并重做自此時始的所有成功事務(wù),將這些事務(wù)已提交的結(jié)果重新記入數(shù)據(jù)庫。4、計算機(jī)病毒計算機(jī)病毒已成為計算機(jī)系統(tǒng)的主要威脅,自然也是數(shù)據(jù)庫系統(tǒng)的主要威脅,為此計算機(jī)安全工作者已研制了許多預(yù)防病毒的“疫苗”,檢查、診斷、消滅計算機(jī)病毒的軟件也在不斷發(fā)展,但至今還沒有一種使得計算機(jī)“終生”免疫的疫苗,因此數(shù)據(jù)庫一旦被破壞仍要用恢復(fù)技術(shù)把數(shù)據(jù)庫加以恢復(fù)??偨Y(jié)各類故障,對數(shù)據(jù)庫的影響存在兩種可能:一是數(shù)據(jù)庫本身被破壞,二是數(shù)據(jù)庫沒有被破壞,但數(shù)據(jù)可能不正確,這是因為事務(wù)的運(yùn)行被中止而造成的?;謴?fù)的基本原理十分簡單,可用一個詞來概括,即冗余。這就是說,數(shù)據(jù)庫中的任何一部分的數(shù)據(jù)都可以根據(jù)存儲在別處的冗余數(shù)據(jù)來重建。盡管恢復(fù)的基本原理很簡單,但實現(xiàn)技術(shù)的細(xì)節(jié)卻相當(dāng)復(fù)雜。7.2.2恢復(fù)實現(xiàn)技術(shù)

恢復(fù)就是利用存儲在系統(tǒng)其他地方的冗余數(shù)據(jù)來重建數(shù)據(jù)庫中被破壞的或不正確的數(shù)據(jù)。因此恢復(fù)機(jī)制涉及的兩個關(guān)鍵問題是:第一,如何建立冗余數(shù)據(jù);第二,如何利用這些冗余數(shù)據(jù)實施數(shù)據(jù)庫恢復(fù)。在實現(xiàn)恢復(fù)功能時,主要有以下方面技術(shù):1、數(shù)據(jù)轉(zhuǎn)儲

轉(zhuǎn)儲是數(shù)據(jù)庫恢復(fù)中采用的基本技術(shù),即DBA(數(shù)據(jù)庫管理員)定期地將整個數(shù)據(jù)庫復(fù)制到磁帶或另一個磁盤上保存起來的過程。這些備用的數(shù)據(jù)文本稱為后備副本或后援副本。當(dāng)數(shù)據(jù)庫遭到破壞后就可以利用后備副本把數(shù)據(jù)庫恢復(fù)。這時,數(shù)據(jù)庫只能恢復(fù)到轉(zhuǎn)儲時的狀態(tài),從那以后的所有更新事務(wù)必須重新運(yùn)行才能恢復(fù)到故障時的狀態(tài)。如圖7.1所示。

圖7.1轉(zhuǎn)儲和恢復(fù)數(shù)據(jù)轉(zhuǎn)儲按操作可分為靜態(tài)轉(zhuǎn)儲和動態(tài)轉(zhuǎn)儲,按方式可分為海量轉(zhuǎn)儲和增量轉(zhuǎn)儲。其定義、優(yōu)點(diǎn)、缺點(diǎn)分別如表7.1所示。表7.1數(shù)據(jù)轉(zhuǎn)儲分類類別定義優(yōu)點(diǎn)缺點(diǎn)靜態(tài)轉(zhuǎn)儲在系統(tǒng)中無運(yùn)行事務(wù)時的操作,在轉(zhuǎn)儲期間不允許(或不存在)對數(shù)據(jù)庫的任何存取、修改活動。簡單轉(zhuǎn)儲必須等待用戶事務(wù)結(jié)束才能進(jìn)行,而新的事務(wù)必須等待轉(zhuǎn)儲結(jié)束才能執(zhí)行,因此會降低數(shù)據(jù)庫的可用性。動態(tài)轉(zhuǎn)儲轉(zhuǎn)儲操作與用戶事務(wù)并發(fā)進(jìn)行,轉(zhuǎn)儲期間允許對數(shù)據(jù)庫進(jìn)行存取或修改??朔o態(tài)轉(zhuǎn)儲的缺點(diǎn),不用等待正在運(yùn)行的用戶事務(wù)結(jié)束,也不影響新事務(wù)的運(yùn)行。不能保證副本中的數(shù)據(jù)正確有效。海量轉(zhuǎn)儲每次轉(zhuǎn)儲全部數(shù)據(jù)庫。恢復(fù)時方便簡單。大數(shù)據(jù)庫及頻繁的事務(wù)處理費(fèi)時、復(fù)雜。增量轉(zhuǎn)儲只轉(zhuǎn)儲上次轉(zhuǎn)儲后更新過的數(shù)據(jù)。對于大量數(shù)據(jù)庫及頻繁的事務(wù)處理快速有效。不能保證所有的數(shù)據(jù)正確有效。直觀地看,后備副本越接近故障發(fā)生點(diǎn),恢復(fù)起來越方便、越省時。這也就是說,從恢復(fù)方便角度看,應(yīng)經(jīng)常進(jìn)行數(shù)據(jù)轉(zhuǎn)儲,制作后備副本。但另一方面,轉(zhuǎn)儲又是十分耗費(fèi)時間和資源的,不能頻繁進(jìn)行。所以DBA應(yīng)該根據(jù)數(shù)據(jù)庫使用情況確定適當(dāng)?shù)霓D(zhuǎn)儲周期和轉(zhuǎn)儲方法。例如,每晚進(jìn)行動態(tài)增量轉(zhuǎn)儲,每周進(jìn)行一次動態(tài)海量轉(zhuǎn)儲,每月進(jìn)行一次靜態(tài)海量轉(zhuǎn)儲。2、登記日志文件日志文件是用來記錄對數(shù)據(jù)庫每一次更新活動的文件。在動態(tài)轉(zhuǎn)儲方式中必須建立日志文件后援副本和日志文件綜合起來才能有效地恢復(fù)數(shù)據(jù)庫。在靜態(tài)轉(zhuǎn)儲方式中,也可以建立日志文件當(dāng)數(shù)據(jù)庫毀壞后可重新裝入后援副本,把數(shù)據(jù)庫恢復(fù)到轉(zhuǎn)儲結(jié)束時刻的正確狀態(tài),然后利用日志文件,把已完成的事務(wù)進(jìn)行重做(Redo)處理,對故障發(fā)生時尚未完成的事務(wù)進(jìn)行撤消處理(Undo),這樣不必重新運(yùn)行那些已完成的事務(wù)程序,就可把數(shù)據(jù)庫恢復(fù)到故障前某一時刻的正確狀態(tài),如圖7.2所示。圖7.2利用日志文件恢復(fù)不同的數(shù)據(jù)庫系統(tǒng)采用的日志文件格式并不完全一樣,主要有以記錄為單位和以數(shù)據(jù)塊為單位的日志文件。對于以記錄為單位的日志文件,日志文件中需登記內(nèi)容包括:(1)事務(wù)標(biāo)識;(2)事務(wù)開始標(biāo)記(BeginTransaction)和結(jié)束標(biāo)記(Commit或Rollback);(3)操作的類型(插入、刪除或修改);(4)操作對象;(5)更新前數(shù)據(jù)的舊值(對插入操作,此項為空值);(6)更新后數(shù)據(jù)的新值(對刪除操作而言,此項為空值)。為保證數(shù)據(jù)庫是可恢復(fù)的,登記日志文件必須遵循兩條原則:(1)登記的次序嚴(yán)格按并行事務(wù)執(zhí)行的時間次序。(2)必須先寫日志文件,后寫數(shù)據(jù)庫。利用日志文件恢復(fù)事務(wù)的過程分為二步:第一步:從頭掃描日志文件,找出哪些事務(wù)在故障發(fā)生時已經(jīng)結(jié)束(這些事務(wù)有BeginTransaction和Commit記錄),哪些事務(wù)尚未結(jié)束(這些事務(wù)只有BeginTransaction記錄,無Commit記錄)。第二步:對尚未結(jié)束的事務(wù)進(jìn)行撤消(Undo)處理,即反向掃描日志文件,對每個Undo事務(wù)的更新操作執(zhí)行反操作。對已經(jīng)插入的新記錄進(jìn)行刪除操作,對已刪除的記錄重新插入,對修改的數(shù)據(jù)恢復(fù)舊值(用舊值代替新值),對已經(jīng)結(jié)束的事務(wù)進(jìn)行重做Redo處理,即正向掃描文件,重新執(zhí)行登記操作。7.2.3恢復(fù)策略利用后備副本、日志以及事務(wù)的Undo和Redo可以對不同的數(shù)據(jù)實行不同的恢復(fù)策略。1、事務(wù)級故障恢復(fù)事務(wù)故障是指事務(wù)在運(yùn)行至正常終止點(diǎn)前被中止,這時恢復(fù)子系統(tǒng)應(yīng)利用日志文件撤銷(Undo)此事務(wù)已對數(shù)據(jù)庫進(jìn)行的修改。事務(wù)故障的恢復(fù)是由系統(tǒng)自動完成的,對用戶是透明的。小型故障屬于事務(wù)內(nèi)部故障,恢復(fù)方法是利用事務(wù)的Undo操作,將事務(wù)在非正常終止時利用Undo恢復(fù)到事務(wù)起點(diǎn)。具體有以下兩種情況:(1)對于可以預(yù)料的事務(wù)故障,即在程序中可以預(yù)先估計到的錯誤,例如,銀行存款余額透支、商品庫存量達(dá)到最低量等,此時繼續(xù)取款或者發(fā)貨就會出現(xiàn)問題。因此,可以在事務(wù)的代碼中加入判斷和回滾語句Rollback,當(dāng)事務(wù)執(zhí)行到Rollback語句時,由系統(tǒng)對事務(wù)進(jìn)行回滾操作,即執(zhí)行Undo操作。(2)對于不可預(yù)料的事務(wù)故障,即在程序中發(fā)生的未估計到的錯誤,例如,運(yùn)算溢出,數(shù)據(jù)錯誤,由并發(fā)事務(wù)發(fā)生死鎖而被選中撤銷該事務(wù)等。此時由系統(tǒng)直接對事務(wù)執(zhí)行Undo處理。2、系統(tǒng)級故障恢復(fù)系統(tǒng)故障造成數(shù)據(jù)庫不一致狀態(tài)的原因有兩個,一是未完成事務(wù)對數(shù)據(jù)庫的更新可能已寫入數(shù)據(jù)庫,二是已提交事務(wù)對數(shù)據(jù)庫的更新可能還留在緩沖區(qū)沒來得及寫入數(shù)據(jù)庫。因此恢復(fù)操作就是要撤消故障發(fā)生時未完成的事務(wù),重做已完成的事務(wù)。系統(tǒng)故障的恢復(fù)是由系統(tǒng)在重新啟動時自動完成的,不需要用戶干預(yù)。系統(tǒng)的恢復(fù)步驟是:(1)正向掃描日志文件(即從頭掃描日志文件),找出在故障發(fā)生前已經(jīng)提交事務(wù)(這些事務(wù)既有BeginTransaction記錄,也有Commit記錄),將其事務(wù)標(biāo)識記入重做(Redo)隊列。同時找出故障發(fā)生時尚未完成的事務(wù)(這些事務(wù)只有BeginTransaction記錄,無相應(yīng)的Commit記錄),將其事務(wù)標(biāo)識記入撤消隊列。(2)對撤消隊列中的各個事務(wù)進(jìn)行撤消(Undo)處理。進(jìn)行Undo處理的方法是,反向掃描日志文件,對每個Undo事務(wù)的更新操作執(zhí)行逆操作,即將日志記錄中“更新前的值”寫入數(shù)據(jù)庫。(3)對重做隊列中的各個事務(wù)進(jìn)行重做(Redo)處理。進(jìn)行Redo處理的方法是:正向掃描日志文件,對每個Redo事務(wù)重新執(zhí)行日志文件登記的操作。即將日志記錄中“更新后的值”寫入數(shù)據(jù)庫。3.介質(zhì)級故障恢復(fù)發(fā)生介質(zhì)故障后,磁盤上的物理數(shù)據(jù)和日志文件被破壞,這是最嚴(yán)重的一種故障,恢復(fù)方法是重裝數(shù)據(jù)庫,然后重做已完成的事務(wù)。具體地說就是:(1)裝入最新的數(shù)據(jù)庫后備副本(離故障發(fā)生時刻最近的轉(zhuǎn)儲副本),使數(shù)據(jù)庫恢復(fù)到最近一次轉(zhuǎn)儲時的一致性狀態(tài)。對于動態(tài)轉(zhuǎn)儲的數(shù)據(jù)庫副本,還須同時裝入轉(zhuǎn)儲開始時刻的日志文件副本,利用恢復(fù)系統(tǒng)故障的方法(即Redo+Undo),才能將數(shù)據(jù)庫恢復(fù)到一致性狀態(tài)。(2)裝入相應(yīng)的日志文件副本(轉(zhuǎn)儲結(jié)束時刻的日志文件副本),重做已完成的事務(wù)。即:首先掃描日志文件,找出故障發(fā)生時已提交的事務(wù)的標(biāo)識,將其記入重做隊列。然后正向掃描日志文件,對重做隊列中的所有事務(wù)進(jìn)行重做處理。即將日志記錄中“更新后的值”寫入數(shù)據(jù)庫。這樣就可以將數(shù)據(jù)庫恢復(fù)至故障前某一時刻的一致狀態(tài)了。對于事務(wù)級和系統(tǒng)級故障恢復(fù)都是由系統(tǒng)重新啟動后系統(tǒng)自動完成,不需要用戶的涉入;而介質(zhì)級故障恢復(fù)需要DBA介入,但DBA的基本工作只是需要重新裝入最近存儲的數(shù)據(jù)后備副本和有關(guān)日志文件副本,然后執(zhí)行系統(tǒng)提供的恢復(fù)命令,而具體恢復(fù)操作的實施仍由DBMS完成。7.2.4數(shù)據(jù)庫鏡像1、概述數(shù)據(jù)庫鏡像是SQLSERVER2005用于提高數(shù)據(jù)庫可用性的新技術(shù)。數(shù)據(jù)庫鏡像將事務(wù)日志記錄直接從一臺服務(wù)器傳輸?shù)搅硪慌_服務(wù)器,并且能夠在出現(xiàn)故障時快速轉(zhuǎn)移到備用服務(wù)器??梢跃帉懣蛻舳顺绦蜃詣又囟ㄏ蜻B接信息,這樣一旦出現(xiàn)故障轉(zhuǎn)移就可以自動連接到備用服務(wù)器和數(shù)據(jù)庫。自動進(jìn)行故障轉(zhuǎn)移并且使數(shù)據(jù)損失最小化通常包括昂貴的硬件和復(fù)雜的軟件。但是,數(shù)據(jù)庫鏡像可以在不丟失已提交數(shù)據(jù)的前提下進(jìn)行快速故障轉(zhuǎn)移,無須專門的硬件,并且易于配置和管理。2、數(shù)據(jù)庫鏡像介紹在數(shù)據(jù)庫鏡像中,一臺SQLServer2005實例連續(xù)不斷的將數(shù)據(jù)庫事務(wù)日志發(fā)送到另一臺備用SQLServer實例的數(shù)據(jù)庫副本中。發(fā)送方的數(shù)據(jù)庫和服務(wù)器擔(dān)當(dāng)主角色,而接收方的數(shù)據(jù)庫和服務(wù)器擔(dān)當(dāng)鏡像角色。主服務(wù)器和鏡像服務(wù)器必須是獨(dú)立的SQLServer2005實例。在所有SQLServer數(shù)據(jù)庫中,在對真正的數(shù)據(jù)頁面進(jìn)行修改之前,數(shù)據(jù)改變首先都記錄在事務(wù)日志中。事務(wù)日志記錄先被放置在內(nèi)存中的數(shù)據(jù)庫日志緩沖區(qū)中,然后盡快地輸出到磁盤(或者被硬化)。在數(shù)據(jù)庫鏡像中,當(dāng)主服務(wù)器將主數(shù)據(jù)庫的日志緩沖區(qū)寫入磁盤時,也同時將這些日志記錄塊發(fā)送到鏡像實例。當(dāng)鏡像服務(wù)器接收到日志記錄塊后,首先將日志記錄放入鏡像數(shù)據(jù)庫的日志緩沖區(qū),然后盡快地將它們硬化到磁盤。稍后鏡像服務(wù)器會重新執(zhí)行那些日志記錄。由于鏡像數(shù)據(jù)庫重新應(yīng)用了主數(shù)據(jù)庫的事務(wù)日志記錄,因此復(fù)制了發(fā)生在主數(shù)據(jù)庫上的數(shù)據(jù)改變。主服務(wù)器和鏡像服務(wù)器將對方視為數(shù)據(jù)庫鏡像會話中的伙伴。數(shù)據(jù)庫鏡像會話包含了鏡像伙伴服務(wù)器之間的關(guān)系。一臺給定的伙伴服務(wù)器可以同時承擔(dān)某個數(shù)據(jù)庫的主角色和另一個數(shù)據(jù)庫的鏡像角色。

除了兩臺伙伴服務(wù)器(主服務(wù)器和鏡像服務(wù)器),一個數(shù)據(jù)庫會話中可能還包含第三臺可選服務(wù)器,叫做見證服務(wù)器。見證服務(wù)器的角色就是啟動自動故障轉(zhuǎn)移。當(dāng)數(shù)據(jù)庫鏡像用于高可用性時,如果主服務(wù)器突然失敗了,如果鏡像服務(wù)器通過見證服務(wù)器確認(rèn)了主服務(wù)器的失敗,那么它就自動承擔(dān)主服務(wù)器角色,并且在幾秒鐘之內(nèi)就可以向用戶提供數(shù)據(jù)庫服務(wù)。主數(shù)據(jù)庫必須為Full還原模型。由于Bulk-logged操作而導(dǎo)致的日志記錄無法發(fā)送到鏡像數(shù)據(jù)庫。初始化鏡像數(shù)據(jù)庫必須首先使用Norecovery還原主數(shù)據(jù)庫,然后再按順序還原諸數(shù)據(jù)庫事務(wù)日志備份。鏡像數(shù)據(jù)庫和主數(shù)據(jù)庫名稱必須一致。由于鏡像數(shù)據(jù)庫處于Recovering狀態(tài),因此不能直接訪問。通過在鏡像數(shù)據(jù)庫上創(chuàng)建數(shù)據(jù)庫快照可以間接讀取某一個時刻點(diǎn)的鏡像數(shù)據(jù)庫。數(shù)據(jù)庫鏡像中需要注意的一些重要事項:7.2.5SQLServer數(shù)據(jù)恢復(fù)技術(shù)SQLServer利用事務(wù)日志、設(shè)置檢查點(diǎn)、磁盤鏡像等機(jī)制進(jìn)行故障恢復(fù)。在SQL數(shù)據(jù)庫中,有關(guān)數(shù)據(jù)庫的所有修改都被自動地記錄在名為Syslogs(事務(wù)日志)的統(tǒng)計表中,每個數(shù)據(jù)庫都有自己專用的Syslogs,當(dāng)發(fā)生故障時系統(tǒng)能利用Syslogs自動恢復(fù)。SQLServer采用提前寫日志的方法實現(xiàn)系統(tǒng)的自動恢復(fù)。對數(shù)據(jù)庫進(jìn)行任何修改時,SQLServer首先把這種修改記入日志,需要恢復(fù)時,系統(tǒng)通過Syslogs回滾到數(shù)據(jù)修改前的狀態(tài)。SQLServer的檢查點(diǎn)機(jī)制強(qiáng)制地把在Cache(高速緩沖)中修改過的頁面(無論是數(shù)據(jù)頁還是日志頁)寫入磁盤,使Cache和磁盤保持同步。SQLServer支持兩類檢查點(diǎn):一種是SQLServer按固定周期自動設(shè)置的檢查點(diǎn),這個周期取決于SA(系統(tǒng)管理員)設(shè)定的最大可恢復(fù)間隔;另一種是由DBO(數(shù)據(jù)庫擁有者)或SA利用Checkpoint命令設(shè)置的檢查點(diǎn)。一個檢查點(diǎn)的操作包括:首先凍結(jié)所有對該數(shù)據(jù)庫進(jìn)行更新的事務(wù),然后一次寫入事務(wù)日志頁及實際被修改的數(shù)據(jù)頁并在事務(wù)日志中登記一個檢查點(diǎn)操作,最后把己凍結(jié)的事務(wù)解凍。系統(tǒng)在執(zhí)行Commit時,僅把Cache中的日志頁寫盤,但在執(zhí)行Checkpoint時,則把日志頁及數(shù)據(jù)頁都寫入磁盤。

SQLServer磁盤鏡像是通過建立數(shù)據(jù)庫鏡像設(shè)備實現(xiàn)數(shù)據(jù)庫設(shè)備的動態(tài)復(fù)制,即把所有寫到主設(shè)備的內(nèi)容也同時寫到另一個獨(dú)立的鏡像設(shè)備上。對系統(tǒng)數(shù)據(jù)庫Master、用戶數(shù)據(jù)庫、用戶數(shù)據(jù)庫事務(wù)日志建立鏡像,如果其中一個設(shè)備發(fā)生故障,另一個設(shè)備仍能正常工作,保證了數(shù)據(jù)庫事務(wù)邏輯的完整性。設(shè)有一個事務(wù)T,要在某數(shù)據(jù)庫中插入3行數(shù)據(jù)A、B、C,則:

BeginTransactionInsertAInsertBCheckpointInsertCCommit

第4步的Checkpoint是系統(tǒng)自動產(chǎn)生的。當(dāng)系統(tǒng)執(zhí)行Commit后,磁盤上的Database和Log并不同步,這是因為Log上雖然已記下插入了C,但由于尚未把數(shù)據(jù)頁寫回,故在Database中尚未增加C行。此時如果發(fā)生故障,系統(tǒng)會把Checkpoint與Commit之間的修改過程即InsertC全部寫入數(shù)據(jù)庫,這個過程就是前滾(Rollforword)。如果在Commit之前出現(xiàn)系統(tǒng)故障,則根據(jù)Log中自BeginTransaction到Checkpoint之間的修改過程即InsertA和InsertB全部從數(shù)據(jù)庫中撤銷,亦即回滾(Rollback)。

SQLServer提供了自動恢復(fù)和人工恢復(fù)兩種恢復(fù)機(jī)制。SQLServer每次被重新啟動時都自動開始執(zhí)行系統(tǒng)恢復(fù)進(jìn)程。該進(jìn)程首先為每個數(shù)據(jù)庫連接其事務(wù)日志(Syslogs表),然后檢查每個數(shù)據(jù)庫的Syslogs以確定應(yīng)對哪些事務(wù)進(jìn)行回滾和前滾操作,并負(fù)責(zé)把所有未完成的事務(wù)回滾(Undo),把所有己提交的事務(wù)還未記入數(shù)據(jù)庫的修改重做(Redo),最后在Syslogs中記下一個檢查點(diǎn)登記項,保證數(shù)據(jù)的正確性。當(dāng)數(shù)據(jù)庫的物理存儲介質(zhì)發(fā)生故障,并且已經(jīng)做了數(shù)據(jù)庫及事務(wù)日志的后援副本時,要進(jìn)行人工恢復(fù)。利用LoadDatabase和LoadTransaction命令來實現(xiàn)。在實踐中,應(yīng)做好Master數(shù)據(jù)庫和用戶數(shù)據(jù)庫的備份,利用DumpDatabase和DumpTransaction命令可以將數(shù)據(jù)庫和事務(wù)日志轉(zhuǎn)儲,實現(xiàn)動態(tài)備份。當(dāng)用戶數(shù)據(jù)庫發(fā)生介質(zhì)故障時,利用數(shù)據(jù)庫和事務(wù)日志的備份來重構(gòu)該數(shù)據(jù)庫,進(jìn)行數(shù)據(jù)庫恢復(fù)(Restore),具體利用LoadDatabase命令來實現(xiàn)從備份設(shè)備恢復(fù)數(shù)據(jù)庫。這一命令只允許DBO使用,執(zhí)行此命令的全過程都作為一個事務(wù)來對待。在數(shù)據(jù)庫裝入期間,任何未提交的事務(wù)都被回滾且不準(zhǔn)任何用戶對該數(shù)據(jù)庫進(jìn)行存取。當(dāng)完成最后一次的數(shù)據(jù)庫備份裝入之后,就可以利用LoadTransaction命令把事務(wù)日志的備份再添加到數(shù)據(jù)庫上,使數(shù)據(jù)庫恢復(fù)到事務(wù)轉(zhuǎn)儲時的狀態(tài)。Master數(shù)據(jù)庫是主數(shù)據(jù)庫,它的恢復(fù)與用戶數(shù)據(jù)庫的恢復(fù)不同,當(dāng)它的存儲介質(zhì)發(fā)生故障時,不能使用人工恢復(fù)的辦法,它的崩潰將導(dǎo)致Server不能啟動,因而無法使用Load命令,此時必須重建、重載Master數(shù)據(jù)庫,利用SQLSetup安裝程序進(jìn)行恢復(fù)。首先啟動SQLServerSetup使用程序,選擇RebuildMasterDatabase復(fù)選框,創(chuàng)建新的Master數(shù)據(jù)庫。此時創(chuàng)建的Master庫與初裝SQLServer時的Master庫一樣。然后以單用戶方式啟動Server,并用LoadDatabase裝載Master庫的備份。最后對每個數(shù)據(jù)庫執(zhí)行數(shù)據(jù)庫一致性檢查程序,進(jìn)行一致性檢查,待一切正常后,則可在多用戶方式下重新啟動Server。7.3并發(fā)控制數(shù)據(jù)庫系統(tǒng)一個明顯的特點(diǎn)是多個用戶共享數(shù)據(jù)庫資源,尤其是多個用戶可以同時存取相同數(shù)據(jù)。并發(fā)控制指的是當(dāng)多個用戶同時更新行時,用于保護(hù)數(shù)據(jù)庫完整性的各種技術(shù)。并發(fā)機(jī)制不正確可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀等此類問題。并發(fā)控制的目的是保證一個用戶的工作不會對另一個用戶的工作產(chǎn)生不合理的影響。在某些情況下,這些措施保證了當(dāng)用戶和其他用戶一起操作時,所得的結(jié)果和它單獨(dú)操作時的結(jié)果是一樣的。在另一些情況下,這表示用戶的工作按預(yù)定的方式受其他用戶的影響。7.3.1并發(fā)控制概述事務(wù)是并發(fā)控制的基本單位,保證事務(wù)ACID的特性是事務(wù)處理的重要任務(wù),而并發(fā)操作有可能會破壞其ACID特性。如果事務(wù)是順序執(zhí)行的,即一個事務(wù)完成之后,再開始另一個事務(wù),這種執(zhí)行方式稱為串行執(zhí)行或串行訪問。如果DBMS可以同時接受多個事務(wù),并且這些事務(wù)在時間上可以重疊執(zhí)行,這種執(zhí)行方式稱為并發(fā)執(zhí)行或并行訪問。DBMS并發(fā)控制機(jī)制的責(zé)任:對并發(fā)操作進(jìn)行正確調(diào)度,保證事務(wù)的隔離性更一般,確保數(shù)據(jù)庫的一致性。

以下的實例說明并發(fā)操作帶來的數(shù)據(jù)不一致的問題,考慮訂某一大酒店標(biāo)準(zhǔn)房的一個活動序列(同一時刻讀?。?。步驟1:甲地點(diǎn)(甲事務(wù))讀取這一酒店剩余標(biāo)準(zhǔn)房數(shù)量為A,A=20步驟2:乙地點(diǎn)(乙事務(wù))讀取這一酒店剩余標(biāo)準(zhǔn)房數(shù)量為A,A=20步驟3:甲地點(diǎn)訂出一間標(biāo)準(zhǔn)房,修改A=A-1,即A=19,寫入數(shù)據(jù)庫步驟4:乙地點(diǎn)訂出一間標(biāo)準(zhǔn)房,修改A=A-1,即A=19,寫入數(shù)據(jù)庫結(jié)果:訂出兩間標(biāo)準(zhǔn)房,數(shù)據(jù)庫中標(biāo)準(zhǔn)房的數(shù)量只減少1。造成數(shù)據(jù)庫的不一致性是由并發(fā)操作引起的。在并發(fā)操作情況下,對甲、乙事務(wù)的操作序列是隨機(jī)的。若按上面的調(diào)度序列執(zhí)行,甲事務(wù)的修改被丟失,因為步驟4中乙事務(wù)修改A并寫回后覆蓋了甲事務(wù)的修改。如果沒有鎖定且多個用戶同時訪問一個數(shù)據(jù)庫,則當(dāng)他們的事務(wù)同時使用相同的數(shù)據(jù)時可能會發(fā)生問題。由于并發(fā)操作帶來的數(shù)據(jù)不一致性包括:丟失數(shù)據(jù)修改、讀“臟”數(shù)據(jù)(臟讀)和不可重復(fù)讀。1、丟失數(shù)據(jù)修改當(dāng)兩個或多個事務(wù)選擇同一行,然后基于最初選定的值更新該行時,會發(fā)生丟失更新問題。每個事務(wù)都不知道其它事務(wù)的存在,最后的更新將重寫由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失,如表7.2所示。T1T21讀A=202讀A=203A=A-1寫回A=194A=A-1寫回A=19表7.2丟失數(shù)據(jù)修改2、讀“臟”數(shù)據(jù)(臟讀)讀“臟”數(shù)據(jù)是指事務(wù)T1修改某一數(shù)據(jù),并將其寫回磁盤,事務(wù)T2讀取同一數(shù)據(jù)后,T1由于某種原因被除撤消,而此時T1把已修改過的數(shù)據(jù)又恢復(fù)原值,T2讀到的數(shù)據(jù)與數(shù)據(jù)庫的數(shù)據(jù)不一致,則T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。如表7.3所示,T1將B值修改為400,T2讀到B為400,而T1由于某種原因撤銷,其修改作廢,B恢復(fù)原值200,這時T2讀到的B為400,與數(shù)據(jù)庫內(nèi)容不一致就是“臟”數(shù)據(jù)。T1T21讀B=200B=B*2寫回B2讀B=4003RollbackB恢復(fù)200表7.3讀“臟”數(shù)據(jù)3.不可重復(fù)讀指事務(wù)T1讀取數(shù)據(jù)后,事務(wù)T2執(zhí)行更新操作,使T1無法讀取前一次結(jié)果。不可重復(fù)讀包括三種情況:(1)事務(wù)T1讀取某一數(shù)據(jù)后,T2對其做了修改,當(dāng)T1再次讀該數(shù)據(jù)后,得到與前一不同的值。如表7.4所示,T1讀取D=100進(jìn)行運(yùn)算,T2讀取同一數(shù)據(jù)D,對其修改后將D=200寫回數(shù)據(jù)庫。T1為了對讀取值校對重讀D,D以為200,與第1次讀取值不一致。(2)事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些記錄后,T2刪除了其中部分記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄消失。(3)事物T1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后,T2插入了一些記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多了一些記錄。T1T21讀C=50讀D=100求和=1502讀D=100D=D*2寫回D=2003讀C=50讀D=200求和=250(驗算不對)表7.4不可重復(fù)讀事物的并發(fā)調(diào)度過程中所產(chǎn)生的上述3種問題都是因為并發(fā)操作調(diào)度不當(dāng),致使一個事物在運(yùn)行過程中受到其他并發(fā)事物的干擾,破壞了事物的隔離性。下面要介紹的封鎖方法就是DBMS采用的進(jìn)行并發(fā)控制、保證并發(fā)事物正確執(zhí)行的主要技術(shù)。例如在訂某一大酒店標(biāo)準(zhǔn)房例子中,甲事物要修改A,若在讀出A前先封鎖住A,其他事物就不能再讀取和修改A了,直到甲修改并寫回A后解除了對A的封鎖為止,這樣,就不會丟失甲的修改。7.3.2封鎖協(xié)議1、封鎖所謂封鎖是指事務(wù)T在對某個數(shù)據(jù)對象如表、記錄等操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后T對數(shù)據(jù)對象有一定的控制(具體的控制由封鎖類型決定),在事務(wù)T釋放前,其它事務(wù)不能更新此數(shù)據(jù)對象。按事物對數(shù)據(jù)對象的封鎖程度來分,封鎖有兩種基本類型:排它鎖(ExclusiveLocks,簡稱X鎖)和共享鎖(ShareLocks,簡稱S鎖)。排它鎖又稱為寫鎖。若事務(wù)T對數(shù)據(jù)對象A加上X鎖,則只允許T讀取和修改A,其它任何事務(wù)不能對A加任何類型的鎖,直到T釋放A上的鎖。從而保證其它事務(wù)在T釋放A上的鎖前不能再讀取和修改A。共享鎖又稱為讀鎖。若事務(wù)T對數(shù)據(jù)對象A加上S鎖,則T可以讀A但不能修改A,其它事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。保證了在T對A加S鎖過程中其它事務(wù)對A只能讀,不能修改。在給數(shù)據(jù)對象加排它鎖或共享鎖時應(yīng)遵循如表7.5所示的鎖相容矩陣。如果一個事物對某一個數(shù)據(jù)對象加上了共享鎖,則其他任何事物只能對該數(shù)據(jù)對象加共享鎖,而不能加排它鎖,直到相應(yīng)的鎖被釋放為止。如果一個事物對某一個數(shù)據(jù)加上了排它鎖,則其他任何事物不可以在對改數(shù)據(jù)對象加任何類型的鎖,直到相應(yīng)的鎖被釋放為止。T1T2SXSTrueFalseXFalseFalse表7.5鎖相容矩陣2、封鎖協(xié)議所謂封鎖協(xié)議就是在數(shù)據(jù)對象加鎖、持鎖和放鎖時所約定的一些規(guī)則。不同的封鎖規(guī)則形成了不同的封鎖協(xié)議,下面分別介紹三級封鎖協(xié)議。1)一級封鎖協(xié)議事務(wù)T在修改數(shù)據(jù)A之前必須先對其加X鎖,直到事務(wù)結(jié)束(即通過commit和rollback結(jié)束)才釋放。作用:防止丟失修改,保證事務(wù)T可恢復(fù)。如圖7.3所示。圖7.3使用一級封鎖協(xié)議防止丟失更新問題2)二級封鎖協(xié)議二級封鎖協(xié)議規(guī)定事務(wù)T在更新數(shù)據(jù)對象以前必須對數(shù)據(jù)對象加X鎖,且直到事物T結(jié)束時才可以釋放該鎖。另外,還規(guī)定事物T在讀取數(shù)據(jù)對象以前必須先對其加S鎖,讀完后即可釋放S鎖。作用:防止丟失修改及讀“臟”數(shù)據(jù)。如圖7.4所示。圖7.4使用二級封鎖協(xié)議防止丟失修改及讀“臟”數(shù)據(jù)3、三級封鎖協(xié)議三級封鎖協(xié)議規(guī)定事物T在更新數(shù)據(jù)對象以前,必須對數(shù)據(jù)對象加X鎖,且直到事物T結(jié)束時才可以釋放該鎖。另外,還規(guī)定事物T在讀取數(shù)據(jù)對象以前必須先對其加S鎖,該S鎖也必須在事物T結(jié)束時才可釋放。作用:防止丟失修改,防止讀“臟”數(shù)據(jù)以及防止不可重復(fù)讀。如圖7.5所示。圖7.5使用三級封鎖協(xié)議防止丟失修改、防止讀“臟”數(shù)據(jù)以及防止不可重復(fù)讀X鎖S鎖一致性操作結(jié)束釋放事物結(jié)束釋放操作結(jié)束釋放事物結(jié)束釋放不丟失修改不讀“臟”數(shù)據(jù)可重復(fù)讀一級封鎖協(xié)議√√二級封鎖協(xié)議√√√√三級封鎖協(xié)議√√√√√三個級別的封鎖協(xié)議的主要區(qū)別在于什么操作需要申請封鎖,以及何時釋放鎖(即持鎖時間)。三個級別的封鎖協(xié)議可以總結(jié)為表7.6所示。表7.6不同級別的封鎖協(xié)議3.活鎖和死鎖和操作系統(tǒng)一樣,封鎖的方法可能引起活鎖(Livelock)和死鎖(Deadlock)。封鎖技術(shù)可有效解決并行操作的一致性問題,但也可產(chǎn)生新的問題,即活鎖和死鎖問題?;铈i和死鎖是并發(fā)應(yīng)用程序經(jīng)常發(fā)生的問題,也是多線程編程中的重要概念,下面舉一個實例對死鎖和活鎖進(jìn)行形象的描述。有一個過道,兩個人寬,兩側(cè)迎面走來兩個人A和B?;铈i的情況:A和B都是很講禮貌的人,都主動給別人讓路。A往左移,同時B往右移;A往右移,同時B往左移。A和B在移動的時候,同時擋住對方,導(dǎo)致誰也過不去。死鎖的情況:A和B都不是講禮貌的人,都不愿給別人讓路,所以A和B都在等對方讓路,導(dǎo)致誰也過不去。同樣問題可以擴(kuò)展到多個人和更寬的過道。1)活鎖當(dāng)某個事務(wù)請求對某一數(shù)據(jù)的排它性封鎖時,由于其他事務(wù)對該數(shù)據(jù)的操作而使這個事務(wù)處于永久等待狀態(tài),這種狀態(tài)稱為活鎖。例如:事務(wù)T1封鎖了數(shù)據(jù)R,事務(wù)T2又請求封鎖R,于是T2等待。T3也請求封鎖R,當(dāng)T1釋放了R上的封鎖之后系統(tǒng)首先批準(zhǔn)了T3的請求,T2仍然等待。然后T4又請求封鎖R,當(dāng)T3釋放了R上的封鎖之后系統(tǒng)又批準(zhǔn)了T4的請求,...,T2有可能永遠(yuǎn)等待,這就是活鎖的情形。避免活鎖的簡單方法是采用先來先服務(wù)的策略。按照請求封鎖的次序?qū)κ聞?wù)排隊,一旦記錄上的鎖釋放,就使申請隊列中的第一個事務(wù)獲得鎖。有關(guān)活鎖的問題我們不再詳細(xì)討論,因為死鎖的問題較為常見,這里主要討論有關(guān)死鎖的問題。

2)死鎖在同時處于等待狀態(tài)的兩個或多個事務(wù)中,其中的每一個在它能夠進(jìn)行之前,都等待著某個數(shù)據(jù)、而這個數(shù)據(jù)已被它們中的某個事務(wù)所封鎖,這種狀態(tài)稱為死鎖。例如:事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖。死鎖問題在操作系統(tǒng)和一般并行處理中已做了深入研究,但數(shù)據(jù)庫系統(tǒng)有其自己的特點(diǎn),操作系統(tǒng)中解決死鎖的方法并不一定合適數(shù)據(jù)庫系統(tǒng)。目前在數(shù)據(jù)庫中解決死鎖問題主要有兩類方法,一類方法是采取一定措施來預(yù)防死鎖的發(fā)生,另一類方法是允許發(fā)生死鎖,采用一定手段定期診斷系統(tǒng)中有無死鎖,若有則解除之。(1)死鎖的預(yù)防在數(shù)據(jù)庫系統(tǒng)中,產(chǎn)生死鎖的原因是兩個或多個事務(wù)都已封鎖了一些數(shù)據(jù)對象,然后又都請求對已為其他事務(wù)封鎖的數(shù)據(jù)對象加鎖,從而出現(xiàn)死鎖等待。防止死鎖的發(fā)生其實就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法。一次封鎖法一次封鎖法要求每個事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。例如,在上圖的例子中,如果事務(wù)T1將數(shù)據(jù)對象A和B一次加鎖,T1就可以執(zhí)行下去,而T2等待。T1執(zhí)行完后釋放A,B上的鎖,T2繼續(xù)執(zhí)行。這樣就不會發(fā)生死鎖。一次封鎖法雖然可以有效地防止死鎖的發(fā)生,但也存在問題。首先,一次就將以后要用到的全部數(shù)據(jù)加鎖,勢必擴(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。其次,數(shù)據(jù)庫中數(shù)據(jù)是不斷變化的,原來不要求封鎖的數(shù)據(jù),在執(zhí)行過程中可能會變成封鎖對象,所以很難實現(xiàn)精確地確定每個事務(wù)所要封鎖的數(shù)據(jù)對象,只能采取擴(kuò)大封鎖范圍,將事務(wù)在執(zhí)行過程中可能要封鎖的數(shù)據(jù)對象全部加鎖,這就進(jìn)一步降低了并發(fā)度。

順序封鎖法順序封鎖法是預(yù)先對數(shù)據(jù)對象規(guī)定一個封鎖順序,所有事務(wù)都按這個順序執(zhí)行封鎖。在上例中,我們規(guī)定封鎖順是A,B,T1和T2都按此順序封鎖,即T2也必須先封鎖A。當(dāng)T2請求A的封鎖時,由于T1已經(jīng)封鎖住A,T2就只能等待。T1釋放A,B上的鎖后,T2繼續(xù)運(yùn)行。這樣就不會發(fā)生死鎖。順序封鎖法同樣可以有效地防止死鎖,但也同樣存在問題。首先,數(shù)據(jù)庫系統(tǒng)中可封鎖的數(shù)據(jù)對象及其眾多,并且隨數(shù)據(jù)的插入、刪除等操作而不斷地變化,要維護(hù)這樣極多而且變化的資源的封鎖順序非常困難,成本很高。其次,事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動態(tài)地決定,很難事先確定每一個事務(wù)要封鎖哪些對象,因此也就很難按規(guī)定的順序取施加封鎖。例如,規(guī)定數(shù)據(jù)對象的封鎖順序為A,B,C,D,E。事務(wù)T3起初要求封鎖數(shù)據(jù)對象B,C,E,但當(dāng)它封鎖B,C后,才發(fā)現(xiàn)還需要封鎖A,這樣就破壞了封鎖順序??梢姡诓僮飨到y(tǒng)中廣為采用的預(yù)防死鎖的策略并不很適合數(shù)據(jù)庫的特點(diǎn),因此DBMS在解決死鎖的問題上更普遍采用的是診斷并解除死鎖的方法。(2)死鎖的診斷與解除超時法如果一個事務(wù)的等待時間超過了規(guī)定的時限,就認(rèn)為發(fā)生了死鎖。超時法實現(xiàn)簡單,但其不足也很明顯。一是有可能誤判死鎖,事務(wù)因為其他原因使等待時間超過時限,系統(tǒng)會誤認(rèn)為發(fā)生了死鎖。二是時限若設(shè)置得太長,死鎖發(fā)生后不能及時發(fā)現(xiàn)。等待圖法事務(wù)等待圖是一個有向圖G=(T,U),T為結(jié)點(diǎn)的集合,每個結(jié)點(diǎn)表示正運(yùn)行的事務(wù);U為邊的集合,每條邊表示事務(wù)等待的情況。若T1等待T2,則T1、T2之間劃一條有向邊,從T1指向T2。事務(wù)等待圖動態(tài)地反映了所有事務(wù)的等待情況。并發(fā)控制子系統(tǒng)周期性地(比如每隔1分鐘)檢測事務(wù)等待圖,如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。

DBMS的并發(fā)控制子系統(tǒng)一旦檢測到系統(tǒng)中存在死鎖,就要設(shè)法解除。通常采用的方法是選擇一個處理死鎖代價最小的事務(wù),將其撤消,釋放此事務(wù)持有的所有的鎖,使其它事務(wù)得以繼續(xù)運(yùn)行下去。當(dāng)然,對撤消的事務(wù)所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復(fù)。7.3.3并發(fā)調(diào)度的可串行性計算機(jī)系統(tǒng)對并發(fā)事務(wù)中并發(fā)操作的調(diào)度是隨機(jī)的,而不同的調(diào)度可能會產(chǎn)生不同的結(jié)果,那么哪個結(jié)果是正確的,哪個是不正確的呢?如果一個事務(wù)運(yùn)行過程中沒有其他事務(wù)同時運(yùn)行,也就是說它沒有受到其他事務(wù)的干擾,那么就可以認(rèn)為該事務(wù)的運(yùn)行結(jié)果是正常的或者預(yù)想的。因此將所有事務(wù)串行起來的調(diào)度策略一定是正確的調(diào)度策略。雖然以不同的順序串行執(zhí)行事務(wù)可能會產(chǎn)生不同的結(jié)果,但由于不會將數(shù)據(jù)庫置于不一致狀態(tài),所以都是正確的。并發(fā)調(diào)度的可串行性是指多個事務(wù)的并發(fā)執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行它們時的結(jié)果相同,我們稱這種調(diào)度策略為可串行化(Serializable)的調(diào)度??纱行裕⊿erializability)是并發(fā)事務(wù)正確性的準(zhǔn)則。按這個準(zhǔn)則規(guī)定,一個給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認(rèn)為是正確調(diào)度。下面給出串行執(zhí)行、并發(fā)執(zhí)行(不正確)以及并發(fā)執(zhí)行可以串行化(正確)的例子。以銀行轉(zhuǎn)賬為例,事物T1從賬號A(初值為200元)轉(zhuǎn)100元到賬號B(初值為200元),事物T2從賬號A轉(zhuǎn)10%的款項到賬號B,T1和T2具體執(zhí)行過程如下。事物T1和事物T2串行化調(diào)度的方案如表7.7所示。表7.7可串行化調(diào)度為了保證并發(fā)操作的正確性,DBMS的并發(fā)控制機(jī)制必須提供一定的手段來保證調(diào)度是可串行化的。從理論上講,在某一事務(wù)執(zhí)行時禁止其他事務(wù)執(zhí)行的調(diào)度策略一定是可串行化的調(diào)度,這也是最簡單的調(diào)度策略,但這種方法實際上是不可取的,這使用戶不能充分共享數(shù)據(jù)庫資源。目前DBMS普遍采用封鎖方法實現(xiàn)并發(fā)操作調(diào)度的可串行性,從而保證調(diào)度的正確性。兩段鎖(Two-PhaseLocking,簡稱2PL)協(xié)議就是保證并發(fā)調(diào)度可串行性的封鎖協(xié)議。除此之外還有其他一些方法,如時標(biāo)方法、樂觀方法等來保證調(diào)度的正確性。7.3.4兩段鎖協(xié)議所謂兩段鎖協(xié)議是指所有事務(wù)必須分兩個階段對數(shù)據(jù)項加鎖和解鎖。在對任何數(shù)據(jù)進(jìn)行讀、寫操作之前,首先要申請并獲得對該數(shù)據(jù)的封鎖。在釋放一個封鎖之后,事務(wù)不再申請和獲得任何其他封鎖。所謂“兩段”鎖的含義是,事務(wù)分為兩個階段,第一階段是獲得封鎖,也稱為擴(kuò)展階段。這在階段,事務(wù)可以申請獲得任何數(shù)據(jù)項上的任何類型的鎖,但是不能釋放任何鎖。第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務(wù)可以釋放任何數(shù)據(jù)項上的任何類型的瑣,但是不能再申請任何瑣。例如事務(wù)T1遵守兩段鎖協(xié)議,其封鎖序列是:又如事務(wù)T2不遵守兩段鎖協(xié)議,其封鎖序列是:SlockA…UnlockA…SlockB…XlockC…UnlockC…UnlockB可以證明,若并發(fā)執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議,則對這些事務(wù)的任何并發(fā)調(diào)度策略都是可串行化的。需要說明的是,事物遵循兩段鎖協(xié)議是可串行化調(diào)度的充分條件,而不是必要條件。也就是說,若并發(fā)事物都遵循兩段鎖協(xié)議,則對這些事物的任何并發(fā)調(diào)度策略都是可串行化的;若對并發(fā)事物的一個調(diào)度是可串行化的,不一定所有事物都符合兩段鎖協(xié)議。在表7.8中,(a)和(b)都是可串行化的調(diào)度,但(a)中T1和T2都遵守兩段鎖協(xié)議,(b)中T1和T2不遵守兩段鎖協(xié)議。表7.8可串行化調(diào)度7.3.5SQLServer的并發(fā)控制上面介紹了并發(fā)控制的一般原則與方法,下面簡單介紹SQLServer數(shù)據(jù)庫系統(tǒng)中的并發(fā)控制機(jī)制。SQLServer提供了一套的安全保護(hù)機(jī)制,具有高的安全性、完整性以及并發(fā)控制和故障恢復(fù)的數(shù)據(jù)控制能力。SQLServer支持廣泛的并發(fā)控制機(jī)制,通過制定下列各項,用戶可以指定并發(fā)控制類型:(1)用于連接的事物隔離級別。(2)游標(biāo)上的并發(fā)選項。這些特性可以通過Transact-SQL語句或數(shù)據(jù)庫API(如ADO、OLEDB和ODBC)的屬性和特性定義。SQLServer的鎖模式包括:共享鎖、更新鎖、排它鎖、意向鎖和架構(gòu)鎖。鎖模式表明連接與鎖定對象所具有的相關(guān)性等級。SQLServer控制鎖模式的交互方式。例如,如果其他連接對資源具有共享鎖,則不能獲得排它鎖。SQLServer鎖保持的時間長度為保護(hù)所請求級別上的資源所需的時間長度。(1)用于保護(hù)讀取操作的共享鎖的保持時間取決于事物隔離級別。采用ReadCommitted的默認(rèn)事物隔離級別時,只在讀取頁的期間內(nèi)控制共享鎖。在掃描中,直到在掃描內(nèi)的下一頁上獲取鎖時才釋放鎖。如果指定Holdlock提示或者將事物隔離級別設(shè)置為RepeatableRead或Serializable,則直到事物結(jié)束才釋放鎖。(2)根據(jù)為游標(biāo)設(shè)置的并發(fā)控制,游標(biāo)可以獲取共享模式的滾動鎖以保護(hù)提取。當(dāng)需要滾動鎖時,直到下一次提取或關(guān)閉游標(biāo)(以先發(fā)生者為準(zhǔn))時才釋放滾動鎖。但是,如果指定Holdlock,則直到事物結(jié)束才釋放滾動鎖。(3)用于保護(hù)更新的排它鎖將直到事物結(jié)束才釋放。在SQLServer中,如果一個連接試圖獲取一個鎖,而該鎖與另一個連接所控制的鎖沖突,則試圖獲取鎖的連接將一直阻塞到:(1)將沖突鎖釋放而且連接獲取了所請求的鎖。(2)連接的超時間隔已到期。默認(rèn)情況下沒有超時間隔,但是一些應(yīng)用程序設(shè)置超時間隔以防止無限期等待。如果幾個連接因在某個單獨(dú)的資源上等待沖突的鎖而被阻塞,那么在前面的連接釋放鎖時將按先來先服務(wù)的方式授予鎖。SQLServer有一個算法可以檢測死鎖,即兩個連接互相阻塞的情況。如果SQLServer實例檢測到死鎖,將終止一個事物,以使另一個事物繼續(xù)。7.4安全性7.4.1安全性概述數(shù)據(jù)庫是一個共享的資源,其中存放了組織、企業(yè)和個人的各種信息,有的是比較一般的、可以公開的數(shù)據(jù),而有的可能是非常關(guān)鍵的或機(jī)密的數(shù)據(jù),例如國家軍事秘密、銀行儲蓄數(shù)據(jù)、證券投資信息、個人Internet賬戶信息等。如果對數(shù)據(jù)庫控制不嚴(yán),就有可能使重要的數(shù)據(jù)被泄露出去,甚至?xí)艿讲环ǚ肿拥钠茐?。因此,必須?yán)格控制用戶對數(shù)據(jù)庫的使用,這是由數(shù)據(jù)庫的安全性控制來完成的。所謂數(shù)據(jù)庫的安全性就是指保護(hù)數(shù)據(jù),以防止不合法的使用所造成的數(shù)據(jù)泄漏、更改或破壞。隨著計算機(jī)資源共享和網(wǎng)絡(luò)技術(shù)的應(yīng)用日益廣泛和深入,特別是Internet技術(shù)的發(fā)展,計算機(jī)安全性問題越來越得到人們的重視。網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)庫應(yīng)用系統(tǒng)需要考慮的安全問題主要包括以下五個層面的問題:(1)硬件平臺的安全問題:確保支持?jǐn)?shù)據(jù)庫系統(tǒng)運(yùn)行的硬件設(shè)施的安全。(2)網(wǎng)絡(luò)系統(tǒng)的安全問題:對于可以遠(yuǎn)程訪問數(shù)據(jù)庫的系統(tǒng)來說,網(wǎng)絡(luò)軟件內(nèi)部的安全性也非常重要。

(3)操作系統(tǒng)安全問題:安全的操作系統(tǒng)是安全的數(shù)據(jù)庫的重要前提。操作系統(tǒng)應(yīng)能保證數(shù)據(jù)庫中的數(shù)據(jù)必須經(jīng)由DBMS方可訪問,不容許用戶超越DBMS直接通過操作系統(tǒng)進(jìn)入數(shù)據(jù)庫。也就是說,數(shù)據(jù)庫必須時刻處在DBMS監(jiān)控之下,即使通過操作系統(tǒng)要訪問數(shù)據(jù)庫,也必須在DBMS中辦理注冊手續(xù)。這就是操作系統(tǒng)中安全性保護(hù)基本要點(diǎn)。(4)數(shù)據(jù)庫系統(tǒng)的安全問題:進(jìn)行用戶標(biāo)識和鑒定、數(shù)據(jù)庫存取控制,只允許合法用戶進(jìn)入系統(tǒng)并進(jìn)行合法的數(shù)據(jù)存取操作。(5)應(yīng)用系統(tǒng)的安全問題:防止對應(yīng)用系統(tǒng)的不合法使用所造成的數(shù)據(jù)泄密、更改或破壞。在上述五層安全體系中,任何一個環(huán)節(jié)出現(xiàn)安全漏洞,都可能導(dǎo)致整個安全體系的崩潰。本節(jié)將介紹數(shù)據(jù)庫系統(tǒng)的安全問題。7.4.2安全性控制在一般計算機(jī)安全系統(tǒng)中,安全措施是一級一級層層設(shè)置的。例如數(shù)據(jù)庫系統(tǒng)的安全,用戶要求進(jìn)入計算機(jī)系統(tǒng)時,系統(tǒng)首先根據(jù)輸入的用戶標(biāo)識進(jìn)行身份鑒定,只有合法的用戶才獲準(zhǔn)進(jìn)入計算機(jī)系統(tǒng)。對已進(jìn)入系統(tǒng)的用戶,DBMS還要進(jìn)行存取控制,只允許用戶執(zhí)行合法操作。操作系統(tǒng)一級也會有自己的保護(hù)措施。數(shù)據(jù)最后還可以以密碼形式存儲到數(shù)據(jù)庫中。在這里只討論與數(shù)據(jù)庫有關(guān)的用戶標(biāo)識語鑒別、存取控制、數(shù)據(jù)庫審計等安全技術(shù)。1、用戶標(biāo)識與鑒別用戶標(biāo)識與鑒別是系統(tǒng)提供的最外層安全保護(hù)措施。其方法是由系統(tǒng)提供一定的方式讓用戶標(biāo)識自己的名字和身份。每次用戶要求進(jìn)入系統(tǒng)時,由系統(tǒng)進(jìn)行核對,通過鑒定后才提供機(jī)器使用權(quán)。對于獲得上機(jī)權(quán)的用戶若要使用數(shù)據(jù)庫時,DBMS還要進(jìn)行用戶標(biāo)識和鑒定。用戶標(biāo)識和鑒定的方法有很多種,而且在一個系統(tǒng)中一般是許多方法并存,以獲得更強(qiáng)的安全性。用戶標(biāo)識和鑒別的方法很多,常用的方法有:1)身份認(rèn)證用戶的身份,是系統(tǒng)管理員為用戶定義的用戶名(也稱為用戶標(biāo)識、用戶賬號、用戶ID),并記錄在計算機(jī)系統(tǒng)或DBMS中。身份認(rèn)證,是指系統(tǒng)對輸入的用戶名與合法用戶名對照,鑒別此用戶是否為合法用戶。若是,則可以進(jìn)入下一步的核實;否則,不能使用系統(tǒng)。例如,在網(wǎng)上書店系統(tǒng)的設(shè)計中,設(shè)置了用戶的帳戶。2)密碼認(rèn)證用戶的密碼,是合法用戶自己定義的密碼。為保密起見,密碼由合法用戶自己定義并可以隨時變更。密碼認(rèn)證是為了進(jìn)一步對用戶核實。通常系統(tǒng)要求用戶輸入密碼,只有密碼正確才能進(jìn)入系統(tǒng)。例如,在網(wǎng)上書店系統(tǒng)的設(shè)計中,設(shè)置了用戶的密碼。3)隨機(jī)數(shù)運(yùn)算認(rèn)證隨機(jī)數(shù)認(rèn)證實際上是非固定密碼的認(rèn)證,即用戶的密碼每次都是不同的。鑒別時系統(tǒng)提供一個隨機(jī)數(shù),用戶根據(jù)預(yù)先約定的計算過程或計算函數(shù)進(jìn)行計算,并將計算結(jié)果輸送到計算機(jī),系統(tǒng)根據(jù)用戶計算結(jié)果判定用戶是否合法。例如算法為:“密碼=隨機(jī)數(shù)平方的后2位”,出現(xiàn)的隨機(jī)數(shù)是32,則密碼是24。2、存取控制作為共享資源的數(shù)據(jù)庫有很多用戶,其中有些人有權(quán)更新數(shù)據(jù)庫的數(shù)據(jù),有些人卻只能查詢數(shù)據(jù),有些人僅有權(quán)操作數(shù)據(jù)中的某幾個表或視圖,而有些人卻可以操作數(shù)據(jù)庫中的全部數(shù)據(jù)。因此,DBMS必須提供一種有效的機(jī)制,以確保數(shù)據(jù)庫中的數(shù)據(jù)僅被那些有權(quán)存取數(shù)據(jù)的用戶存取。1)DBMS的存取控制機(jī)制DBMS的存取控制包括3個方面的內(nèi)容:

(1)DBMS規(guī)定用戶想要操作數(shù)據(jù)庫中的數(shù)據(jù),必須擁有相應(yīng)的權(quán)限。例如,為了建立數(shù)據(jù)庫中的基本表,必須擁有CreateTable的權(quán)限,該權(quán)限屬于DBA。如果數(shù)據(jù)庫中的基本表有很多,為減輕工作強(qiáng)度,DBA也可以將CreateTable的權(quán)限授予普通用戶,擁有此權(quán)限的普通用戶就可以建立基本表。又如,為將數(shù)據(jù)插入到數(shù)據(jù)庫則必須擁有對基本表的Insert權(quán)限,有時可能還需要其他權(quán)限??紤]某個想執(zhí)行下面語句的用戶需要擁有哪些權(quán)限。

InsertInto圖書表(圖書類型編碼)

Select圖書類型編碼

From圖書類型表

Where圖書類型名稱=“金融”首先,因為要將數(shù)據(jù)插入到“男生成績表”,所以需要擁有對“男生成績表”的Insert權(quán)限。其次,由于上面的Insert語句包含兩個子查詢,因此還需要擁有對“成績表”和“學(xué)生信息表”的Select權(quán)限。在前面中討論了SQL語言的安全性控制功能,即SQL得Grant語句和Revoke語句,這里簡單回顧一下。例如,“學(xué)生信息表”的創(chuàng)建者自動獲得對該表的Select,Insert,Update,和Delete等權(quán)限,這些權(quán)限可以通過Grant語句轉(zhuǎn)授給其他用戶。例如:GrantSelect,InsertOnTable用戶表To李林WithGrantOption;就將“用戶表”的Select和Insert權(quán)限授予了用戶李林,后面的“WithGrantOption”子句表示用戶李林同時也獲得了“授權(quán)”的權(quán)限,即可以把得到的權(quán)限繼續(xù)授予其他用戶。

當(dāng)用戶將某些權(quán)限授給其他用戶后,他可以使用Revoke語句將權(quán)限收回,例如:

RevokeInsertOnTable用戶表

From李林

Cascade;就將“用戶表”的Insert權(quán)限從用戶李林處收回,選項Cascade表示,如果用戶李林將“用戶表”的Insert權(quán)限又轉(zhuǎn)授給了其他用戶,那么這些權(quán)限也將從其他用戶處收回。使用這些語句,具有授權(quán)資格的DBA和數(shù)據(jù)庫對象的所有者就可以定義用戶的權(quán)限,但一個用戶所擁有的權(quán)限不一定是永久的,因為如果授權(quán)者認(rèn)為被授權(quán)者變得不可靠,或由于工作調(diào)動被授權(quán)者不再適合擁有相應(yīng)的權(quán)限時,就可以將權(quán)限從被授權(quán)者處收回。(2)DBMS將授權(quán)結(jié)果存放于數(shù)據(jù)字典。(3)當(dāng)用戶提出操作請求時,DBMS會根據(jù)數(shù)據(jù)字典中保存的授權(quán)信息,判斷用戶是否有權(quán)對相應(yīng)的對象進(jìn)行操作,若無權(quán)則拒絕執(zhí)行操作。2)DBMS的存取控制方法DBMS的存取控制主要分為自主存取控制(DiscretionaryAccessControl,DAC),強(qiáng)制存取控制(MandatoryAccessControl,MAC)和基于角色的存取控制(RoleBasedAccessControl,RBAC)。(1)自主訪問控制自主訪問控制基于用戶的身份和訪問控制規(guī)則。首先檢查用戶的訪問請求,若存在授權(quán),則允許訪問,否則拒絕。在自主訪問控制方法中,用戶對于不同的數(shù)據(jù)對象可以有不同的存取權(quán)限,不同的用戶對同一數(shù)據(jù)對象的存取權(quán)限也可以各不相同,用戶還可以將自己擁有的存取權(quán)限轉(zhuǎn)授給其他用戶。用戶自主訪問控制的主要缺點(diǎn)是較難控制已被賦予的訪問權(quán)限,這使得自主訪問控制策略易遭受木馬程序的惡意攻擊。(2)強(qiáng)制訪問控制強(qiáng)制型存取控制系統(tǒng)主要通過對主體和客體已分配的安全屬性進(jìn)行匹配判斷,決定主體是否有權(quán)對客體進(jìn)行進(jìn)一步的訪問操作。在強(qiáng)制存取控制方法中,每一個數(shù)據(jù)對象被標(biāo)以一定得安全級別;每一個用戶也被授予某一個級別的安全許可。對于任意一個對象,只有具有合法許可的用戶才可以存取。而且一般情況下不能改變該授權(quán)狀態(tài),這也是強(qiáng)制型存取控制模型與自主型存取控制模型實質(zhì)性的區(qū)別。為了保證數(shù)據(jù)庫系統(tǒng)的安全性能,只要具有特定系統(tǒng)權(quán)限的管理員才能根據(jù)系統(tǒng)實際需要來修改系統(tǒng)的授權(quán)狀態(tài),而一般用戶或程序不能修改。

(3)基于角色訪問控制RBAC是由美國GeorgeMason大學(xué)RaviSandhu于1994年提出的,它解決了具有大量用戶、數(shù)據(jù)庫客體和各種訪問權(quán)限的系統(tǒng)中的授權(quán)管理問題。其中主要涉及用戶、角色、訪問權(quán)限、會話等概念。角色是訪問權(quán)的集合。當(dāng)用戶被賦予一個角色時,用戶具有這個角色所包含的所有訪問權(quán)。用戶、角色、訪問權(quán)限3者之間是多對多的關(guān)系。數(shù)據(jù)庫安全性的重點(diǎn)是DBMS的存取控制機(jī)制。數(shù)據(jù)庫安全主要通過數(shù)據(jù)庫系統(tǒng)的存取控制機(jī)制來確保只授權(quán)給有資格的用戶訪問數(shù)據(jù)庫的權(quán)限,同時令所有未被授權(quán)的人員無法接近數(shù)據(jù)。3、數(shù)據(jù)庫審計審計功能就是把用戶對數(shù)據(jù)庫的所有操作自動記錄下來放入審計日志(AuditLog)中,一旦發(fā)生數(shù)據(jù)被非法存取,DBA可以利用審計跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時間和內(nèi)容等。由于任何系統(tǒng)的安全保護(hù)措施都不可能無懈可擊,蓄意盜取、破壞數(shù)據(jù)的人總是想方設(shè)法打破控制,因此審計功能在維護(hù)數(shù)據(jù)安全、打擊犯罪方面是非常有效的。審計通常是很費(fèi)時間和空間的,因此DBA要根據(jù)應(yīng)用對安全性的要求,靈活打開或關(guān)閉審計功能。審計功能一般主要用于安全性較高的部門。4.視圖機(jī)制進(jìn)行存取權(quán)限控制時我們可以為不同的用戶定義不同的視圖,把數(shù)據(jù)對象限制在一定的范圍內(nèi),也就是說,通過視圖機(jī)制把要保密的數(shù)據(jù)對無權(quán)存取的用戶隱藏起來,從而自動地對數(shù)據(jù)提供一定程度的安全保護(hù)。視圖機(jī)制間接地實現(xiàn)了支持存取謂詞的用戶權(quán)限定義。在不直接支持存取謂詞的系統(tǒng)中,我們可以先建立視圖,然后在視圖上進(jìn)一步定義存取權(quán)限。5.?dāng)?shù)據(jù)加密對于高度敏感性數(shù)據(jù),例如財務(wù)數(shù)據(jù)、軍事數(shù)據(jù)、國家機(jī)密,除以上安全性措施外,還可以采用數(shù)據(jù)加密技術(shù)。數(shù)據(jù)加密是防止數(shù)據(jù)庫中數(shù)據(jù)在存儲和傳輸中失密的有效手段。加密的基本思想是根據(jù)一定的算法將原始數(shù)據(jù)(術(shù)語為明文,Plaintext)變換為不可直接識別的格式(術(shù)語為密文,Ciphertext),從而使得不知道解密算法的人無法獲知數(shù)據(jù)的內(nèi)容。加密方法主要有兩種,一種是替換方法,該方法使用密鑰(EncryptionKey)將明文中的每一個字符轉(zhuǎn)換為密文中的一個字符。另一種是置換方法,該方法僅將明文的字符按不同的順序重新排列。單獨(dú)使用這兩種方法的任意一種都是不夠安全的。但是將這兩種方法結(jié)合起來就能提供相當(dāng)高的安全程度。采用這種結(jié)合算法的例子是美國1977年制定的官方加密標(biāo)準(zhǔn),數(shù)據(jù)加密標(biāo)準(zhǔn)(DataEncryptionStandard,簡稱DES)。有關(guān)DES秘密密鑰加密技術(shù)及密鑰管理問題等,這里不再討論。7.4.3統(tǒng)計數(shù)據(jù)庫安全性一般地,統(tǒng)計數(shù)據(jù)庫允許用戶查詢聚集類型的信息(例如合計、平均值等),但是不允許查詢單個記錄信息。例如,在高校管理系統(tǒng)中,查詢“講師的平均工資是多少?”是合法的,但是查詢“講師王兵的工資是多少?”就不允許。在統(tǒng)計數(shù)據(jù)庫中存在著特殊的安全性問題,即可能存在著隱蔽的信息通道,使得可以從合法的查詢中推導(dǎo)出不合法的信息。例如下面兩個查詢都是合法的:本校共有多少女工程師?本校女工程師的工資總額是多少?如果第一個查詢的結(jié)果是“1”,那么第二個查詢的結(jié)果顯然就是這個女工程師的工資數(shù)。這樣統(tǒng)計數(shù)據(jù)庫的安全性機(jī)制就失效了。為了解決這個問題,我們可以規(guī)定任何查詢至少要涉及N(N足夠大)個以上的記錄。但是即使這樣,還是存在另外的泄密途徑,例如下面的例子:某個用戶X想知道另一用戶Y的工資數(shù)額,他可以通過下列兩個合法查詢獲?。河脩鬤和其他N個工程師的工資總額是多少?用戶Y和其他N個工程師的工資總額是多少?假設(shè)第一個查詢的結(jié)果是A,第二個查詢的結(jié)果是B,由于用戶X知道自己的工資是C,那么他可以計算出用戶Y的工資=B-(A-C)。無論采用什么安全性機(jī)制,都仍然會存在繞過這些機(jī)制的途徑。好的安全性措施應(yīng)該使得那些試圖破壞安全的人所花費(fèi)的代價遠(yuǎn)遠(yuǎn)超過他們所得到的利益,這也是整個數(shù)據(jù)庫安全機(jī)制設(shè)計的目標(biāo)。7.4.4SQLServer的安全性管理SQLServer為一個網(wǎng)絡(luò)數(shù)據(jù)庫管理系統(tǒng),具有完備的安全機(jī)制,能夠確保數(shù)據(jù)庫中的信息不被非法盜用或破壞。SQLServer的安全機(jī)制可分為以下三個等級:SQLServer的登錄安全性數(shù)據(jù)庫的訪問安全性數(shù)據(jù)庫對象的使用安全性這三個等級如同三道閘門,有效地抵御任何非法侵入,保衛(wèi)著數(shù)據(jù)庫中數(shù)據(jù)的安全。SQLServer的安全機(jī)制要比Windows系統(tǒng)復(fù)雜,這是因為服務(wù)器中的數(shù)據(jù)庫有多種多樣,為了數(shù)據(jù)的安全,必須考慮對不同的用戶分別給予不同的權(quán)限。比如,對于高校管理系統(tǒng)中的教學(xué)數(shù)據(jù)庫而言,一般學(xué)生允許訪問課程表和選課表,進(jìn)行查詢,但不得修改或刪除這兩個表中的數(shù)據(jù),只有有關(guān)教學(xué)管理人員用戶才有權(quán)添加、修改或刪除數(shù)據(jù),這樣將保證數(shù)據(jù)庫的正常有效使用。另外,如果在教師表中存有一些關(guān)于教師的私人信息(如工資、家庭住址等)時,一般學(xué)生也不應(yīng)具備訪問教師表的權(quán)限。1、SQLServer的身份驗證模式用戶想操作SQLServer中某一數(shù)據(jù)庫中的數(shù)據(jù),必須滿足以下3個條件:首先,登錄SQLServer服務(wù)器時必須通過身份驗證;其次,必須是該數(shù)據(jù)庫的用戶或者是某一數(shù)據(jù)庫角色的成員;最后,必須有執(zhí)行該操作的權(quán)限。從上面三個條件可以看出SQLServer數(shù)據(jù)庫的安全性檢查是通過登錄名、用戶、權(quán)限來完成的。1)Windows身份驗證模式當(dāng)用戶通過WindowsNT/2000用戶賬戶進(jìn)行連接時,SQLServer通過回叫WindowsNT/2000以獲得信息,重新驗證賬戶名和密碼,并在syslogins表中查找該賬戶,以確定該賬戶是否有權(quán)限登錄。在這種方式下,用戶不必提供密碼或登錄名讓SQLServer驗證。2)混合驗證模式混合模式使用戶能夠通過Windows身份驗證或SQLServer身份驗證與SQLServer實例連接。在SQLServer驗證模式下,SQLServer在syslogins表中檢測輸入的登錄名和密碼。如果在syslogins表中存在該登錄名,并且密碼也是匹配的,那么該登錄名可以登錄到SQLServer。否則,登錄失敗。在這種方式下,用戶必須提供登錄名和密碼,讓SQLServer驗證。3)設(shè)置驗證模式可以使用SQLServer企業(yè)管理器來設(shè)置或改變驗證模式。(1)打開企業(yè)管理器,展開服務(wù)器組,右擊需要修改驗證模

溫馨提示

  • 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

提交評論