六、數(shù)據(jù)庫的安全與保護(hù)
1.安全性
數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫以防止不合法的或非正常的使用所造成的數(shù)據(jù)泄露、更改或破壞。安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨(dú)有的,計算機(jī)系統(tǒng)都有這個問題。只是在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,而且為許多用戶直接共享,是十分重要的信息資源。從而使安全性問題變得更為突出。系統(tǒng)安全保護(hù)措施是否有效是數(shù)據(jù)庫系統(tǒng)的主要性能指標(biāo)之一。
對于數(shù)據(jù)庫的安全保密方式可以有系統(tǒng)處理的和物理的兩個方面。所謂物理的是指,對于強(qiáng)力逼迫透露口令、在通信線路上竊聽、以至盜竊物理存儲設(shè)備等行為,對此所采取的措施是將數(shù)據(jù)編為密碼,夾蕓警衛(wèi)以識別用戶身份和保護(hù)存儲設(shè)備等措施。在一般計算機(jī)系統(tǒng)中,安全措施是一級一級層層設(shè)置的。
。1)用戶標(biāo)識和鑒定
首先,系統(tǒng)提供一定的方式讓用戶標(biāo)識自己的名字或身份。系統(tǒng)進(jìn)行核實,通過鑒定后才提供機(jī)器使用權(quán)。常用的方法有:
用一個用戶名或者用戶標(biāo)識號來標(biāo)明用戶身份。系統(tǒng)鑒別此用戶是否是合法用戶。若是,則可以進(jìn)入下一步的核實;若不是,則不能使用計算機(jī)。用戶名的登錄只由系統(tǒng)管理員進(jìn)行,一般用戶不能實施用戶名登錄。
口令(Password),為了進(jìn)一步核實用戶,系統(tǒng)常常要求用戶輸入口令。
。2)存取控制
對于獲得上機(jī)權(quán)的用戶還要根據(jù)預(yù)先定義好的用戶權(quán)限進(jìn)行存取控制,保證用戶只能存取他有權(quán)存取的數(shù)據(jù)。所謂用戶權(quán)限是指不同的用戶對于不同的數(shù)據(jù)對象允許執(zhí)行的操作權(quán)限。它由兩部分組成,一是數(shù)據(jù)對象,二是操作類型。
數(shù)據(jù)對象有二類。一類是數(shù)據(jù)本身,如關(guān)系數(shù)據(jù)庫中的表、字段,非關(guān)系數(shù)據(jù)庫中的記錄、字段(亦稱為數(shù)據(jù)項)。另一類是外模式、模式、內(nèi)模式。在關(guān)系系統(tǒng)中DBA可以把建立、修改基本表的權(quán)力授予用戶,用戶獲得此權(quán)力后可以建立基本表、索引、視圖。這說明關(guān)系系統(tǒng)中存取控制的數(shù)據(jù)對象不僅有數(shù)據(jù)而且有模式、外模式、內(nèi)模式等數(shù)據(jù)字典中的內(nèi)容。
對于存取權(quán)限的定義稱為授權(quán)(Authorization)。這些定義經(jīng)過編譯后存儲在數(shù)據(jù)字典中。每當(dāng)用戶發(fā)出存取數(shù)據(jù)庫的操作請求后,DBMS查找數(shù)據(jù)字典,根據(jù)用戶權(quán)限進(jìn)行合法權(quán)限檢查(Authorization Check)。若用戶的操作請求超出了定義的權(quán)限,系統(tǒng)拒絕執(zhí)行此操作。授權(quán)編譯程序和合法權(quán)限檢查機(jī)制一起組成了安全性子系統(tǒng)。
衡量授權(quán)子系統(tǒng)精巧程度的另一個盡度是否提供與數(shù)據(jù)值有關(guān)的授權(quán)。
有的系統(tǒng)還允許存取謂詞中引用系統(tǒng)變量,如一天中的時刻,終端設(shè)備號。這樣用戶只能在某臺終端、某段時間內(nèi)存取有關(guān)數(shù)據(jù),這就是與時間和地點有關(guān)的存取權(quán)限。
另外,在操作系統(tǒng)中對文件、目標(biāo)等的存取還有一些安全保護(hù)措施。其中加密是一種防止數(shù)據(jù)內(nèi)容被別人引用或了解的切實可行的辦法。加密有程序加密和硬件加密卡兩種形式。
2.完整性
數(shù)據(jù)庫的完整性是指數(shù)據(jù)的正確性和相容性。DBMS必須提供一種功能來保證數(shù)據(jù)庫中數(shù)據(jù)的完整性。這種功能亦稱為完整性檢查,即系統(tǒng)用一定的機(jī)制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足規(guī)定的條件。這種條件在數(shù)據(jù)庫中稱為完整性約束條件。數(shù)據(jù)的約束條件是語義的體現(xiàn),這些完整性約束條件將作為模式的一部分存放數(shù)據(jù)字典中。
數(shù)據(jù)的完整性和安全性是兩個不同的概念。前者是為了防止數(shù)據(jù)庫中存在不符合語義的數(shù)據(jù),防止錯誤信息的輸入和輸出,即所謂垃圾進(jìn)垃圾出(Garbage In Garbage Out)所造成的無效操作和錯誤結(jié)果。而后者是保護(hù)數(shù)據(jù)庫防止惡意的破壞和非法的存取。當(dāng)然,完整性和安全性是密切相關(guān)的。特別從系統(tǒng)實現(xiàn)的方法來看,往往是一種機(jī)制常常既可用于安全性保護(hù)亦可用于完整性保證。
完整性約束條件可以分類如下:
。1)值的約束和結(jié)構(gòu)的約束
前者指對數(shù)據(jù)的值的限制,后者指對數(shù)據(jù)之間聯(lián)系的限制。
關(guān)于對數(shù)據(jù)值的約束 這類約束條件是指對數(shù)據(jù)取值類型、范圍、精度等的規(guī)定。
關(guān)于數(shù)據(jù)之間聯(lián)系的約束 數(shù)據(jù)庫中同一關(guān)系的不同屬性之間可以有一定的聯(lián)系,從而也應(yīng)滿足一定的約束條件。同時,由于數(shù)據(jù)庫中數(shù)據(jù)是結(jié)構(gòu)化的,不同的關(guān)系之間也可以有聯(lián)系,因而不同關(guān)系的屬性之間也可滿足一定的約束條件。
。2)靜態(tài)約束和動態(tài)約束
所謂靜態(tài)約束是指對數(shù)據(jù)庫每一確定狀態(tài)的數(shù)據(jù)所應(yīng)滿足的約束條件。以上所講的約束都屬靜態(tài)約束。動態(tài)約束是指數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時新、舊值之間所應(yīng)滿足的約束條件。
(3)立即執(zhí)行約束和延遲執(zhí)行約束
立即執(zhí)行約束是指在執(zhí)行用戶事務(wù)時,對事務(wù)中某一更新語句執(zhí)行完后馬上對此數(shù)據(jù)所應(yīng)滿足的約束條件進(jìn)行完整性檢查。延遲執(zhí)行是指在整個事務(wù)執(zhí)行結(jié)束后方對此約束條件進(jìn)行完整性檢查,結(jié)果正確方能提交。
完整性的實現(xiàn)應(yīng)包括兩個方面,一是系統(tǒng)要提供定義完整性約束條件的功能,二是提供檢查完整性約束條件的方法。
對于數(shù)據(jù)值的那類完整性約束條件通常在模式中定義。例如在模式中定義屬性名、類型、長度、碼屬性名并標(biāo)明其值是唯一的、非空的等等。另外的那些約束條件就要用專門的方式加以定義。
3.并發(fā)控
制數(shù)據(jù)庫是一個共享資源,可以由多個用戶使用。這些用戶程序可以一個一個地串行執(zhí)行,也可以并行執(zhí)行。在單CPU計算機(jī)上,為了充分利用數(shù)據(jù)庫資源,應(yīng)該允許多個用戶程序并行的存取數(shù)據(jù)。這樣就會產(chǎn)生多個用戶程度并發(fā)地存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就會存取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的完整性(這里也稱為一致性)。在多CPU計算機(jī)或多計算機(jī)網(wǎng)絡(luò)環(huán)境下,并發(fā)控制尤為重要。
。1)事務(wù)的概念 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂事務(wù)是一個操作序列。這些操作作為一個序列形成一個整體要么都做,要么都不做,是一個不可分割的工作單位。事務(wù)通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK操作結(jié)束。COMMIT即提交,提交事務(wù)中所有的操作,事務(wù)正常結(jié)束。ROLLBACK即撤消已作的所有操作,滾回到事務(wù)開始時的狀態(tài)。這里的操作指對數(shù)據(jù)庫的更新操作。滾回即相當(dāng)于所有操作均未執(zhí)行。
事務(wù)和程序是兩個概念。一般地講,一個程序可包括多個事務(wù),由于事務(wù)是并發(fā)控制的基本單位,所以下面的討論均以事務(wù)為對象。
。2)數(shù)據(jù)一致性級別的概念。
所謂并發(fā)控制就是要用正確的方式調(diào)度并發(fā)操作,避免造成數(shù)據(jù)的不一致性,使一個用戶事務(wù)的執(zhí)行不受其它事務(wù)的干擾。
4.封鎖
封鎖(Locking)就是事務(wù)T可以向系統(tǒng)發(fā)出請求,對某個數(shù)據(jù)對象(最常用的是記錄)加鎖。于是事務(wù)T對這個數(shù)據(jù)對象就有一定的控制。例如,其它事務(wù)不能更新此數(shù)據(jù)直到T釋放(unlock)它的鎖為止。確切的控制由封鎖的類型決定;镜姆怄i類型有兩種:排它鎖(Exclu sive locks簡記為X鎖)和共享鎖(Share locks簡記為S鎖)。
若事務(wù)T對數(shù)據(jù)R加上X鎖,則只允許T讀取和修改R;其它一切事務(wù)對R的任何(包括封鎖)請求都不成功,直至T釋放R上的X鎖為止。這就保證了其它事務(wù)不能再讀取和修改R,直到T釋放X鎖。
若事務(wù)T對數(shù)據(jù)R加上S鎖,則其它事務(wù)對R的X鎖請求不能成功,而對R的共享請求可以得到。這就保證了其它事務(wù)以讀取R但不能修改R,直至T釋放S鎖為止。
5.活鎖與死鎖
和操作系統(tǒng)一樣,封鎖的方法可能引起活鎖和死鎖。例如事務(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 有可能長期等待,這就是活鎖的情形。避免活鎖的簡單方法是采用先來先服務(wù)的策略。即讓封鎖子系統(tǒng)按請求封鎖的先后次序?qū)κ聞?wù)排隊。數(shù)據(jù)R上的鎖一旦釋放就批準(zhǔn)申請隊列中的第一個事務(wù)獲得鎖。
又如事務(wù)T1 封鎖了數(shù)據(jù)R1 T2 封鎖了數(shù)據(jù)R2 。然后T1 又請求封鎖R2 ,T2 請求封鎖R1 。于是T1 等待T2 釋放R2 上的封鎖而同時T2 等待T1 釋放R1 上的封鎖。這就使得兩個事務(wù)永遠(yuǎn)不能結(jié)束。出現(xiàn)了死鎖的局面。
6.可串行性
定義 當(dāng)且僅當(dāng)某組事務(wù)的一定交叉調(diào)度產(chǎn)生的結(jié)果和這些事務(wù)的某一串行調(diào)度的結(jié)果相同,則這個交叉調(diào)度是可串行化的。
可串行性(Serializability)是并行事務(wù)正確性的準(zhǔn)則。這個準(zhǔn)則規(guī)定,一給定的交叉調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認(rèn)為是正確的。
7.兩段鎖協(xié)議
兩段鎖協(xié)議規(guī)定所有的事務(wù)應(yīng)遵守下列規(guī)則:
。1)在對任何數(shù)據(jù)進(jìn)行讀、寫操作之前,事務(wù)首先要獲得對該數(shù)據(jù)的封鎖,而且:
。2)在釋放一個封鎖之后,事務(wù)不再獲得任何其它鎖。
所謂“兩段”鎖的含義是:事務(wù)分為兩個階段。第一階段是獲得封鎖,也稱為擴(kuò)展階段。第二階段是釋放封鎖,也稱為收縮階段。
定理 若所有事務(wù)均遵守兩段鎖協(xié)議,則這些事務(wù)的所有交叉調(diào)度都是可串行化的(證明略)。為了確保事務(wù)并行執(zhí)行的正確性,許多系統(tǒng)采用兩段鎖協(xié)議。同時系統(tǒng)設(shè)有死鎖檢測機(jī)制,發(fā)現(xiàn)死鎖后按一定的算法解除死鎖。
8.恢復(fù)
盡管系統(tǒng)中采取了各種保護(hù)措施來保證數(shù)據(jù)庫的安全性和完整性不被破壞,保證并行事務(wù)的正確執(zhí)行,但是計算機(jī)系統(tǒng)中硬件的故障、軟件的錯誤、操作員的失誤以及故意的破壞仍是不可避免的。這些故障輕則造成運(yùn)行事務(wù)非正常地中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分?jǐn)?shù)據(jù)丟失。因此數(shù)據(jù)庫管理系統(tǒng)必須具有把數(shù)擾庫從錯誤狀態(tài)恢復(fù)到某一已知的正確狀態(tài)(亦稱為完整狀態(tài)或一致狀態(tài))的功能,這就是數(shù)據(jù)庫的恢復(fù);謴(fù)子系統(tǒng)是數(shù)據(jù)庫管理系統(tǒng)的一個重要組成部分,而且還相當(dāng)龐大,常常占整個系統(tǒng)代碼的10%以上(如IMS、DB2)。故障恢復(fù)是否考慮周到和行之有效,是數(shù)據(jù)庫系統(tǒng)性能的一個重要指標(biāo)。大型的數(shù)據(jù)庫應(yīng)用對故障恢復(fù)的要求更夾蕓烈,有時甚至采用雙工制。
。1)故障的種類
數(shù)據(jù)庫系統(tǒng)中可能發(fā)生各種各樣的故障,大致可以分以下幾類:①事務(wù)內(nèi)部的故障;②系統(tǒng)范圍內(nèi)的故障;③介質(zhì)故障;④計算機(jī)病毒。
。2)轉(zhuǎn)儲和恢復(fù)
轉(zhuǎn)儲是數(shù)據(jù)庫恢復(fù)中經(jīng)常采用的基本技術(shù)。所謂轉(zhuǎn)儲即DBA定期地將整個數(shù)據(jù)庫復(fù)制到磁帶或另一個磁盤上保存起來的過程。這些備用的數(shù)據(jù)文本為后備副本或后援副本。當(dāng)數(shù)據(jù)庫遭到破壞后就可以利用后備副本把數(shù)據(jù)庫恢復(fù)。這時,數(shù)據(jù)庫只能恢復(fù)到轉(zhuǎn)儲時的狀態(tài),從那以后的所有更新事務(wù)必須重新運(yùn)行才能恢復(fù)到現(xiàn)時的正常狀態(tài)。
轉(zhuǎn)儲是十分耗費(fèi)時間和資源的,不能頻繁進(jìn)行。DBA應(yīng)該根據(jù)數(shù)據(jù)庫使用情況確定一個適當(dāng)?shù)霓D(zhuǎn)儲周期。
轉(zhuǎn)儲可分為靜態(tài)轉(zhuǎn)儲和動態(tài)轉(zhuǎn)儲。
靜態(tài)轉(zhuǎn)儲是指轉(zhuǎn)儲期間不允許(或不存在)對數(shù)據(jù)庫進(jìn)行任何存取、修改活動。
動態(tài)轉(zhuǎn)儲是指轉(zhuǎn)儲期間允許對數(shù)據(jù)庫進(jìn)行存取或修改。即轉(zhuǎn)儲和用戶事務(wù)可以并發(fā)執(zhí)行。靜態(tài)轉(zhuǎn)儲簡單,但轉(zhuǎn)儲必須等待用戶事務(wù)結(jié)束才能進(jìn)行。同樣,新的事務(wù)必須等待轉(zhuǎn)儲結(jié)束才能執(zhí)行。顯然,這會降低數(shù)據(jù)庫的可用性。
動態(tài)轉(zhuǎn)儲可克服靜態(tài)轉(zhuǎn)儲的缺點。但是,轉(zhuǎn)儲結(jié)束時后援副本上的數(shù)據(jù)并不能保證正確有效。例如,在轉(zhuǎn)儲期間的某時刻t1 系統(tǒng)把數(shù)據(jù)A=100轉(zhuǎn)儲到了磁帶上,而在時刻t2 ,某一事務(wù)對A進(jìn)行了修改使A=200轉(zhuǎn)儲結(jié)束,后援副本上的A已是過時的數(shù)據(jù)了。為此,必須把轉(zhuǎn)儲期間事務(wù)對數(shù)據(jù)庫的修改活動登記下來,建立日志文件(log file)。這樣,后援副本加上日志文件就能把數(shù)據(jù)庫恢復(fù)到某一時刻的正確狀態(tài)。轉(zhuǎn)儲還可以分為海量轉(zhuǎn)儲和增量轉(zhuǎn)儲。
海量轉(zhuǎn)儲是指每次轉(zhuǎn)儲全部數(shù)據(jù)庫。增量轉(zhuǎn)儲則指每次只轉(zhuǎn)儲上次轉(zhuǎn)儲后更新過的數(shù)據(jù)。如果數(shù)據(jù)庫很大,事務(wù)處理又十分頻繁,則增量轉(zhuǎn)儲方式是很有效的。
。3)日志文件
日志文件是用來記錄對數(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)行重做處理,對故障發(fā)生時尚未完成的事務(wù)進(jìn)行撤消處理。這樣不必重新運(yùn)行那些在轉(zhuǎn)儲前已完成的事務(wù)程序就可把數(shù)據(jù)庫恢復(fù)到故障前某一時刻的正確狀態(tài)。
希望與更多計算機(jī)等級考試的網(wǎng)友交流,請進(jìn)入計算機(jī)等級考試論壇
更多信息請訪問:考試吧計算機(jī)等級考試欄目
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |