版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章數(shù)據(jù)庫(kù)管理本章主要內(nèi)容在本章,我們先討論事務(wù)概念和基本性質(zhì),然后再使用事務(wù)處理的概念和技術(shù)研究數(shù)據(jù)庫(kù)恢復(fù)技術(shù)及SQLServer數(shù)據(jù)恢復(fù)技術(shù)和數(shù)據(jù)庫(kù)的并發(fā)控制及SQLServer的并發(fā)控制,最后討論了數(shù)據(jù)庫(kù)的安全性和完整性以及SQLServer的安全性管理和SQLServer的完整性策略。
本章學(xué)習(xí)目標(biāo)理解并掌握數(shù)據(jù)庫(kù)恢復(fù)技術(shù)熟練掌握并發(fā)控制理解數(shù)據(jù)庫(kù)的安全性掌握數(shù)據(jù)庫(kù)的完整性7.1數(shù)據(jù)庫(kù)管理概述數(shù)據(jù)庫(kù)管理(DatabaseAdministration)是有關(guān)建立、存儲(chǔ)、修改和存取數(shù)據(jù)庫(kù)中信息的技術(shù),是指為保證數(shù)據(jù)庫(kù)系統(tǒng)的正常運(yùn)行和服務(wù)質(zhì)量,有關(guān)人員須進(jìn)行的技術(shù)管理工作。負(fù)責(zé)這些技術(shù)管理工作的個(gè)人或集體稱(chēng)為數(shù)據(jù)庫(kù)管理員(DBA)。數(shù)據(jù)庫(kù)管理的主要內(nèi)容有:數(shù)據(jù)庫(kù)的建立、數(shù)據(jù)庫(kù)的調(diào)整、數(shù)據(jù)庫(kù)的重組、數(shù)據(jù)庫(kù)的重構(gòu)、數(shù)據(jù)庫(kù)的安全控制、數(shù)據(jù)的完整性控制和對(duì)用戶提供技術(shù)支持。在數(shù)據(jù)庫(kù)系統(tǒng)正確有效運(yùn)行的過(guò)程中,一個(gè)很重要的問(wèn)題就是如何保障數(shù)據(jù)庫(kù)的一致性,這就需要DBMS對(duì)數(shù)據(jù)庫(kù)的各種操作進(jìn)行監(jiān)控,因此引入一個(gè)在邏輯上“最小”的操作單位以便有效地完成這種監(jiān)控是是十分必要地,這就引入事物概念的必要背景。有了事物概念,對(duì)數(shù)據(jù)庫(kù)操作的監(jiān)控就是對(duì)數(shù)據(jù)庫(kù)事務(wù)的管理。數(shù)據(jù)庫(kù)事務(wù)管理的目標(biāo)是保證數(shù)據(jù)一致性。事務(wù)的并發(fā)操作會(huì)引起修改丟失、讀“臟”數(shù)據(jù)和不可重復(fù)讀等基本問(wèn)題;數(shù)據(jù)庫(kù)故障會(huì)引起數(shù)據(jù)的破壞與損失等嚴(yán)重后果。所有這些都將破壞數(shù)據(jù)庫(kù)的一致性,因此,事務(wù)并發(fā)控制和數(shù)據(jù)庫(kù)故障恢復(fù)就是數(shù)據(jù)庫(kù)事務(wù)管理中兩項(xiàng)基本課題。
數(shù)據(jù)庫(kù)的安全性和完整性也屬于數(shù)據(jù)庫(kù)管理的范疇,一般而言,數(shù)據(jù)庫(kù)安全性是保護(hù)數(shù)據(jù)庫(kù)以防止非法用戶惡意造成的破壞,數(shù)據(jù)庫(kù)完整性則是保護(hù)數(shù)據(jù)庫(kù)以防止合法用戶無(wú)意中造成的破壞。也就是說(shuō),安全性是確保用戶被限制在其想做的事情的范圍之內(nèi),完整性則是確保用戶所做的事情是正確的。安全性措施的防泛對(duì)象是非法用戶的進(jìn)入和合法用戶的非法操作,完整性措施的防范對(duì)象是不合語(yǔ)義的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)。在本章,我們先討論事務(wù)概念和基本性質(zhì),然后研究數(shù)據(jù)庫(kù)的并發(fā)控制與數(shù)據(jù)庫(kù)故障恢復(fù),最后討論數(shù)據(jù)庫(kù)的安全性和完整性。7.2數(shù)據(jù)庫(kù)恢復(fù)技術(shù)本節(jié)講解數(shù)據(jù)庫(kù)恢復(fù)技術(shù),包括數(shù)據(jù)庫(kù)運(yùn)行中可能發(fā)生的故障類(lèi)型,數(shù)據(jù)庫(kù)恢復(fù)中最經(jīng)常使用的技術(shù)——數(shù)據(jù)轉(zhuǎn)儲(chǔ)和登錄日志文件。講解日志文件的內(nèi)容及作用,登記日志文件所要遵循的原則,針對(duì)事務(wù)故障、系統(tǒng)故障和介質(zhì)故障等不同故障的恢復(fù)策略和恢復(fù)方法。具有檢查點(diǎn)的恢復(fù)技術(shù)。數(shù)據(jù)庫(kù)鏡像功能。在討論數(shù)據(jù)庫(kù)恢復(fù)技術(shù)之前先講解事物的基本概念和事物的性質(zhì)。1.事務(wù)(Transaction)的概念1)事務(wù)的基本概念是用戶定義的一個(gè)操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位。數(shù)據(jù)庫(kù)事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。設(shè)想網(wǎng)上書(shū)店系統(tǒng)中購(gòu)書(shū)的一次交易,其付款過(guò)程至少包括以下幾步數(shù)據(jù)庫(kù)操作:更新用戶所購(gòu)圖書(shū)的庫(kù)存信息保存用戶付款信息,可能包括與銀行系統(tǒng)的交互生成訂單并且保存到數(shù)據(jù)庫(kù)中更新用戶相關(guān)信息,例如購(gòu)書(shū)數(shù)量等等正常的情況下,這些操作將順利進(jìn)行,最終交易成功,與交易相關(guān)的所有數(shù)據(jù)庫(kù)信息也成功地更新。但是,如果在這一系列過(guò)程中任何一個(gè)環(huán)節(jié)出了差錯(cuò),例如在更新圖書(shū)庫(kù)存信息時(shí)發(fā)生異常、該顧客銀行帳戶存款不足等,都將導(dǎo)致交易失敗。一旦交易失敗,數(shù)據(jù)庫(kù)中所有信息都必須保持交易前的狀態(tài)不變,比如最后一步更新用戶信息時(shí)失敗而導(dǎo)致交易失敗,那么必須保證這筆失敗的交易不影響數(shù)據(jù)庫(kù)的狀態(tài)——庫(kù)存信息沒(méi)有被更新、用戶也沒(méi)有付款,訂單也沒(méi)有生成。否則,數(shù)據(jù)庫(kù)的信息將會(huì)一片混亂而不可預(yù)測(cè)。數(shù)據(jù)庫(kù)事務(wù)正是用來(lái)保證這種情況下交易的平穩(wěn)性和可預(yù)測(cè)性的技術(shù)。下面再看一個(gè)例子:網(wǎng)上書(shū)店系統(tǒng)銀行轉(zhuǎn)賬,事務(wù)T從A賬戶過(guò)戶到B賬戶100元。Read(A);A:=A-100;Write(A);Read(B);B:=B+100;Write(B);Read(X):從數(shù)據(jù)庫(kù)傳遞數(shù)據(jù)項(xiàng)X到事物的工作區(qū)中。Write(X):從事物的工作區(qū)中待數(shù)據(jù)項(xiàng)X寫(xiě)回?cái)?shù)據(jù)庫(kù)。按照事物的定義,這兩個(gè)操作要么都執(zhí)行成功,要么都不執(zhí)行。2)SQL中事物的定義在SQL語(yǔ)言中,定義事務(wù)的語(yǔ)句有一下三條:BeginTransactionCommitRollback
事務(wù)通常是以BeginTransaction開(kāi)始,以Commit或Rollback結(jié)束。Commit表示提交,即提交事務(wù)的所有操作。具體地說(shuō)就是將事務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的更新寫(xiě)回到磁盤(pán)上的物理數(shù)據(jù)庫(kù)中去,事務(wù)正常結(jié)束。Rollback表示回滾,即在事務(wù)運(yùn)行的過(guò)程中發(fā)生了某種故障,事務(wù)不能繼續(xù)執(zhí)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤消,滾回到事務(wù)開(kāi)始時(shí)的狀態(tài)。這里的操作指對(duì)數(shù)據(jù)庫(kù)的更新操作。例如:定義一個(gè)簡(jiǎn)單的事物。BeginTransactionUse圖書(shū)表GoUpdate圖書(shū)表Set圖書(shū)價(jià)格=圖書(shū)價(jià)格*1.1Where圖書(shū)類(lèi)型編碼=01GoDeleteFrom圖書(shū)表Where圖書(shū)編號(hào)=9787040084894CommitTransactionGo從BeginTransaction到CommitTransaction只有兩個(gè)操作,按照事物的定義,這兩個(gè)操作要么都執(zhí)行成功,要么都不執(zhí)行。2.事務(wù)的特性事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會(huì)永久更新面向數(shù)據(jù)的資源。通過(guò)將一組相關(guān)操作組合為一個(gè)要么全部成功要么全部失敗的單元,可以簡(jiǎn)化錯(cuò)誤恢復(fù)并使應(yīng)用程序更加可靠。一個(gè)邏輯工作單元要成為事務(wù),必須滿足所謂的事務(wù)的四個(gè)特性:即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability)。這個(gè)四個(gè)特性也簡(jiǎn)稱(chēng)為ACID特性。1)原子性事務(wù)必須是原子工作單元,對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。通常,與某個(gè)事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴(lài)的。如果系統(tǒng)只執(zhí)行這些操作的一個(gè)子集,則可能會(huì)破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)處理操作子集的可能性。2)一致性事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。因此當(dāng)數(shù)據(jù)庫(kù)只包含成功事務(wù)提交的結(jié)果時(shí),就說(shuō)數(shù)據(jù)庫(kù)處于一致性狀態(tài)。如果數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤消,滾回到事務(wù)開(kāi)始時(shí)的一致?tīng)顟B(tài)。例如上面提到的某公司銀行中有A,B兩個(gè)賬號(hào),現(xiàn)在公司想從賬號(hào)A中取出100元,存入賬號(hào)B。那么就可以定義一個(gè)事物,該事物包括兩個(gè)操作,第一個(gè)操作是從賬號(hào)A中減去100元,第二個(gè)操作是向賬號(hào)B中加入100元。這兩個(gè)操作要么全做,要么全不做。全做或者全不做,數(shù)據(jù)庫(kù)都處于一致性狀態(tài)。如果只做一個(gè)操作則用戶邏輯上就會(huì)發(fā)生錯(cuò)誤,少了100元,這時(shí)數(shù)據(jù)庫(kù)處于不一致?tīng)顟B(tài)??墒且恢滦耘c原子性是密切相關(guān)的。3)隔離性一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。例如,對(duì)任何一對(duì)是事物T1和T2,在T1看來(lái),T2要么在T1開(kāi)始之前已經(jīng)結(jié)束,要么在T1完成之后再開(kāi)始執(zhí)行。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。4)持續(xù)性持續(xù)性也稱(chēng)永久性(Permanence),一個(gè)事物一旦提交之后,不管DBMS發(fā)生什么故障,該事物對(duì)數(shù)據(jù)庫(kù)的所有更新操作都會(huì)永遠(yuǎn)保留在數(shù)據(jù)庫(kù)中,不會(huì)丟失。事務(wù)是恢復(fù)和并發(fā)控制的基本單位。保證事務(wù)ACID特性是事務(wù)處理的重要任務(wù)。事務(wù)ACID特性可能遭到破壞的因素有:(1)多個(gè)事務(wù)并行運(yùn)行時(shí),不同事務(wù)的操作交叉執(zhí)行。(2)事務(wù)在運(yùn)行過(guò)程中被強(qiáng)行停止。在第一種情況下,數(shù)據(jù)庫(kù)管理系統(tǒng)必須保證多個(gè)事務(wù)的交叉運(yùn)行不影響這些事務(wù)的原子性。在第二種情況下,數(shù)據(jù)庫(kù)管理系統(tǒng)必須保證被強(qiáng)行終止的事務(wù)對(duì)數(shù)據(jù)庫(kù)和其它事務(wù)沒(méi)有任何影響。這些就是數(shù)據(jù)庫(kù)管理系統(tǒng)中恢復(fù)機(jī)制和并發(fā)機(jī)制的責(zé)任。7.2.1數(shù)據(jù)庫(kù)恢復(fù)基本概念
當(dāng)前計(jì)算機(jī)硬、軟件技術(shù)已經(jīng)發(fā)展到相當(dāng)高的水平,人們采取了各種保護(hù)措施來(lái)防止數(shù)據(jù)庫(kù)的安全性和完整性被破壞,保證并行事務(wù)的正確執(zhí)行。但計(jì)算機(jī)系統(tǒng)中硬件的故障、系統(tǒng)軟件和應(yīng)用軟件的錯(cuò)誤、操作員的失誤以及惡意的破壞仍然是不可避免的。這些故障輕則造成運(yùn)行事務(wù)非正常中斷,影響數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫(kù),使數(shù)據(jù)庫(kù)中全部或部分?jǐn)?shù)據(jù)丟失。因此數(shù)據(jù)庫(kù)管理系統(tǒng)必須具有把數(shù)據(jù)全部從錯(cuò)誤狀態(tài)恢復(fù)到某一已知的正確狀態(tài)(亦稱(chēng)為完整狀態(tài)或一致?tīng)顟B(tài))的功能,這就是數(shù)據(jù)庫(kù)的恢復(fù)。恢復(fù)子系統(tǒng)是數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)重要組成部分,而且還相當(dāng)龐大,常常占整個(gè)系統(tǒng)代碼的百分之十以上。故障恢復(fù)是否考慮周到和行之有效,是數(shù)據(jù)庫(kù)系統(tǒng)性能的一個(gè)重要指標(biāo)。事務(wù)是數(shù)據(jù)庫(kù)的基本工作單位。一個(gè)事務(wù)中包含的操作要么全部完成,要么全部不做,二者必居其一。如果數(shù)據(jù)庫(kù)中只包含成功事務(wù)提交的結(jié)果,就說(shuō)此數(shù)據(jù)庫(kù)處于一致性狀態(tài)。保證數(shù)據(jù)一致性是對(duì)數(shù)據(jù)庫(kù)的最基本要求。如果數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改有一部分已寫(xiě)入物理數(shù)據(jù)庫(kù)。這時(shí)數(shù)據(jù)庫(kù)就處于一種不正確的狀態(tài),或者說(shuō)是不一致?tīng)顟B(tài),就需要DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))的恢復(fù)子系統(tǒng)根據(jù)故障類(lèi)型采取相應(yīng)的措施,將數(shù)據(jù)庫(kù)恢復(fù)到某種一致?tīng)顟B(tài)。數(shù)據(jù)庫(kù)系統(tǒng)中可能發(fā)生各種各樣的故障,大致可以分為以下幾類(lèi):1、事務(wù)故障(TaskCrash)事務(wù)內(nèi)部故障有些是預(yù)期性的,可通過(guò)事務(wù)程序本身發(fā)現(xiàn),并讓事務(wù)滾回,撤消錯(cuò)誤的修改,恢復(fù)數(shù)據(jù)庫(kù)到正確狀態(tài)。但更多的故障是非預(yù)期的,如輸入數(shù)據(jù)的錯(cuò)誤、運(yùn)算溢出、違反了某些完整性限制。某些應(yīng)用程序的錯(cuò)誤以及并行事務(wù)發(fā)生死鎖等,使事務(wù)未運(yùn)行至正常終點(diǎn)就夭折了。這類(lèi)故障稱(chēng)事務(wù)故障。事務(wù)故障意味著事務(wù)沒(méi)有達(dá)到預(yù)期的終點(diǎn)((Commit或者顯示Rollback),因此數(shù)據(jù)庫(kù)可能處于不正確狀態(tài),系統(tǒng)就要強(qiáng)行滾回此事務(wù),即撤消該事務(wù)已經(jīng)作出的任何對(duì)數(shù)據(jù)庫(kù)的修改,使得該事務(wù)好像根本沒(méi)有啟動(dòng)一樣。2、系統(tǒng)范圍的故障(軟故障,SoftCrash)系統(tǒng)在運(yùn)行過(guò)程中,由于某種原因,如操作系統(tǒng)或DBMS代碼錯(cuò)誤、操作員操作失誤、特定類(lèi)型的硬件錯(cuò)誤(如CPU故障)、突然停電等造成系統(tǒng)停止運(yùn)行,致使所有正在運(yùn)行的事務(wù)都以非正常方式終止。這時(shí)內(nèi)存中數(shù)據(jù)庫(kù)緩沖區(qū)的信息全部丟失,但存儲(chǔ)在外部存儲(chǔ)設(shè)備上的數(shù)據(jù)未受影響,此類(lèi)型為系統(tǒng)故障。發(fā)生系統(tǒng)故障時(shí),一些尚未完成的事務(wù)的結(jié)果可能已送入物理數(shù)據(jù)庫(kù),為保證數(shù)據(jù)的一致性,需要清除這些事務(wù)對(duì)數(shù)據(jù)庫(kù)的所有修改。但由于無(wú)法確定究竟哪些事務(wù)已更新過(guò)數(shù)據(jù)庫(kù),因此系統(tǒng)重新啟動(dòng)后,恢復(fù)程序要強(qiáng)行撤銷(xiāo)(Undo)所有未完成事務(wù),使這些事務(wù)像沒(méi)有運(yùn)行過(guò)一樣。另一方面,發(fā)生系統(tǒng)故障時(shí),有些已完成事務(wù)提交的結(jié)果可能還有一部分甚至全部留在緩沖區(qū),尚未寫(xiě)回到磁盤(pán)上的物理數(shù)據(jù)庫(kù)中,系統(tǒng)故障使得這些事務(wù)對(duì)數(shù)據(jù)庫(kù)中的修改部分或全部丟失,這也會(huì)使數(shù)據(jù)庫(kù)處于不一致?tīng)顟B(tài),因此應(yīng)將這些事務(wù)已提交的結(jié)果重新寫(xiě)入數(shù)據(jù)庫(kù)。同樣,由于無(wú)法確定哪些事務(wù)的提交結(jié)果尚未寫(xiě)入物理數(shù)據(jù)庫(kù),所以系統(tǒng)重新啟動(dòng)后,恢復(fù)程序除需要撤銷(xiāo)所有未完成事務(wù)外,還需要重做(Redo)所有已提交的事務(wù),以將數(shù)據(jù)庫(kù)真正恢復(fù)到一致?tīng)顟B(tài)。
3、介質(zhì)故障(硬故障,HardCrash)硬故障指外存故障,如磁盤(pán)損壞、磁頭碰撞或操作系統(tǒng)的某種潛在錯(cuò)誤,瞬時(shí)強(qiáng)磁場(chǎng)干擾等,使存儲(chǔ)在外存中的數(shù)據(jù)部分丟失或全部丟失。這類(lèi)故障比前兩類(lèi)故障的可能性小得多,但破壞性最大。發(fā)生介質(zhì)故障后,這時(shí)需要裝入數(shù)據(jù)庫(kù)發(fā)生介質(zhì)故障前某個(gè)時(shí)刻的數(shù)據(jù)副本,并重做自此時(shí)始的所有成功事務(wù),將這些事務(wù)已提交的結(jié)果重新記入數(shù)據(jù)庫(kù)。4、計(jì)算機(jī)病毒計(jì)算機(jī)病毒已成為計(jì)算機(jī)系統(tǒng)的主要威脅,自然也是數(shù)據(jù)庫(kù)系統(tǒng)的主要威脅,為此計(jì)算機(jī)安全工作者已研制了許多預(yù)防病毒的“疫苗”,檢查、診斷、消滅計(jì)算機(jī)病毒的軟件也在不斷發(fā)展,但至今還沒(méi)有一種使得計(jì)算機(jī)“終生”免疫的疫苗,因此數(shù)據(jù)庫(kù)一旦被破壞仍要用恢復(fù)技術(shù)把數(shù)據(jù)庫(kù)加以恢復(fù)??偨Y(jié)各類(lèi)故障,對(duì)數(shù)據(jù)庫(kù)的影響存在兩種可能:一是數(shù)據(jù)庫(kù)本身被破壞,二是數(shù)據(jù)庫(kù)沒(méi)有被破壞,但數(shù)據(jù)可能不正確,這是因?yàn)槭聞?wù)的運(yùn)行被中止而造成的?;謴?fù)的基本原理十分簡(jiǎn)單,可用一個(gè)詞來(lái)概括,即冗余。這就是說(shuō),數(shù)據(jù)庫(kù)中的任何一部分的數(shù)據(jù)都可以根據(jù)存儲(chǔ)在別處的冗余數(shù)據(jù)來(lái)重建。盡管恢復(fù)的基本原理很簡(jiǎn)單,但實(shí)現(xiàn)技術(shù)的細(xì)節(jié)卻相當(dāng)復(fù)雜。7.2.2恢復(fù)實(shí)現(xiàn)技術(shù)
恢復(fù)就是利用存儲(chǔ)在系統(tǒng)其他地方的冗余數(shù)據(jù)來(lái)重建數(shù)據(jù)庫(kù)中被破壞的或不正確的數(shù)據(jù)。因此恢復(fù)機(jī)制涉及的兩個(gè)關(guān)鍵問(wèn)題是:第一,如何建立冗余數(shù)據(jù);第二,如何利用這些冗余數(shù)據(jù)實(shí)施數(shù)據(jù)庫(kù)恢復(fù)。在實(shí)現(xiàn)恢復(fù)功能時(shí),主要有以下方面技術(shù):1、數(shù)據(jù)轉(zhuǎn)儲(chǔ)
轉(zhuǎn)儲(chǔ)是數(shù)據(jù)庫(kù)恢復(fù)中采用的基本技術(shù),即DBA(數(shù)據(jù)庫(kù)管理員)定期地將整個(gè)數(shù)據(jù)庫(kù)復(fù)制到磁帶或另一個(gè)磁盤(pán)上保存起來(lái)的過(guò)程。這些備用的數(shù)據(jù)文本稱(chēng)為后備副本或后援副本。當(dāng)數(shù)據(jù)庫(kù)遭到破壞后就可以利用后備副本把數(shù)據(jù)庫(kù)恢復(fù)。這時(shí),數(shù)據(jù)庫(kù)只能恢復(fù)到轉(zhuǎn)儲(chǔ)時(shí)的狀態(tài),從那以后的所有更新事務(wù)必須重新運(yùn)行才能恢復(fù)到故障時(shí)的狀態(tài)。如圖7.1所示。
圖7.1轉(zhuǎn)儲(chǔ)和恢復(fù)數(shù)據(jù)轉(zhuǎn)儲(chǔ)按操作可分為靜態(tài)轉(zhuǎn)儲(chǔ)和動(dòng)態(tài)轉(zhuǎn)儲(chǔ),按方式可分為海量轉(zhuǎn)儲(chǔ)和增量轉(zhuǎn)儲(chǔ)。其定義、優(yōu)點(diǎn)、缺點(diǎn)分別如表7.1所示。表7.1數(shù)據(jù)轉(zhuǎn)儲(chǔ)分類(lèi)類(lèi)別定義優(yōu)點(diǎn)缺點(diǎn)靜態(tài)轉(zhuǎn)儲(chǔ)在系統(tǒng)中無(wú)運(yùn)行事務(wù)時(shí)的操作,在轉(zhuǎn)儲(chǔ)期間不允許(或不存在)對(duì)數(shù)據(jù)庫(kù)的任何存取、修改活動(dòng)。簡(jiǎn)單轉(zhuǎn)儲(chǔ)必須等待用戶事務(wù)結(jié)束才能進(jìn)行,而新的事務(wù)必須等待轉(zhuǎn)儲(chǔ)結(jié)束才能執(zhí)行,因此會(huì)降低數(shù)據(jù)庫(kù)的可用性。動(dòng)態(tài)轉(zhuǎn)儲(chǔ)轉(zhuǎn)儲(chǔ)操作與用戶事務(wù)并發(fā)進(jìn)行,轉(zhuǎn)儲(chǔ)期間允許對(duì)數(shù)據(jù)庫(kù)進(jìn)行存取或修改??朔o態(tài)轉(zhuǎn)儲(chǔ)的缺點(diǎn),不用等待正在運(yùn)行的用戶事務(wù)結(jié)束,也不影響新事務(wù)的運(yùn)行。不能保證副本中的數(shù)據(jù)正確有效。海量轉(zhuǎn)儲(chǔ)每次轉(zhuǎn)儲(chǔ)全部數(shù)據(jù)庫(kù)?;謴?fù)時(shí)方便簡(jiǎn)單。大數(shù)據(jù)庫(kù)及頻繁的事務(wù)處理費(fèi)時(shí)、復(fù)雜。增量轉(zhuǎn)儲(chǔ)只轉(zhuǎn)儲(chǔ)上次轉(zhuǎn)儲(chǔ)后更新過(guò)的數(shù)據(jù)。對(duì)于大量數(shù)據(jù)庫(kù)及頻繁的事務(wù)處理快速有效。不能保證所有的數(shù)據(jù)正確有效。直觀地看,后備副本越接近故障發(fā)生點(diǎn),恢復(fù)起來(lái)越方便、越省時(shí)。這也就是說(shuō),從恢復(fù)方便角度看,應(yīng)經(jīng)常進(jìn)行數(shù)據(jù)轉(zhuǎn)儲(chǔ),制作后備副本。但另一方面,轉(zhuǎn)儲(chǔ)又是十分耗費(fèi)時(shí)間和資源的,不能頻繁進(jìn)行。所以DBA應(yīng)該根據(jù)數(shù)據(jù)庫(kù)使用情況確定適當(dāng)?shù)霓D(zhuǎn)儲(chǔ)周期和轉(zhuǎn)儲(chǔ)方法。例如,每晚進(jìn)行動(dòng)態(tài)增量轉(zhuǎn)儲(chǔ),每周進(jìn)行一次動(dòng)態(tài)海量轉(zhuǎn)儲(chǔ),每月進(jìn)行一次靜態(tài)海量轉(zhuǎn)儲(chǔ)。2、登記日志文件日志文件是用來(lái)記錄對(duì)數(shù)據(jù)庫(kù)每一次更新活動(dòng)的文件。在動(dòng)態(tài)轉(zhuǎn)儲(chǔ)方式中必須建立日志文件后援副本和日志文件綜合起來(lái)才能有效地恢復(fù)數(shù)據(jù)庫(kù)。在靜態(tài)轉(zhuǎn)儲(chǔ)方式中,也可以建立日志文件當(dāng)數(shù)據(jù)庫(kù)毀壞后可重新裝入后援副本,把數(shù)據(jù)庫(kù)恢復(fù)到轉(zhuǎn)儲(chǔ)結(jié)束時(shí)刻的正確狀態(tài),然后利用日志文件,把已完成的事務(wù)進(jìn)行重做(Redo)處理,對(duì)故障發(fā)生時(shí)尚未完成的事務(wù)進(jìn)行撤消處理(Undo),這樣不必重新運(yùn)行那些已完成的事務(wù)程序,就可把數(shù)據(jù)庫(kù)恢復(fù)到故障前某一時(shí)刻的正確狀態(tài),如圖7.2所示。圖7.2利用日志文件恢復(fù)不同的數(shù)據(jù)庫(kù)系統(tǒng)采用的日志文件格式并不完全一樣,主要有以記錄為單位和以數(shù)據(jù)塊為單位的日志文件。對(duì)于以記錄為單位的日志文件,日志文件中需登記內(nèi)容包括:(1)事務(wù)標(biāo)識(shí);(2)事務(wù)開(kāi)始標(biāo)記(BeginTransaction)和結(jié)束標(biāo)記(Commit或Rollback);(3)操作的類(lèi)型(插入、刪除或修改);(4)操作對(duì)象;(5)更新前數(shù)據(jù)的舊值(對(duì)插入操作,此項(xiàng)為空值);(6)更新后數(shù)據(jù)的新值(對(duì)刪除操作而言,此項(xiàng)為空值)。為保證數(shù)據(jù)庫(kù)是可恢復(fù)的,登記日志文件必須遵循兩條原則:(1)登記的次序嚴(yán)格按并行事務(wù)執(zhí)行的時(shí)間次序。(2)必須先寫(xiě)日志文件,后寫(xiě)數(shù)據(jù)庫(kù)。利用日志文件恢復(fù)事務(wù)的過(guò)程分為二步:第一步:從頭掃描日志文件,找出哪些事務(wù)在故障發(fā)生時(shí)已經(jīng)結(jié)束(這些事務(wù)有BeginTransaction和Commit記錄),哪些事務(wù)尚未結(jié)束(這些事務(wù)只有BeginTransaction記錄,無(wú)Commit記錄)。第二步:對(duì)尚未結(jié)束的事務(wù)進(jìn)行撤消(Undo)處理,即反向掃描日志文件,對(duì)每個(gè)Undo事務(wù)的更新操作執(zhí)行反操作。對(duì)已經(jīng)插入的新記錄進(jìn)行刪除操作,對(duì)已刪除的記錄重新插入,對(duì)修改的數(shù)據(jù)恢復(fù)舊值(用舊值代替新值),對(duì)已經(jīng)結(jié)束的事務(wù)進(jìn)行重做Redo處理,即正向掃描文件,重新執(zhí)行登記操作。7.2.3恢復(fù)策略利用后備副本、日志以及事務(wù)的Undo和Redo可以對(duì)不同的數(shù)據(jù)實(shí)行不同的恢復(fù)策略。1、事務(wù)級(jí)故障恢復(fù)事務(wù)故障是指事務(wù)在運(yùn)行至正常終止點(diǎn)前被中止,這時(shí)恢復(fù)子系統(tǒng)應(yīng)利用日志文件撤銷(xiāo)(Undo)此事務(wù)已對(duì)數(shù)據(jù)庫(kù)進(jìn)行的修改。事務(wù)故障的恢復(fù)是由系統(tǒng)自動(dòng)完成的,對(duì)用戶是透明的。小型故障屬于事務(wù)內(nèi)部故障,恢復(fù)方法是利用事務(wù)的Undo操作,將事務(wù)在非正常終止時(shí)利用Undo恢復(fù)到事務(wù)起點(diǎn)。具體有以下兩種情況:(1)對(duì)于可以預(yù)料的事務(wù)故障,即在程序中可以預(yù)先估計(jì)到的錯(cuò)誤,例如,銀行存款余額透支、商品庫(kù)存量達(dá)到最低量等,此時(shí)繼續(xù)取款或者發(fā)貨就會(huì)出現(xiàn)問(wèn)題。因此,可以在事務(wù)的代碼中加入判斷和回滾語(yǔ)句Rollback,當(dāng)事務(wù)執(zhí)行到Rollback語(yǔ)句時(shí),由系統(tǒng)對(duì)事務(wù)進(jìn)行回滾操作,即執(zhí)行Undo操作。(2)對(duì)于不可預(yù)料的事務(wù)故障,即在程序中發(fā)生的未估計(jì)到的錯(cuò)誤,例如,運(yùn)算溢出,數(shù)據(jù)錯(cuò)誤,由并發(fā)事務(wù)發(fā)生死鎖而被選中撤銷(xiāo)該事務(wù)等。此時(shí)由系統(tǒng)直接對(duì)事務(wù)執(zhí)行Undo處理。2、系統(tǒng)級(jí)故障恢復(fù)系統(tǒng)故障造成數(shù)據(jù)庫(kù)不一致?tīng)顟B(tài)的原因有兩個(gè),一是未完成事務(wù)對(duì)數(shù)據(jù)庫(kù)的更新可能已寫(xiě)入數(shù)據(jù)庫(kù),二是已提交事務(wù)對(duì)數(shù)據(jù)庫(kù)的更新可能還留在緩沖區(qū)沒(méi)來(lái)得及寫(xiě)入數(shù)據(jù)庫(kù)。因此恢復(fù)操作就是要撤消故障發(fā)生時(shí)未完成的事務(wù),重做已完成的事務(wù)。系統(tǒng)故障的恢復(fù)是由系統(tǒng)在重新啟動(dòng)時(shí)自動(dòng)完成的,不需要用戶干預(yù)。系統(tǒng)的恢復(fù)步驟是:(1)正向掃描日志文件(即從頭掃描日志文件),找出在故障發(fā)生前已經(jīng)提交事務(wù)(這些事務(wù)既有BeginTransaction記錄,也有Commit記錄),將其事務(wù)標(biāo)識(shí)記入重做(Redo)隊(duì)列。同時(shí)找出故障發(fā)生時(shí)尚未完成的事務(wù)(這些事務(wù)只有BeginTransaction記錄,無(wú)相應(yīng)的Commit記錄),將其事務(wù)標(biāo)識(shí)記入撤消隊(duì)列。(2)對(duì)撤消隊(duì)列中的各個(gè)事務(wù)進(jìn)行撤消(Undo)處理。進(jìn)行Undo處理的方法是,反向掃描日志文件,對(duì)每個(gè)Undo事務(wù)的更新操作執(zhí)行逆操作,即將日志記錄中“更新前的值”寫(xiě)入數(shù)據(jù)庫(kù)。(3)對(duì)重做隊(duì)列中的各個(gè)事務(wù)進(jìn)行重做(Redo)處理。進(jìn)行Redo處理的方法是:正向掃描日志文件,對(duì)每個(gè)Redo事務(wù)重新執(zhí)行日志文件登記的操作。即將日志記錄中“更新后的值”寫(xiě)入數(shù)據(jù)庫(kù)。3.介質(zhì)級(jí)故障恢復(fù)發(fā)生介質(zhì)故障后,磁盤(pán)上的物理數(shù)據(jù)和日志文件被破壞,這是最嚴(yán)重的一種故障,恢復(fù)方法是重裝數(shù)據(jù)庫(kù),然后重做已完成的事務(wù)。具體地說(shuō)就是:(1)裝入最新的數(shù)據(jù)庫(kù)后備副本(離故障發(fā)生時(shí)刻最近的轉(zhuǎn)儲(chǔ)副本),使數(shù)據(jù)庫(kù)恢復(fù)到最近一次轉(zhuǎn)儲(chǔ)時(shí)的一致性狀態(tài)。對(duì)于動(dòng)態(tài)轉(zhuǎn)儲(chǔ)的數(shù)據(jù)庫(kù)副本,還須同時(shí)裝入轉(zhuǎn)儲(chǔ)開(kāi)始時(shí)刻的日志文件副本,利用恢復(fù)系統(tǒng)故障的方法(即Redo+Undo),才能將數(shù)據(jù)庫(kù)恢復(fù)到一致性狀態(tài)。(2)裝入相應(yīng)的日志文件副本(轉(zhuǎn)儲(chǔ)結(jié)束時(shí)刻的日志文件副本),重做已完成的事務(wù)。即:首先掃描日志文件,找出故障發(fā)生時(shí)已提交的事務(wù)的標(biāo)識(shí),將其記入重做隊(duì)列。然后正向掃描日志文件,對(duì)重做隊(duì)列中的所有事務(wù)進(jìn)行重做處理。即將日志記錄中“更新后的值”寫(xiě)入數(shù)據(jù)庫(kù)。這樣就可以將數(shù)據(jù)庫(kù)恢復(fù)至故障前某一時(shí)刻的一致?tīng)顟B(tài)了。對(duì)于事務(wù)級(jí)和系統(tǒng)級(jí)故障恢復(fù)都是由系統(tǒng)重新啟動(dòng)后系統(tǒng)自動(dòng)完成,不需要用戶的涉入;而介質(zhì)級(jí)故障恢復(fù)需要DBA介入,但DBA的基本工作只是需要重新裝入最近存儲(chǔ)的數(shù)據(jù)后備副本和有關(guān)日志文件副本,然后執(zhí)行系統(tǒng)提供的恢復(fù)命令,而具體恢復(fù)操作的實(shí)施仍由DBMS完成。7.2.4數(shù)據(jù)庫(kù)鏡像1、概述數(shù)據(jù)庫(kù)鏡像是SQLSERVER2005用于提高數(shù)據(jù)庫(kù)可用性的新技術(shù)。數(shù)據(jù)庫(kù)鏡像將事務(wù)日志記錄直接從一臺(tái)服務(wù)器傳輸?shù)搅硪慌_(tái)服務(wù)器,并且能夠在出現(xiàn)故障時(shí)快速轉(zhuǎn)移到備用服務(wù)器??梢跃帉?xiě)客戶端程序自動(dòng)重定向連接信息,這樣一旦出現(xiàn)故障轉(zhuǎn)移就可以自動(dòng)連接到備用服務(wù)器和數(shù)據(jù)庫(kù)。自動(dòng)進(jìn)行故障轉(zhuǎn)移并且使數(shù)據(jù)損失最小化通常包括昂貴的硬件和復(fù)雜的軟件。但是,數(shù)據(jù)庫(kù)鏡像可以在不丟失已提交數(shù)據(jù)的前提下進(jìn)行快速故障轉(zhuǎn)移,無(wú)須專(zhuān)門(mén)的硬件,并且易于配置和管理。2、數(shù)據(jù)庫(kù)鏡像介紹在數(shù)據(jù)庫(kù)鏡像中,一臺(tái)SQLServer2005實(shí)例連續(xù)不斷的將數(shù)據(jù)庫(kù)事務(wù)日志發(fā)送到另一臺(tái)備用SQLServer實(shí)例的數(shù)據(jù)庫(kù)副本中。發(fā)送方的數(shù)據(jù)庫(kù)和服務(wù)器擔(dān)當(dāng)主角色,而接收方的數(shù)據(jù)庫(kù)和服務(wù)器擔(dān)當(dāng)鏡像角色。主服務(wù)器和鏡像服務(wù)器必須是獨(dú)立的SQLServer2005實(shí)例。在所有SQLServer數(shù)據(jù)庫(kù)中,在對(duì)真正的數(shù)據(jù)頁(yè)面進(jìn)行修改之前,數(shù)據(jù)改變首先都記錄在事務(wù)日志中。事務(wù)日志記錄先被放置在內(nèi)存中的數(shù)據(jù)庫(kù)日志緩沖區(qū)中,然后盡快地輸出到磁盤(pán)(或者被硬化)。在數(shù)據(jù)庫(kù)鏡像中,當(dāng)主服務(wù)器將主數(shù)據(jù)庫(kù)的日志緩沖區(qū)寫(xiě)入磁盤(pán)時(shí),也同時(shí)將這些日志記錄塊發(fā)送到鏡像實(shí)例。當(dāng)鏡像服務(wù)器接收到日志記錄塊后,首先將日志記錄放入鏡像數(shù)據(jù)庫(kù)的日志緩沖區(qū),然后盡快地將它們硬化到磁盤(pán)。稍后鏡像服務(wù)器會(huì)重新執(zhí)行那些日志記錄。由于鏡像數(shù)據(jù)庫(kù)重新應(yīng)用了主數(shù)據(jù)庫(kù)的事務(wù)日志記錄,因此復(fù)制了發(fā)生在主數(shù)據(jù)庫(kù)上的數(shù)據(jù)改變。主服務(wù)器和鏡像服務(wù)器將對(duì)方視為數(shù)據(jù)庫(kù)鏡像會(huì)話中的伙伴。數(shù)據(jù)庫(kù)鏡像會(huì)話包含了鏡像伙伴服務(wù)器之間的關(guān)系。一臺(tái)給定的伙伴服務(wù)器可以同時(shí)承擔(dān)某個(gè)數(shù)據(jù)庫(kù)的主角色和另一個(gè)數(shù)據(jù)庫(kù)的鏡像角色。
除了兩臺(tái)伙伴服務(wù)器(主服務(wù)器和鏡像服務(wù)器),一個(gè)數(shù)據(jù)庫(kù)會(huì)話中可能還包含第三臺(tái)可選服務(wù)器,叫做見(jiàn)證服務(wù)器。見(jiàn)證服務(wù)器的角色就是啟動(dòng)自動(dòng)故障轉(zhuǎn)移。當(dāng)數(shù)據(jù)庫(kù)鏡像用于高可用性時(shí),如果主服務(wù)器突然失敗了,如果鏡像服務(wù)器通過(guò)見(jiàn)證服務(wù)器確認(rèn)了主服務(wù)器的失敗,那么它就自動(dòng)承擔(dān)主服務(wù)器角色,并且在幾秒鐘之內(nèi)就可以向用戶提供數(shù)據(jù)庫(kù)服務(wù)。主數(shù)據(jù)庫(kù)必須為Full還原模型。由于Bulk-logged操作而導(dǎo)致的日志記錄無(wú)法發(fā)送到鏡像數(shù)據(jù)庫(kù)。初始化鏡像數(shù)據(jù)庫(kù)必須首先使用Norecovery還原主數(shù)據(jù)庫(kù),然后再按順序還原諸數(shù)據(jù)庫(kù)事務(wù)日志備份。鏡像數(shù)據(jù)庫(kù)和主數(shù)據(jù)庫(kù)名稱(chēng)必須一致。由于鏡像數(shù)據(jù)庫(kù)處于Recovering狀態(tài),因此不能直接訪問(wèn)。通過(guò)在鏡像數(shù)據(jù)庫(kù)上創(chuàng)建數(shù)據(jù)庫(kù)快照可以間接讀取某一個(gè)時(shí)刻點(diǎn)的鏡像數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)鏡像中需要注意的一些重要事項(xiàng):7.2.5SQLServer數(shù)據(jù)恢復(fù)技術(shù)SQLServer利用事務(wù)日志、設(shè)置檢查點(diǎn)、磁盤(pán)鏡像等機(jī)制進(jìn)行故障恢復(fù)。在SQL數(shù)據(jù)庫(kù)中,有關(guān)數(shù)據(jù)庫(kù)的所有修改都被自動(dòng)地記錄在名為Syslogs(事務(wù)日志)的統(tǒng)計(jì)表中,每個(gè)數(shù)據(jù)庫(kù)都有自己專(zhuān)用的Syslogs,當(dāng)發(fā)生故障時(shí)系統(tǒng)能利用Syslogs自動(dòng)恢復(fù)。SQLServer采用提前寫(xiě)日志的方法實(shí)現(xiàn)系統(tǒng)的自動(dòng)恢復(fù)。對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何修改時(shí),SQLServer首先把這種修改記入日志,需要恢復(fù)時(shí),系統(tǒng)通過(guò)Syslogs回滾到數(shù)據(jù)修改前的狀態(tài)。SQLServer的檢查點(diǎn)機(jī)制強(qiáng)制地把在Cache(高速緩沖)中修改過(guò)的頁(yè)面(無(wú)論是數(shù)據(jù)頁(yè)還是日志頁(yè))寫(xiě)入磁盤(pán),使Cache和磁盤(pán)保持同步。SQLServer支持兩類(lèi)檢查點(diǎn):一種是SQLServer按固定周期自動(dòng)設(shè)置的檢查點(diǎn),這個(gè)周期取決于SA(系統(tǒng)管理員)設(shè)定的最大可恢復(fù)間隔;另一種是由DBO(數(shù)據(jù)庫(kù)擁有者)或SA利用Checkpoint命令設(shè)置的檢查點(diǎn)。一個(gè)檢查點(diǎn)的操作包括:首先凍結(jié)所有對(duì)該數(shù)據(jù)庫(kù)進(jìn)行更新的事務(wù),然后一次寫(xiě)入事務(wù)日志頁(yè)及實(shí)際被修改的數(shù)據(jù)頁(yè)并在事務(wù)日志中登記一個(gè)檢查點(diǎn)操作,最后把己凍結(jié)的事務(wù)解凍。系統(tǒng)在執(zhí)行Commit時(shí),僅把Cache中的日志頁(yè)寫(xiě)盤(pán),但在執(zhí)行Checkpoint時(shí),則把日志頁(yè)及數(shù)據(jù)頁(yè)都寫(xiě)入磁盤(pán)。
SQLServer磁盤(pán)鏡像是通過(guò)建立數(shù)據(jù)庫(kù)鏡像設(shè)備實(shí)現(xiàn)數(shù)據(jù)庫(kù)設(shè)備的動(dòng)態(tài)復(fù)制,即把所有寫(xiě)到主設(shè)備的內(nèi)容也同時(shí)寫(xiě)到另一個(gè)獨(dú)立的鏡像設(shè)備上。對(duì)系統(tǒng)數(shù)據(jù)庫(kù)Master、用戶數(shù)據(jù)庫(kù)、用戶數(shù)據(jù)庫(kù)事務(wù)日志建立鏡像,如果其中一個(gè)設(shè)備發(fā)生故障,另一個(gè)設(shè)備仍能正常工作,保證了數(shù)據(jù)庫(kù)事務(wù)邏輯的完整性。設(shè)有一個(gè)事務(wù)T,要在某數(shù)據(jù)庫(kù)中插入3行數(shù)據(jù)A、B、C,則:
BeginTransactionInsertAInsertBCheckpointInsertCCommit
第4步的Checkpoint是系統(tǒng)自動(dòng)產(chǎn)生的。當(dāng)系統(tǒng)執(zhí)行Commit后,磁盤(pán)上的Database和Log并不同步,這是因?yàn)長(zhǎng)og上雖然已記下插入了C,但由于尚未把數(shù)據(jù)頁(yè)寫(xiě)回,故在Database中尚未增加C行。此時(shí)如果發(fā)生故障,系統(tǒng)會(huì)把Checkpoint與Commit之間的修改過(guò)程即InsertC全部寫(xiě)入數(shù)據(jù)庫(kù),這個(gè)過(guò)程就是前滾(Rollforword)。如果在Commit之前出現(xiàn)系統(tǒng)故障,則根據(jù)Log中自BeginTransaction到Checkpoint之間的修改過(guò)程即InsertA和InsertB全部從數(shù)據(jù)庫(kù)中撤銷(xiāo),亦即回滾(Rollback)。
SQLServer提供了自動(dòng)恢復(fù)和人工恢復(fù)兩種恢復(fù)機(jī)制。SQLServer每次被重新啟動(dòng)時(shí)都自動(dòng)開(kāi)始執(zhí)行系統(tǒng)恢復(fù)進(jìn)程。該進(jìn)程首先為每個(gè)數(shù)據(jù)庫(kù)連接其事務(wù)日志(Syslogs表),然后檢查每個(gè)數(shù)據(jù)庫(kù)的Syslogs以確定應(yīng)對(duì)哪些事務(wù)進(jìn)行回滾和前滾操作,并負(fù)責(zé)把所有未完成的事務(wù)回滾(Undo),把所有己提交的事務(wù)還未記入數(shù)據(jù)庫(kù)的修改重做(Redo),最后在Syslogs中記下一個(gè)檢查點(diǎn)登記項(xiàng),保證數(shù)據(jù)的正確性。當(dāng)數(shù)據(jù)庫(kù)的物理存儲(chǔ)介質(zhì)發(fā)生故障,并且已經(jīng)做了數(shù)據(jù)庫(kù)及事務(wù)日志的后援副本時(shí),要進(jìn)行人工恢復(fù)。利用LoadDatabase和LoadTransaction命令來(lái)實(shí)現(xiàn)。在實(shí)踐中,應(yīng)做好Master數(shù)據(jù)庫(kù)和用戶數(shù)據(jù)庫(kù)的備份,利用DumpDatabase和DumpTransaction命令可以將數(shù)據(jù)庫(kù)和事務(wù)日志轉(zhuǎn)儲(chǔ),實(shí)現(xiàn)動(dòng)態(tài)備份。當(dāng)用戶數(shù)據(jù)庫(kù)發(fā)生介質(zhì)故障時(shí),利用數(shù)據(jù)庫(kù)和事務(wù)日志的備份來(lái)重構(gòu)該數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)(Restore),具體利用LoadDatabase命令來(lái)實(shí)現(xiàn)從備份設(shè)備恢復(fù)數(shù)據(jù)庫(kù)。這一命令只允許DBO使用,執(zhí)行此命令的全過(guò)程都作為一個(gè)事務(wù)來(lái)對(duì)待。在數(shù)據(jù)庫(kù)裝入期間,任何未提交的事務(wù)都被回滾且不準(zhǔn)任何用戶對(duì)該數(shù)據(jù)庫(kù)進(jìn)行存取。當(dāng)完成最后一次的數(shù)據(jù)庫(kù)備份裝入之后,就可以利用LoadTransaction命令把事務(wù)日志的備份再添加到數(shù)據(jù)庫(kù)上,使數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)轉(zhuǎn)儲(chǔ)時(shí)的狀態(tài)。Master數(shù)據(jù)庫(kù)是主數(shù)據(jù)庫(kù),它的恢復(fù)與用戶數(shù)據(jù)庫(kù)的恢復(fù)不同,當(dāng)它的存儲(chǔ)介質(zhì)發(fā)生故障時(shí),不能使用人工恢復(fù)的辦法,它的崩潰將導(dǎo)致Server不能啟動(dòng),因而無(wú)法使用Load命令,此時(shí)必須重建、重載Master數(shù)據(jù)庫(kù),利用SQLSetup安裝程序進(jìn)行恢復(fù)。首先啟動(dòng)SQLServerSetup使用程序,選擇RebuildMasterDatabase復(fù)選框,創(chuàng)建新的Master數(shù)據(jù)庫(kù)。此時(shí)創(chuàng)建的Master庫(kù)與初裝SQLServer時(shí)的Master庫(kù)一樣。然后以單用戶方式啟動(dòng)Server,并用LoadDatabase裝載Master庫(kù)的備份。最后對(duì)每個(gè)數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)一致性檢查程序,進(jìn)行一致性檢查,待一切正常后,則可在多用戶方式下重新啟動(dòng)Server。7.3并發(fā)控制數(shù)據(jù)庫(kù)系統(tǒng)一個(gè)明顯的特點(diǎn)是多個(gè)用戶共享數(shù)據(jù)庫(kù)資源,尤其是多個(gè)用戶可以同時(shí)存取相同數(shù)據(jù)。并發(fā)控制指的是當(dāng)多個(gè)用戶同時(shí)更新行時(shí),用于保護(hù)數(shù)據(jù)庫(kù)完整性的各種技術(shù)。并發(fā)機(jī)制不正確可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀等此類(lèi)問(wèn)題。并發(fā)控制的目的是保證一個(gè)用戶的工作不會(huì)對(duì)另一個(gè)用戶的工作產(chǎn)生不合理的影響。在某些情況下,這些措施保證了當(dāng)用戶和其他用戶一起操作時(shí),所得的結(jié)果和它單獨(dú)操作時(shí)的結(jié)果是一樣的。在另一些情況下,這表示用戶的工作按預(yù)定的方式受其他用戶的影響。7.3.1并發(fā)控制概述事務(wù)是并發(fā)控制的基本單位,保證事務(wù)ACID的特性是事務(wù)處理的重要任務(wù),而并發(fā)操作有可能會(huì)破壞其ACID特性。如果事務(wù)是順序執(zhí)行的,即一個(gè)事務(wù)完成之后,再開(kāi)始另一個(gè)事務(wù),這種執(zhí)行方式稱(chēng)為串行執(zhí)行或串行訪問(wèn)。如果DBMS可以同時(shí)接受多個(gè)事務(wù),并且這些事務(wù)在時(shí)間上可以重疊執(zhí)行,這種執(zhí)行方式稱(chēng)為并發(fā)執(zhí)行或并行訪問(wèn)。DBMS并發(fā)控制機(jī)制的責(zé)任:對(duì)并發(fā)操作進(jìn)行正確調(diào)度,保證事務(wù)的隔離性更一般,確保數(shù)據(jù)庫(kù)的一致性。
以下的實(shí)例說(shuō)明并發(fā)操作帶來(lái)的數(shù)據(jù)不一致的問(wèn)題,考慮訂某一大酒店標(biāo)準(zhǔn)房的一個(gè)活動(dòng)序列(同一時(shí)刻讀?。2襟E1:甲地點(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,寫(xiě)入數(shù)據(jù)庫(kù)步驟4:乙地點(diǎn)訂出一間標(biāo)準(zhǔn)房,修改A=A-1,即A=19,寫(xiě)入數(shù)據(jù)庫(kù)結(jié)果:訂出兩間標(biāo)準(zhǔn)房,數(shù)據(jù)庫(kù)中標(biāo)準(zhǔn)房的數(shù)量只減少1。造成數(shù)據(jù)庫(kù)的不一致性是由并發(fā)操作引起的。在并發(fā)操作情況下,對(duì)甲、乙事務(wù)的操作序列是隨機(jī)的。若按上面的調(diào)度序列執(zhí)行,甲事務(wù)的修改被丟失,因?yàn)椴襟E4中乙事務(wù)修改A并寫(xiě)回后覆蓋了甲事務(wù)的修改。如果沒(méi)有鎖定且多個(gè)用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),則當(dāng)他們的事務(wù)同時(shí)使用相同的數(shù)據(jù)時(shí)可能會(huì)發(fā)生問(wèn)題。由于并發(fā)操作帶來(lái)的數(shù)據(jù)不一致性包括:丟失數(shù)據(jù)修改、讀“臟”數(shù)據(jù)(臟讀)和不可重復(fù)讀。1、丟失數(shù)據(jù)修改當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行,然后基于最初選定的值更新該行時(shí),會(huì)發(fā)生丟失更新問(wèn)題。每個(gè)事務(wù)都不知道其它事務(wù)的存在,最后的更新將重寫(xiě)由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失,如表7.2所示。T1T21讀A=202讀A=203A=A-1寫(xiě)回A=194A=A-1寫(xiě)回A=19表7.2丟失數(shù)據(jù)修改2、讀“臟”數(shù)據(jù)(臟讀)讀“臟”數(shù)據(jù)是指事務(wù)T1修改某一數(shù)據(jù),并將其寫(xiě)回磁盤(pán),事務(wù)T2讀取同一數(shù)據(jù)后,T1由于某種原因被除撤消,而此時(shí)T1把已修改過(guò)的數(shù)據(jù)又恢復(fù)原值,T2讀到的數(shù)據(jù)與數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致,則T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。如表7.3所示,T1將B值修改為400,T2讀到B為400,而T1由于某種原因撤銷(xiāo),其修改作廢,B恢復(fù)原值200,這時(shí)T2讀到的B為400,與數(shù)據(jù)庫(kù)內(nèi)容不一致就是“臟”數(shù)據(jù)。T1T21讀B=200B=B*2寫(xiě)回B2讀B=4003RollbackB恢復(fù)200表7.3讀“臟”數(shù)據(jù)3.不可重復(fù)讀指事務(wù)T1讀取數(shù)據(jù)后,事務(wù)T2執(zhí)行更新操作,使T1無(wú)法讀取前一次結(jié)果。不可重復(fù)讀包括三種情況:(1)事務(wù)T1讀取某一數(shù)據(jù)后,T2對(duì)其做了修改,當(dāng)T1再次讀該數(shù)據(jù)后,得到與前一不同的值。如表7.4所示,T1讀取D=100進(jìn)行運(yùn)算,T2讀取同一數(shù)據(jù)D,對(duì)其修改后將D=200寫(xiě)回?cái)?shù)據(jù)庫(kù)。T1為了對(duì)讀取值校對(duì)重讀D,D以為200,與第1次讀取值不一致。(2)事務(wù)T1按一定條件從數(shù)據(jù)庫(kù)中讀取了某些記錄后,T2刪除了其中部分記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)某些記錄消失。(3)事物T1按一定條件從數(shù)據(jù)庫(kù)中讀取某些數(shù)據(jù)記錄后,T2插入了一些記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)多了一些記錄。T1T21讀C=50讀D=100求和=1502讀D=100D=D*2寫(xiě)回D=2003讀C=50讀D=200求和=250(驗(yàn)算不對(duì))表7.4不可重復(fù)讀事物的并發(fā)調(diào)度過(guò)程中所產(chǎn)生的上述3種問(wèn)題都是因?yàn)椴l(fā)操作調(diào)度不當(dāng),致使一個(gè)事物在運(yùn)行過(guò)程中受到其他并發(fā)事物的干擾,破壞了事物的隔離性。下面要介紹的封鎖方法就是DBMS采用的進(jìn)行并發(fā)控制、保證并發(fā)事物正確執(zhí)行的主要技術(shù)。例如在訂某一大酒店標(biāo)準(zhǔn)房例子中,甲事物要修改A,若在讀出A前先封鎖住A,其他事物就不能再讀取和修改A了,直到甲修改并寫(xiě)回A后解除了對(duì)A的封鎖為止,這樣,就不會(huì)丟失甲的修改。7.3.2封鎖協(xié)議1、封鎖所謂封鎖是指事務(wù)T在對(duì)某個(gè)數(shù)據(jù)對(duì)象如表、記錄等操作之前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后T對(duì)數(shù)據(jù)對(duì)象有一定的控制(具體的控制由封鎖類(lèi)型決定),在事務(wù)T釋放前,其它事務(wù)不能更新此數(shù)據(jù)對(duì)象。按事物對(duì)數(shù)據(jù)對(duì)象的封鎖程度來(lái)分,封鎖有兩種基本類(lèi)型:排它鎖(ExclusiveLocks,簡(jiǎn)稱(chēng)X鎖)和共享鎖(ShareLocks,簡(jiǎn)稱(chēng)S鎖)。排它鎖又稱(chēng)為寫(xiě)鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖,則只允許T讀取和修改A,其它任何事務(wù)不能對(duì)A加任何類(lèi)型的鎖,直到T釋放A上的鎖。從而保證其它事務(wù)在T釋放A上的鎖前不能再讀取和修改A。共享鎖又稱(chēng)為讀鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上S鎖,則T可以讀A但不能修改A,其它事務(wù)只能再對(duì)A加S鎖,而不能加X(jué)鎖,直到T釋放A上的S鎖。保證了在T對(duì)A加S鎖過(guò)程中其它事務(wù)對(duì)A只能讀,不能修改。在給數(shù)據(jù)對(duì)象加排它鎖或共享鎖時(shí)應(yīng)遵循如表7.5所示的鎖相容矩陣。如果一個(gè)事物對(duì)某一個(gè)數(shù)據(jù)對(duì)象加上了共享鎖,則其他任何事物只能對(duì)該數(shù)據(jù)對(duì)象加共享鎖,而不能加排它鎖,直到相應(yīng)的鎖被釋放為止。如果一個(gè)事物對(duì)某一個(gè)數(shù)據(jù)加上了排它鎖,則其他任何事物不可以在對(duì)改數(shù)據(jù)對(duì)象加任何類(lèi)型的鎖,直到相應(yīng)的鎖被釋放為止。T1T2SXSTrueFalseXFalseFalse表7.5鎖相容矩陣2、封鎖協(xié)議所謂封鎖協(xié)議就是在數(shù)據(jù)對(duì)象加鎖、持鎖和放鎖時(shí)所約定的一些規(guī)則。不同的封鎖規(guī)則形成了不同的封鎖協(xié)議,下面分別介紹三級(jí)封鎖協(xié)議。1)一級(jí)封鎖協(xié)議事務(wù)T在修改數(shù)據(jù)A之前必須先對(duì)其加X(jué)鎖,直到事務(wù)結(jié)束(即通過(guò)commit和rollback結(jié)束)才釋放。作用:防止丟失修改,保證事務(wù)T可恢復(fù)。如圖7.3所示。圖7.3使用一級(jí)封鎖協(xié)議防止丟失更新問(wèn)題2)二級(jí)封鎖協(xié)議二級(jí)封鎖協(xié)議規(guī)定事務(wù)T在更新數(shù)據(jù)對(duì)象以前必須對(duì)數(shù)據(jù)對(duì)象加X(jué)鎖,且直到事物T結(jié)束時(shí)才可以釋放該鎖。另外,還規(guī)定事物T在讀取數(shù)據(jù)對(duì)象以前必須先對(duì)其加S鎖,讀完后即可釋放S鎖。作用:防止丟失修改及讀“臟”數(shù)據(jù)。如圖7.4所示。圖7.4使用二級(jí)封鎖協(xié)議防止丟失修改及讀“臟”數(shù)據(jù)3、三級(jí)封鎖協(xié)議三級(jí)封鎖協(xié)議規(guī)定事物T在更新數(shù)據(jù)對(duì)象以前,必須對(duì)數(shù)據(jù)對(duì)象加X(jué)鎖,且直到事物T結(jié)束時(shí)才可以釋放該鎖。另外,還規(guī)定事物T在讀取數(shù)據(jù)對(duì)象以前必須先對(duì)其加S鎖,該S鎖也必須在事物T結(jié)束時(shí)才可釋放。作用:防止丟失修改,防止讀“臟”數(shù)據(jù)以及防止不可重復(fù)讀。如圖7.5所示。圖7.5使用三級(jí)封鎖協(xié)議防止丟失修改、防止讀“臟”數(shù)據(jù)以及防止不可重復(fù)讀X鎖S鎖一致性操作結(jié)束釋放事物結(jié)束釋放操作結(jié)束釋放事物結(jié)束釋放不丟失修改不讀“臟”數(shù)據(jù)可重復(fù)讀一級(jí)封鎖協(xié)議√√二級(jí)封鎖協(xié)議√√√√三級(jí)封鎖協(xié)議√√√√√三個(gè)級(jí)別的封鎖協(xié)議的主要區(qū)別在于什么操作需要申請(qǐng)封鎖,以及何時(shí)釋放鎖(即持鎖時(shí)間)。三個(gè)級(jí)別的封鎖協(xié)議可以總結(jié)為表7.6所示。表7.6不同級(jí)別的封鎖協(xié)議3.活鎖和死鎖和操作系統(tǒng)一樣,封鎖的方法可能引起活鎖(Livelock)和死鎖(Deadlock)。封鎖技術(shù)可有效解決并行操作的一致性問(wèn)題,但也可產(chǎn)生新的問(wèn)題,即活鎖和死鎖問(wèn)題?;铈i和死鎖是并發(fā)應(yīng)用程序經(jīng)常發(fā)生的問(wèn)題,也是多線程編程中的重要概念,下面舉一個(gè)實(shí)例對(duì)死鎖和活鎖進(jìn)行形象的描述。有一個(gè)過(guò)道,兩個(gè)人寬,兩側(cè)迎面走來(lái)兩個(gè)人A和B?;铈i的情況:A和B都是很講禮貌的人,都主動(dòng)給別人讓路。A往左移,同時(shí)B往右移;A往右移,同時(shí)B往左移。A和B在移動(dòng)的時(shí)候,同時(shí)擋住對(duì)方,導(dǎo)致誰(shuí)也過(guò)不去。死鎖的情況:A和B都不是講禮貌的人,都不愿給別人讓路,所以A和B都在等對(duì)方讓路,導(dǎo)致誰(shuí)也過(guò)不去。同樣問(wèn)題可以擴(kuò)展到多個(gè)人和更寬的過(guò)道。1)活鎖當(dāng)某個(gè)事務(wù)請(qǐng)求對(duì)某一數(shù)據(jù)的排它性封鎖時(shí),由于其他事務(wù)對(duì)該數(shù)據(jù)的操作而使這個(gè)事務(wù)處于永久等待狀態(tài),這種狀態(tài)稱(chēng)為活鎖。例如:事務(wù)T1封鎖了數(shù)據(jù)R,事務(wù)T2又請(qǐng)求封鎖R,于是T2等待。T3也請(qǐng)求封鎖R,當(dāng)T1釋放了R上的封鎖之后系統(tǒng)首先批準(zhǔn)了T3的請(qǐng)求,T2仍然等待。然后T4又請(qǐng)求封鎖R,當(dāng)T3釋放了R上的封鎖之后系統(tǒng)又批準(zhǔn)了T4的請(qǐng)求,...,T2有可能永遠(yuǎn)等待,這就是活鎖的情形。避免活鎖的簡(jiǎn)單方法是采用先來(lái)先服務(wù)的策略。按照請(qǐng)求封鎖的次序?qū)κ聞?wù)排隊(duì),一旦記錄上的鎖釋放,就使申請(qǐng)隊(duì)列中的第一個(gè)事務(wù)獲得鎖。有關(guān)活鎖的問(wèn)題我們不再詳細(xì)討論,因?yàn)樗梨i的問(wèn)題較為常見(jiàn),這里主要討論有關(guān)死鎖的問(wèn)題。
2)死鎖在同時(shí)處于等待狀態(tài)的兩個(gè)或多個(gè)事務(wù)中,其中的每一個(gè)在它能夠進(jìn)行之前,都等待著某個(gè)數(shù)據(jù)、而這個(gè)數(shù)據(jù)已被它們中的某個(gè)事務(wù)所封鎖,這種狀態(tài)稱(chēng)為死鎖。例如:事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請(qǐng)求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請(qǐng)封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個(gè)事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖。死鎖問(wèn)題在操作系統(tǒng)和一般并行處理中已做了深入研究,但數(shù)據(jù)庫(kù)系統(tǒng)有其自己的特點(diǎn),操作系統(tǒng)中解決死鎖的方法并不一定合適數(shù)據(jù)庫(kù)系統(tǒng)。目前在數(shù)據(jù)庫(kù)中解決死鎖問(wèn)題主要有兩類(lèi)方法,一類(lèi)方法是采取一定措施來(lái)預(yù)防死鎖的發(fā)生,另一類(lèi)方法是允許發(fā)生死鎖,采用一定手段定期診斷系統(tǒng)中有無(wú)死鎖,若有則解除之。(1)死鎖的預(yù)防在數(shù)據(jù)庫(kù)系統(tǒng)中,產(chǎn)生死鎖的原因是兩個(gè)或多個(gè)事務(wù)都已封鎖了一些數(shù)據(jù)對(duì)象,然后又都請(qǐng)求對(duì)已為其他事務(wù)封鎖的數(shù)據(jù)對(duì)象加鎖,從而出現(xiàn)死鎖等待。防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法。一次封鎖法一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。例如,在上圖的例子中,如果事務(wù)T1將數(shù)據(jù)對(duì)象A和B一次加鎖,T1就可以執(zhí)行下去,而T2等待。T1執(zhí)行完后釋放A,B上的鎖,T2繼續(xù)執(zhí)行。這樣就不會(huì)發(fā)生死鎖。一次封鎖法雖然可以有效地防止死鎖的發(fā)生,但也存在問(wèn)題。首先,一次就將以后要用到的全部數(shù)據(jù)加鎖,勢(shì)必?cái)U(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。其次,數(shù)據(jù)庫(kù)中數(shù)據(jù)是不斷變化的,原來(lái)不要求封鎖的數(shù)據(jù),在執(zhí)行過(guò)程中可能會(huì)變成封鎖對(duì)象,所以很難實(shí)現(xiàn)精確地確定每個(gè)事務(wù)所要封鎖的數(shù)據(jù)對(duì)象,只能采取擴(kuò)大封鎖范圍,將事務(wù)在執(zhí)行過(guò)程中可能要封鎖的數(shù)據(jù)對(duì)象全部加鎖,這就進(jìn)一步降低了并發(fā)度。
順序封鎖法順序封鎖法是預(yù)先對(duì)數(shù)據(jù)對(duì)象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序執(zhí)行封鎖。在上例中,我們規(guī)定封鎖順是A,B,T1和T2都按此順序封鎖,即T2也必須先封鎖A。當(dāng)T2請(qǐng)求A的封鎖時(shí),由于T1已經(jīng)封鎖住A,T2就只能等待。T1釋放A,B上的鎖后,T2繼續(xù)運(yùn)行。這樣就不會(huì)發(fā)生死鎖。順序封鎖法同樣可以有效地防止死鎖,但也同樣存在問(wèn)題。首先,數(shù)據(jù)庫(kù)系統(tǒng)中可封鎖的數(shù)據(jù)對(duì)象及其眾多,并且隨數(shù)據(jù)的插入、刪除等操作而不斷地變化,要維護(hù)這樣極多而且變化的資源的封鎖順序非常困難,成本很高。其次,事務(wù)的封鎖請(qǐng)求可以隨著事務(wù)的執(zhí)行而動(dòng)態(tài)地決定,很難事先確定每一個(gè)事務(wù)要封鎖哪些對(duì)象,因此也就很難按規(guī)定的順序取施加封鎖。例如,規(guī)定數(shù)據(jù)對(duì)象的封鎖順序?yàn)锳,B,C,D,E。事務(wù)T3起初要求封鎖數(shù)據(jù)對(duì)象B,C,E,但當(dāng)它封鎖B,C后,才發(fā)現(xiàn)還需要封鎖A,這樣就破壞了封鎖順序??梢?jiàn),在操作系統(tǒng)中廣為采用的預(yù)防死鎖的策略并不很適合數(shù)據(jù)庫(kù)的特點(diǎn),因此DBMS在解決死鎖的問(wèn)題上更普遍采用的是診斷并解除死鎖的方法。(2)死鎖的診斷與解除超時(shí)法如果一個(gè)事務(wù)的等待時(shí)間超過(guò)了規(guī)定的時(shí)限,就認(rèn)為發(fā)生了死鎖。超時(shí)法實(shí)現(xiàn)簡(jiǎn)單,但其不足也很明顯。一是有可能誤判死鎖,事務(wù)因?yàn)槠渌蚴沟却龝r(shí)間超過(guò)時(shí)限,系統(tǒng)會(huì)誤認(rèn)為發(fā)生了死鎖。二是時(shí)限若設(shè)置得太長(zhǎng),死鎖發(fā)生后不能及時(shí)發(fā)現(xiàn)。等待圖法事務(wù)等待圖是一個(gè)有向圖G=(T,U),T為結(jié)點(diǎn)的集合,每個(gè)結(jié)點(diǎn)表示正運(yùn)行的事務(wù);U為邊的集合,每條邊表示事務(wù)等待的情況。若T1等待T2,則T1、T2之間劃一條有向邊,從T1指向T2。事務(wù)等待圖動(dòng)態(tài)地反映了所有事務(wù)的等待情況。并發(fā)控制子系統(tǒng)周期性地(比如每隔1分鐘)檢測(cè)事務(wù)等待圖,如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。
DBMS的并發(fā)控制子系統(tǒng)一旦檢測(cè)到系統(tǒng)中存在死鎖,就要設(shè)法解除。通常采用的方法是選擇一個(gè)處理死鎖代價(jià)最小的事務(wù),將其撤消,釋放此事務(wù)持有的所有的鎖,使其它事務(wù)得以繼續(xù)運(yùn)行下去。當(dāng)然,對(duì)撤消的事務(wù)所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復(fù)。7.3.3并發(fā)調(diào)度的可串行性計(jì)算機(jī)系統(tǒng)對(duì)并發(fā)事務(wù)中并發(fā)操作的調(diào)度是隨機(jī)的,而不同的調(diào)度可能會(huì)產(chǎn)生不同的結(jié)果,那么哪個(gè)結(jié)果是正確的,哪個(gè)是不正確的呢?如果一個(gè)事務(wù)運(yùn)行過(guò)程中沒(méi)有其他事務(wù)同時(shí)運(yùn)行,也就是說(shuō)它沒(méi)有受到其他事務(wù)的干擾,那么就可以認(rèn)為該事務(wù)的運(yùn)行結(jié)果是正常的或者預(yù)想的。因此將所有事務(wù)串行起來(lái)的調(diào)度策略一定是正確的調(diào)度策略。雖然以不同的順序串行執(zhí)行事務(wù)可能會(huì)產(chǎn)生不同的結(jié)果,但由于不會(huì)將數(shù)據(jù)庫(kù)置于不一致?tīng)顟B(tài),所以都是正確的。并發(fā)調(diào)度的可串行性是指多個(gè)事務(wù)的并發(fā)執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行它們時(shí)的結(jié)果相同,我們稱(chēng)這種調(diào)度策略為可串行化(Serializable)的調(diào)度??纱行裕⊿erializability)是并發(fā)事務(wù)正確性的準(zhǔn)則。按這個(gè)準(zhǔn)則規(guī)定,一個(gè)給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認(rèn)為是正確調(diào)度。下面給出串行執(zhí)行、并發(fā)執(zhí)行(不正確)以及并發(fā)執(zhí)行可以串行化(正確)的例子。以銀行轉(zhuǎn)賬為例,事物T1從賬號(hào)A(初值為200元)轉(zhuǎn)100元到賬號(hào)B(初值為200元),事物T2從賬號(hào)A轉(zhuǎn)10%的款項(xiàng)到賬號(hào)B,T1和T2具體執(zhí)行過(guò)程如下。事物T1和事物T2串行化調(diào)度的方案如表7.7所示。表7.7可串行化調(diào)度為了保證并發(fā)操作的正確性,DBMS的并發(fā)控制機(jī)制必須提供一定的手段來(lái)保證調(diào)度是可串行化的。從理論上講,在某一事務(wù)執(zhí)行時(shí)禁止其他事務(wù)執(zhí)行的調(diào)度策略一定是可串行化的調(diào)度,這也是最簡(jiǎn)單的調(diào)度策略,但這種方法實(shí)際上是不可取的,這使用戶不能充分共享數(shù)據(jù)庫(kù)資源。目前DBMS普遍采用封鎖方法實(shí)現(xiàn)并發(fā)操作調(diào)度的可串行性,從而保證調(diào)度的正確性。兩段鎖(Two-PhaseLocking,簡(jiǎn)稱(chēng)2PL)協(xié)議就是保證并發(fā)調(diào)度可串行性的封鎖協(xié)議。除此之外還有其他一些方法,如時(shí)標(biāo)方法、樂(lè)觀方法等來(lái)保證調(diào)度的正確性。7.3.4兩段鎖協(xié)議所謂兩段鎖協(xié)議是指所有事務(wù)必須分兩個(gè)階段對(duì)數(shù)據(jù)項(xiàng)加鎖和解鎖。在對(duì)任何數(shù)據(jù)進(jìn)行讀、寫(xiě)操作之前,首先要申請(qǐng)并獲得對(duì)該數(shù)據(jù)的封鎖。在釋放一個(gè)封鎖之后,事務(wù)不再申請(qǐng)和獲得任何其他封鎖。所謂“兩段”鎖的含義是,事務(wù)分為兩個(gè)階段,第一階段是獲得封鎖,也稱(chēng)為擴(kuò)展階段。這在階段,事務(wù)可以申請(qǐng)獲得任何數(shù)據(jù)項(xiàng)上的任何類(lèi)型的鎖,但是不能釋放任何鎖。第二階段是釋放封鎖,也稱(chēng)為收縮階段。在這階段,事務(wù)可以釋放任何數(shù)據(jù)項(xiàng)上的任何類(lèi)型的瑣,但是不能再申請(qǐng)任何瑣。例如事務(wù)T1遵守兩段鎖協(xié)議,其封鎖序列是:又如事務(wù)T2不遵守兩段鎖協(xié)議,其封鎖序列是:SlockA…UnlockA…SlockB…XlockC…UnlockC…UnlockB可以證明,若并發(fā)執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議,則對(duì)這些事務(wù)的任何并發(fā)調(diào)度策略都是可串行化的。需要說(shuō)明的是,事物遵循兩段鎖協(xié)議是可串行化調(diào)度的充分條件,而不是必要條件。也就是說(shuō),若并發(fā)事物都遵循兩段鎖協(xié)議,則對(duì)這些事物的任何并發(fā)調(diào)度策略都是可串行化的;若對(duì)并發(fā)事物的一個(gè)調(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ā)控制的一般原則與方法,下面簡(jiǎn)單介紹SQLServer數(shù)據(jù)庫(kù)系統(tǒng)中的并發(fā)控制機(jī)制。SQLServer提供了一套的安全保護(hù)機(jī)制,具有高的安全性、完整性以及并發(fā)控制和故障恢復(fù)的數(shù)據(jù)控制能力。SQLServer支持廣泛的并發(fā)控制機(jī)制,通過(guò)制定下列各項(xiàng),用戶可以指定并發(fā)控制類(lèi)型:(1)用于連接的事物隔離級(jí)別。(2)游標(biāo)上的并發(fā)選項(xiàng)。這些特性可以通過(guò)Transact-SQL語(yǔ)句或數(shù)據(jù)庫(kù)API(如ADO、OLEDB和ODBC)的屬性和特性定義。SQLServer的鎖模式包括:共享鎖、更新鎖、排它鎖、意向鎖和架構(gòu)鎖。鎖模式表明連接與鎖定對(duì)象所具有的相關(guān)性等級(jí)。SQLServer控制鎖模式的交互方式。例如,如果其他連接對(duì)資源具有共享鎖,則不能獲得排它鎖。SQLServer鎖保持的時(shí)間長(zhǎng)度為保護(hù)所請(qǐng)求級(jí)別上的資源所需的時(shí)間長(zhǎng)度。(1)用于保護(hù)讀取操作的共享鎖的保持時(shí)間取決于事物隔離級(jí)別。采用ReadCommitted的默認(rèn)事物隔離級(jí)別時(shí),只在讀取頁(yè)的期間內(nèi)控制共享鎖。在掃描中,直到在掃描內(nèi)的下一頁(yè)上獲取鎖時(shí)才釋放鎖。如果指定Holdlock提示或者將事物隔離級(jí)別設(shè)置為RepeatableRead或Serializable,則直到事物結(jié)束才釋放鎖。(2)根據(jù)為游標(biāo)設(shè)置的并發(fā)控制,游標(biāo)可以獲取共享模式的滾動(dòng)鎖以保護(hù)提取。當(dāng)需要滾動(dòng)鎖時(shí),直到下一次提取或關(guān)閉游標(biāo)(以先發(fā)生者為準(zhǔn))時(shí)才釋放滾動(dòng)鎖。但是,如果指定Holdlock,則直到事物結(jié)束才釋放滾動(dòng)鎖。(3)用于保護(hù)更新的排它鎖將直到事物結(jié)束才釋放。在SQLServer中,如果一個(gè)連接試圖獲取一個(gè)鎖,而該鎖與另一個(gè)連接所控制的鎖沖突,則試圖獲取鎖的連接將一直阻塞到:(1)將沖突鎖釋放而且連接獲取了所請(qǐng)求的鎖。(2)連接的超時(shí)間隔已到期。默認(rèn)情況下沒(méi)有超時(shí)間隔,但是一些應(yīng)用程序設(shè)置超時(shí)間隔以防止無(wú)限期等待。如果幾個(gè)連接因在某個(gè)單獨(dú)的資源上等待沖突的鎖而被阻塞,那么在前面的連接釋放鎖時(shí)將按先來(lái)先服務(wù)的方式授予鎖。SQLServer有一個(gè)算法可以檢測(cè)死鎖,即兩個(gè)連接互相阻塞的情況。如果SQLServer實(shí)例檢測(cè)到死鎖,將終止一個(gè)事物,以使另一個(gè)事物繼續(xù)。7.4安全性7.4.1安全性概述數(shù)據(jù)庫(kù)是一個(gè)共享的資源,其中存放了組織、企業(yè)和個(gè)人的各種信息,有的是比較一般的、可以公開(kāi)的數(shù)據(jù),而有的可能是非常關(guān)鍵的或機(jī)密的數(shù)據(jù),例如國(guó)家軍事秘密、銀行儲(chǔ)蓄數(shù)據(jù)、證券投資信息、個(gè)人Internet賬戶信息等。如果對(duì)數(shù)據(jù)庫(kù)控制不嚴(yán),就有可能使重要的數(shù)據(jù)被泄露出去,甚至?xí)艿讲环ǚ肿拥钠茐?。因此,必須?yán)格控制用戶對(duì)數(shù)據(jù)庫(kù)的使用,這是由數(shù)據(jù)庫(kù)的安全性控制來(lái)完成的。所謂數(shù)據(jù)庫(kù)的安全性就是指保護(hù)數(shù)據(jù),以防止不合法的使用所造成的數(shù)據(jù)泄漏、更改或破壞。隨著計(jì)算機(jī)資源共享和網(wǎng)絡(luò)技術(shù)的應(yīng)用日益廣泛和深入,特別是Internet技術(shù)的發(fā)展,計(jì)算機(jī)安全性問(wèn)題越來(lái)越得到人們的重視。網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)需要考慮的安全問(wèn)題主要包括以下五個(gè)層面的問(wèn)題:(1)硬件平臺(tái)的安全問(wèn)題:確保支持?jǐn)?shù)據(jù)庫(kù)系統(tǒng)運(yùn)行的硬件設(shè)施的安全。(2)網(wǎng)絡(luò)系統(tǒng)的安全問(wèn)題:對(duì)于可以遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù)的系統(tǒng)來(lái)說(shuō),網(wǎng)絡(luò)軟件內(nèi)部的安全性也非常重要。
(3)操作系統(tǒng)安全問(wèn)題:安全的操作系統(tǒng)是安全的數(shù)據(jù)庫(kù)的重要前提。操作系統(tǒng)應(yīng)能保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)必須經(jīng)由DBMS方可訪問(wèn),不容許用戶超越DBMS直接通過(guò)操作系統(tǒng)進(jìn)入數(shù)據(jù)庫(kù)。也就是說(shuō),數(shù)據(jù)庫(kù)必須時(shí)刻處在DBMS監(jiān)控之下,即使通過(guò)操作系統(tǒng)要訪問(wèn)數(shù)據(jù)庫(kù),也必須在DBMS中辦理注冊(cè)手續(xù)。這就是操作系統(tǒng)中安全性保護(hù)基本要點(diǎn)。(4)數(shù)據(jù)庫(kù)系統(tǒng)的安全問(wèn)題:進(jìn)行用戶標(biāo)識(shí)和鑒定、數(shù)據(jù)庫(kù)存取控制,只允許合法用戶進(jìn)入系統(tǒng)并進(jìn)行合法的數(shù)據(jù)存取操作。(5)應(yīng)用系統(tǒng)的安全問(wèn)題:防止對(duì)應(yīng)用系統(tǒng)的不合法使用所造成的數(shù)據(jù)泄密、更改或破壞。在上述五層安全體系中,任何一個(gè)環(huán)節(jié)出現(xiàn)安全漏洞,都可能導(dǎo)致整個(gè)安全體系的崩潰。本節(jié)將介紹數(shù)據(jù)庫(kù)系統(tǒng)的安全問(wèn)題。7.4.2安全性控制在一般計(jì)算機(jī)安全系統(tǒng)中,安全措施是一級(jí)一級(jí)層層設(shè)置的。例如數(shù)據(jù)庫(kù)系統(tǒng)的安全,用戶要求進(jìn)入計(jì)算機(jī)系統(tǒng)時(shí),系統(tǒng)首先根據(jù)輸入的用戶標(biāo)識(shí)進(jìn)行身份鑒定,只有合法的用戶才獲準(zhǔn)進(jìn)入計(jì)算機(jī)系統(tǒng)。對(duì)已進(jìn)入系統(tǒng)的用戶,DBMS還要進(jìn)行存取控制,只允許用戶執(zhí)行合法操作。操作系統(tǒng)一級(jí)也會(huì)有自己的保護(hù)措施。數(shù)據(jù)最后還可以以密碼形式存儲(chǔ)到數(shù)據(jù)庫(kù)中。在這里只討論與數(shù)據(jù)庫(kù)有關(guān)的用戶標(biāo)識(shí)語(yǔ)鑒別、存取控制、數(shù)據(jù)庫(kù)審計(jì)等安全技術(shù)。1、用戶標(biāo)識(shí)與鑒別用戶標(biāo)識(shí)與鑒別是系統(tǒng)提供的最外層安全保護(hù)措施。其方法是由系統(tǒng)提供一定的方式讓用戶標(biāo)識(shí)自己的名字和身份。每次用戶要求進(jìn)入系統(tǒng)時(shí),由系統(tǒng)進(jìn)行核對(duì),通過(guò)鑒定后才提供機(jī)器使用權(quán)。對(duì)于獲得上機(jī)權(quán)的用戶若要使用數(shù)據(jù)庫(kù)時(shí),DBMS還要進(jìn)行用戶標(biāo)識(shí)和鑒定。用戶標(biāo)識(shí)和鑒定的方法有很多種,而且在一個(gè)系統(tǒng)中一般是許多方法并存,以獲得更強(qiáng)的安全性。用戶標(biāo)識(shí)和鑒別的方法很多,常用的方法有:1)身份認(rèn)證用戶的身份,是系統(tǒng)管理員為用戶定義的用戶名(也稱(chēng)為用戶標(biāo)識(shí)、用戶賬號(hào)、用戶ID),并記錄在計(jì)算機(jī)系統(tǒng)或DBMS中。身份認(rèn)證,是指系統(tǒng)對(duì)輸入的用戶名與合法用戶名對(duì)照,鑒別此用戶是否為合法用戶。若是,則可以進(jìn)入下一步的核實(shí);否則,不能使用系統(tǒng)。例如,在網(wǎng)上書(shū)店系統(tǒng)的設(shè)計(jì)中,設(shè)置了用戶的帳戶。2)密碼認(rèn)證用戶的密碼,是合法用戶自己定義的密碼。為保密起見(jiàn),密碼由合法用戶自己定義并可以隨時(shí)變更。密碼認(rèn)證是為了進(jìn)一步對(duì)用戶核實(shí)。通常系統(tǒng)要求用戶輸入密碼,只有密碼正確才能進(jìn)入系統(tǒng)。例如,在網(wǎng)上書(shū)店系統(tǒng)的設(shè)計(jì)中,設(shè)置了用戶的密碼。3)隨機(jī)數(shù)運(yùn)算認(rèn)證隨機(jī)數(shù)認(rèn)證實(shí)際上是非固定密碼的認(rèn)證,即用戶的密碼每次都是不同的。鑒別時(shí)系統(tǒng)提供一個(gè)隨機(jī)數(shù),用戶根據(jù)預(yù)先約定的計(jì)算過(guò)程或計(jì)算函數(shù)進(jìn)行計(jì)算,并將計(jì)算結(jié)果輸送到計(jì)算機(jī),系統(tǒng)根據(jù)用戶計(jì)算結(jié)果判定用戶是否合法。例如算法為:“密碼=隨機(jī)數(shù)平方的后2位”,出現(xiàn)的隨機(jī)數(shù)是32,則密碼是24。2、存取控制作為共享資源的數(shù)據(jù)庫(kù)有很多用戶,其中有些人有權(quán)更新數(shù)據(jù)庫(kù)的數(shù)據(jù),有些人卻只能查詢(xún)數(shù)據(jù),有些人僅有權(quán)操作數(shù)據(jù)中的某幾個(gè)表或視圖,而有些人卻可以操作數(shù)據(jù)庫(kù)中的全部數(shù)據(jù)。因此,DBMS必須提供一種有效的機(jī)制,以確保數(shù)據(jù)庫(kù)中的數(shù)據(jù)僅被那些有權(quán)存取數(shù)據(jù)的用戶存取。1)DBMS的存取控制機(jī)制DBMS的存取控制包括3個(gè)方面的內(nèi)容:
(1)DBMS規(guī)定用戶想要操作數(shù)據(jù)庫(kù)中的數(shù)據(jù),必須擁有相應(yīng)的權(quán)限。例如,為了建立數(shù)據(jù)庫(kù)中的基本表,必須擁有CreateTable的權(quán)限,該權(quán)限屬于DBA。如果數(shù)據(jù)庫(kù)中的基本表有很多,為減輕工作強(qiáng)度,DBA也可以將CreateTable的權(quán)限授予普通用戶,擁有此權(quán)限的普通用戶就可以建立基本表。又如,為將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)則必須擁有對(duì)基本表的Insert權(quán)限,有時(shí)可能還需要其他權(quán)限??紤]某個(gè)想執(zhí)行下面語(yǔ)句的用戶需要擁有哪些權(quán)限。
InsertInto圖書(shū)表(圖書(shū)類(lèi)型編碼)
Select圖書(shū)類(lèi)型編碼
From圖書(shū)類(lèi)型表
Where圖書(shū)類(lèi)型名稱(chēng)=“金融”首先,因?yàn)橐獙?shù)據(jù)插入到“男生成績(jī)表”,所以需要擁有對(duì)“男生成績(jī)表”的Insert權(quán)限。其次,由于上面的Insert語(yǔ)句包含兩個(gè)子查詢(xún),因此還需要擁有對(duì)“成績(jī)表”和“學(xué)生信息表”的Select權(quán)限。在前面中討論了SQL語(yǔ)言的安全性控制功能,即SQL得Grant語(yǔ)句和Revoke語(yǔ)句,這里簡(jiǎn)單回顧一下。例如,“學(xué)生信息表”的創(chuàng)建者自動(dòng)獲得對(duì)該表的Select,Insert,Update,和Delete等權(quán)限,這些權(quán)限可以通過(guò)Grant語(yǔ)句轉(zhuǎn)授給其他用戶。例如:GrantSelect,InsertOnTable用戶表To李林WithGrantOption;就將“用戶表”的Select和Insert權(quán)限授予了用戶李林,后面的“WithGrantOption”子句表示用戶李林同時(shí)也獲得了“授權(quán)”的權(quán)限,即可以把得到的權(quán)限繼續(xù)授予其他用戶。
當(dāng)用戶將某些權(quán)限授給其他用戶后,他可以使用Revoke語(yǔ)句將權(quán)限收回,例如:
RevokeInsertOnTable用戶表
From李林
Cascade;就將“用戶表”的Insert權(quán)限從用戶李林處收回,選項(xiàng)Cascade表示,如果用戶李林將“用戶表”的Insert權(quán)限又轉(zhuǎn)授給了其他用戶,那么這些權(quán)限也將從其他用戶處收回。使用這些語(yǔ)句,具有授權(quán)資格的DBA和數(shù)據(jù)庫(kù)對(duì)象的所有者就可以定義用戶的權(quán)限,但一個(gè)用戶所擁有的權(quán)限不一定是永久的,因?yàn)槿绻跈?quán)者認(rèn)為被授權(quán)者變得不可靠,或由于工作調(diào)動(dòng)被授權(quán)者不再適合擁有相應(yīng)的權(quán)限時(shí),就可以將權(quán)限從被授權(quán)者處收回。(2)DBMS將授權(quán)結(jié)果存放于數(shù)據(jù)字典。(3)當(dāng)用戶提出操作請(qǐng)求時(shí),DBMS會(huì)根據(jù)數(shù)據(jù)字典中保存的授權(quán)信息,判斷用戶是否有權(quán)對(duì)相應(yīng)的對(duì)象進(jìn)行操作,若無(wú)權(quán)則拒絕執(zhí)行操作。2)DBMS的存取控制方法DBMS的存取控制主要分為自主存取控制(DiscretionaryAccessControl,DAC),強(qiáng)制存取控制(MandatoryAccessControl,MAC)和基于角色的存取控制(RoleBasedAccessControl,RBAC)。(1)自主訪問(wèn)控制自主訪問(wèn)控制基于用戶的身份和訪問(wèn)控制規(guī)則。首先檢查用戶的訪問(wèn)請(qǐng)求,若存在授權(quán),則允許訪問(wèn),否則拒絕。在自主訪問(wèn)控制方法中,用戶對(duì)于不同的數(shù)據(jù)對(duì)象可以有不同的存取權(quán)限,不同的用戶對(duì)同一數(shù)據(jù)對(duì)象的存取權(quán)限也可以各不相同,用戶還可以將自己擁有的存取權(quán)限轉(zhuǎn)授給其他用戶。用戶自主訪問(wèn)控制的主要缺點(diǎn)是較難控制已被賦予的訪問(wèn)權(quán)限,這使得自主訪問(wèn)控制策略易遭受木馬程序的惡意攻擊。(2)強(qiáng)制訪問(wèn)控制強(qiáng)制型存取控制系統(tǒng)主要通過(guò)對(duì)主體和客體已分配的安全屬性進(jìn)行匹配判斷,決定主體是否有權(quán)對(duì)客體進(jìn)行進(jìn)一步的訪問(wèn)操作。在強(qiáng)制存取控制方法中,每一個(gè)數(shù)據(jù)對(duì)象被標(biāo)以一定得安全級(jí)別;每一個(gè)用戶也被授予某一個(gè)級(jí)別的安全許可。對(duì)于任意一個(gè)對(duì)象,只有具有合法許可的用戶才可以存取。而且一般情況下不能改變?cè)撌跈?quán)狀態(tài),這也是強(qiáng)制型存取控制模型與自主型存取控制模型實(shí)質(zhì)性的區(qū)別。為了保證數(shù)據(jù)庫(kù)系統(tǒng)的安全性能,只要具有特定系統(tǒng)權(quán)限的管理員才能根據(jù)系統(tǒng)實(shí)際需要來(lái)修改系統(tǒng)的授權(quán)狀態(tài),而一般用戶或程序不能修改。
(3)基于角色訪問(wèn)控制RBAC是由美國(guó)GeorgeMason大學(xué)RaviSandhu于1994年提出的,它解決了具有大量用戶、數(shù)據(jù)庫(kù)客體和各種訪問(wèn)權(quán)限的系統(tǒng)中的授權(quán)管理問(wèn)題。其中主要涉及用戶、角色、訪問(wèn)權(quán)限、會(huì)話等概念。角色是訪問(wèn)權(quán)的集合。當(dāng)用戶被賦予一個(gè)角色時(shí),用戶具有這個(gè)角色所包含的所有訪問(wèn)權(quán)。用戶、角色、訪問(wèn)權(quán)限3者之間是多對(duì)多的關(guān)系。數(shù)據(jù)庫(kù)安全性的重點(diǎn)是DBMS的存取控制機(jī)制。數(shù)據(jù)庫(kù)安全主要通過(guò)數(shù)據(jù)庫(kù)系統(tǒng)的存取控制機(jī)制來(lái)確保只授權(quán)給有資格的用戶訪問(wèn)數(shù)據(jù)庫(kù)的權(quán)限,同時(shí)令所有未被授權(quán)的人員無(wú)法接近數(shù)據(jù)。3、數(shù)據(jù)庫(kù)審計(jì)審計(jì)功能就是把用戶對(duì)數(shù)據(jù)庫(kù)的所有操作自動(dòng)記錄下來(lái)放入審計(jì)日志(AuditLog)中,一旦發(fā)生數(shù)據(jù)被非法存取,DBA可以利用審計(jì)跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫(kù)現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時(shí)間和內(nèi)容等。由于任何系統(tǒng)的安全保護(hù)措施都不可能無(wú)懈可擊,蓄意盜取、破壞數(shù)據(jù)的人總是想方設(shè)法打破控制,因此審計(jì)功能在維護(hù)數(shù)據(jù)安全、打擊犯罪方面是非常有效的。審計(jì)通常是很費(fèi)時(shí)間和空間的,因此DBA要根據(jù)應(yīng)用對(duì)安全性的要求,靈活打開(kāi)或關(guān)閉審計(jì)功能。審計(jì)功能一般主要用于安全性較高的部門(mén)。4.視圖機(jī)制進(jìn)行存取權(quán)限控制時(shí)我們可以為不同的用戶定義不同的視圖,把數(shù)據(jù)對(duì)象限制在一定的范圍內(nèi),也就是說(shuō),通過(guò)視圖機(jī)制把要保密的數(shù)據(jù)對(duì)無(wú)權(quán)存取的用戶隱藏起來(lái),從而自動(dòng)地對(duì)數(shù)據(jù)提供一定程度的安全保護(hù)。視圖機(jī)制間接地實(shí)現(xiàn)了支持存取謂詞的用戶權(quán)限定義。在不直接支持存取謂詞的系統(tǒng)中,我們可以先建立視圖,然后在視圖上進(jìn)一步定義存取權(quán)限。5.?dāng)?shù)據(jù)加密對(duì)于高度敏感性數(shù)據(jù),例如財(cái)務(wù)數(shù)據(jù)、軍事數(shù)據(jù)、國(guó)家機(jī)密,除以上安全性措施外,還可以采用數(shù)據(jù)加密技術(shù)。數(shù)據(jù)加密是防止數(shù)據(jù)庫(kù)中數(shù)據(jù)在存儲(chǔ)和傳輸中失密的有效手段。加密的基本思想是根據(jù)一定的算法將原始數(shù)據(jù)(術(shù)語(yǔ)為明文,Plaintext)變換為不可直接識(shí)別的格式(術(shù)語(yǔ)為密文,Ciphertext),從而使得不知道解密算法的人無(wú)法獲知數(shù)據(jù)的內(nèi)容。加密方法主要有兩種,一種是替換方法,該方法使用密鑰(EncryptionKey)將明文中的每一個(gè)字符轉(zhuǎn)換為密文中的一個(gè)字符。另一種是置換方法,該方法僅將明文的字符按不同的順序重新排列。單獨(dú)使用這兩種方法的任意一種都是不夠安全的。但是將這兩種方法結(jié)合起來(lái)就能提供相當(dāng)高的安全程度。采用這種結(jié)合算法的例子是美國(guó)1977年制定的官方加密標(biāo)準(zhǔn),數(shù)據(jù)加密標(biāo)準(zhǔn)(DataEncryptionStandard,簡(jiǎn)稱(chēng)DES)。有關(guān)DES秘密密鑰加密技術(shù)及密鑰管理問(wèn)題等,這里不再討論。7.4.3統(tǒng)計(jì)數(shù)據(jù)庫(kù)安全性一般地,統(tǒng)計(jì)數(shù)據(jù)庫(kù)允許用戶查詢(xún)聚集類(lèi)型的信息(例如合計(jì)、平均值等),但是不允許查詢(xún)單個(gè)記錄信息。例如,在高校管理系統(tǒng)中,查詢(xún)“講師的平均工資是多少?”是合法的,但是查詢(xún)“講師王兵的工資是多少?”就不允許。在統(tǒng)計(jì)數(shù)據(jù)庫(kù)中存在著特殊的安全性問(wèn)題,即可能存在著隱蔽的信息通道,使得可以從合法的查詢(xún)中推導(dǎo)出不合法的信息。例如下面兩個(gè)查詢(xún)都是合法的:本校共有多少女工程師?本校女工程師的工資總額是多少?如果第一個(gè)查詢(xún)的結(jié)果是“1”,那么第二個(gè)查詢(xún)的結(jié)果顯然就是這個(gè)女工程師的工資數(shù)。這樣統(tǒng)計(jì)數(shù)據(jù)庫(kù)的安全性機(jī)制就失效了。為了解決這個(gè)問(wèn)題,我們可以規(guī)定任何查詢(xún)至少要涉及N(N足夠大)個(gè)以上的記錄。但是即使這樣,還是存在另外的泄密途徑,例如下面的例子:某個(gè)用戶X想知道另一用戶Y的工資數(shù)額,他可以通過(guò)下列兩個(gè)合法查詢(xún)獲?。河脩鬤和其他N個(gè)工程師的工資總額是多少?用戶Y和其他N個(gè)工程師的工資總額是多少?假設(shè)第一個(gè)查詢(xún)的結(jié)果是A,第二個(gè)查詢(xún)的結(jié)果是B,由于用戶X知道自己的工資是C,那么他可以計(jì)算出用戶Y的工資=B-(A-C)。無(wú)論采用什么安全性機(jī)制,都仍然會(huì)存在繞過(guò)這些機(jī)制的途徑。好的安全性措施應(yīng)該使得那些試圖破壞安全的人所花費(fèi)的代價(jià)遠(yuǎn)遠(yuǎn)超過(guò)他們所得到的利益,這也是整個(gè)數(shù)據(jù)庫(kù)安全機(jī)制設(shè)計(jì)的目標(biāo)。7.4.4SQLServer的安全性管理SQLServer為一個(gè)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)管理系統(tǒng),具有完備的安全機(jī)制,能夠確保數(shù)據(jù)庫(kù)中的信息不被非法盜用或破壞。SQLServer的安全機(jī)制可分為以下三個(gè)等級(jí):SQLServer的登錄安全性數(shù)據(jù)庫(kù)的訪問(wèn)安全性數(shù)據(jù)庫(kù)對(duì)象的使用安全性這三個(gè)等級(jí)如同三道閘門(mén),有效地抵御任何非法侵入,保衛(wèi)著數(shù)據(jù)庫(kù)中數(shù)據(jù)的安全。SQLServer的安全機(jī)制要比Windows系統(tǒng)復(fù)雜,這是因?yàn)榉?wù)器中的數(shù)據(jù)庫(kù)有多種多樣,為了數(shù)據(jù)的安全,必須考慮對(duì)不同的用戶分別給予不同的權(quán)限。比如,對(duì)于高校管理系統(tǒng)中的教學(xué)數(shù)據(jù)庫(kù)而言,一般學(xué)生允許訪問(wèn)課程表和選課表,進(jìn)行查詢(xún),但不得修改或刪除這兩個(gè)表中的數(shù)據(jù),只有有關(guān)教學(xué)管理人員用戶才有權(quán)添加、修改或刪除數(shù)據(jù),這樣將保證數(shù)據(jù)庫(kù)的正常有效使用。另外,如果在教師表中存有一些關(guān)于教師的私人信息(如工資、家庭住址等)時(shí),一般學(xué)生也不應(yīng)具備訪問(wèn)教師表的權(quán)限。1、SQLServer的身份驗(yàn)證模式用戶想操作SQLServer中某一數(shù)據(jù)庫(kù)中的數(shù)據(jù),必須滿足以下3個(gè)條件:首先,登錄SQLServer服務(wù)器時(shí)必須通過(guò)身份驗(yàn)證;其次,必須是該數(shù)據(jù)庫(kù)的用戶或者是某一數(shù)據(jù)庫(kù)角色的成員;最后,必須有執(zhí)行該操作的權(quán)限。從上面三個(gè)條件可以看出SQLServer數(shù)據(jù)庫(kù)的安全性檢查是通過(guò)登錄名、用戶、權(quán)限來(lái)完成的。1)Windows身份驗(yàn)證模式當(dāng)用戶通過(guò)WindowsNT/2000用戶賬戶進(jìn)行連接時(shí),SQLServer通過(guò)回叫WindowsNT/2000以獲得信息,重新驗(yàn)證賬戶名和密碼,并在syslogins表中查找該賬戶,以確定該賬戶是否有權(quán)限登錄。在這種方式下,用戶不必提供密碼或登錄名讓SQLServer驗(yàn)證。2)混合驗(yàn)證模式混合模式使用戶能夠通過(guò)Windows身份驗(yàn)證或SQLServer身份驗(yàn)證與SQLServer實(shí)例連接。在SQLServer驗(yàn)證模式下,SQLServer在syslogins表中檢測(cè)輸入的登錄名和密碼。如果在syslogins表中存在該登錄名,并且密碼也是匹配的,那么該登錄名可以登錄到SQLServer。否則,登錄失敗。在這種方式下,用戶必須提供登錄名和密碼,讓SQLServer驗(yàn)證。3)設(shè)置驗(yàn)證模式可以使用SQLServer企業(yè)管理器來(lái)設(shè)置或改變驗(yàn)證模式。(1)打開(kāi)企業(yè)管理器,展開(kāi)服務(wù)器組,右擊需要修改驗(yàn)證模
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 崗前培訓(xùn)考核制度
- 醫(yī)院培訓(xùn)獎(jiǎng)勵(lì)懲罰制度
- 招商人才培訓(xùn)制度匯編
- 校外培訓(xùn)薪酬制度
- 駐礦工作組培訓(xùn)制度
- 放射應(yīng)急培訓(xùn)制度
- 法務(wù)部培訓(xùn)制度
- 考試人培訓(xùn)制度
- 科室培訓(xùn)管理制度
- 重慶培訓(xùn)學(xué)校退費(fèi)制度
- 2025購(gòu)房合同(一次性付款)
- 云南省茶葉出口競(jìng)爭(zhēng)力分析及提升對(duì)策研究
- 銀行情緒與壓力管理課件
- 甲狀腺危象護(hù)理查房要點(diǎn)
- 《無(wú)人機(jī)飛行安全及法律法規(guī)》第3版全套教學(xué)課件
- 2025內(nèi)蒙古電力集團(tuán)招聘筆試考試筆試歷年參考題庫(kù)附帶答案詳解
- 交通警察道路執(zhí)勤執(zhí)法培訓(xùn)課件
- 十五五學(xué)校五年發(fā)展規(guī)劃(2026-2030)
- 洗浴員工協(xié)議書(shū)
- GB/T 17642-2025土工合成材料非織造布復(fù)合土工膜
- 清欠歷史舊賬協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論