為了保證數(shù)據(jù)庫數(shù)據(jù)的安全可靠性和正確有效,DBMS必須提供統(tǒng)一的數(shù)據(jù)保護(hù)功能。數(shù)據(jù)保護(hù)也為數(shù)據(jù)控制,主要包括數(shù)據(jù)庫的安全性、完整性、并發(fā)控制和恢復(fù)。
一、 數(shù)據(jù)庫的安全性
數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫以防止不合法的使用所造成的數(shù)據(jù)泄露、更改或破壞。計算機(jī)系統(tǒng)都有這個問題,在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,為許多用戶共享,使安全問題更為突出。
在一般的計算機(jī)系統(tǒng)中,安全措施是一級一級設(shè)置的。
在DB存儲這一級可采用密碼技術(shù),當(dāng)物理存儲設(shè)備失竊后,它起到保密作用。在數(shù)據(jù)庫系統(tǒng)這一級中提供兩種控制:用戶標(biāo)識和鑒定,數(shù)據(jù)存取控制。
在ORACLE多用戶數(shù)據(jù)庫系統(tǒng)中,安全機(jī)制作下列工作:
l 防止非授權(quán)的數(shù)據(jù)庫存取;
l 防止非授權(quán)的對模式對象的存??;
l 控制磁盤使用;
l 控制系統(tǒng)資源使用;
l 審計用戶動作。
數(shù)據(jù)庫安全可分為二類:系統(tǒng)安全性和數(shù)據(jù)安全性。
系統(tǒng)安全性是指在系統(tǒng)級控制數(shù)據(jù)庫的存取和使用的機(jī)制,包含:
l 有效的用戶名/口令的組合;
l 一個用戶是否授權(quán)可連接數(shù)據(jù)庫;
l 用戶對象可用的磁盤空間的數(shù)量;
l 用戶的資源限制;
l 數(shù)據(jù)庫審計是否是有效的;
l 用戶可執(zhí)行哪些系統(tǒng)操作。
數(shù)據(jù)安全性是指在對象級控制數(shù)據(jù)庫的存取和使用的機(jī)制,包含:
l 哪些用戶可存取一指定的模式對象及在對象上允許作哪些操作類型。
在ORACLE服務(wù)器上提供了一種任意存取控制,是一種基于特權(quán)限制信息存取的方法。用戶要存取一對象必須有相應(yīng)的特權(quán)授給該用戶。已授權(quán)的用戶可任意地可將它授權(quán)給其它用戶,由于這個原因,這種安全性類型叫做任意型。
ORACLE利用下列機(jī)制管理數(shù)據(jù)庫安全性:
l 數(shù)據(jù)庫用戶和模式;
l 特權(quán);
l 角色;
l 存儲設(shè)置和空間份額;
l 資源限制;
l 審計。
1. 數(shù)據(jù)庫的存取控制
ORACLE保護(hù)信息的方法采用任意存取控制來控制全部用戶對命名對象的存取。用戶對對象的存取受特權(quán)控制。一種特權(quán)是存取一命名對象的許可,為一種規(guī)定格式。
ORACLE使用多種不同的機(jī)制管理數(shù)據(jù)庫安全性,其中有兩種機(jī)制:模式和用戶。模式為模式對象的集合,模式對象如表、視圖、過程和包等。第一數(shù)據(jù)庫有一組模式。
每一ORACLE數(shù)據(jù)庫有一組合法的用戶,可存取一數(shù)據(jù)庫,可運行一數(shù)據(jù)庫應(yīng)用和使用該用戶各連接到定義該用戶的數(shù)據(jù)庫。當(dāng)建立一數(shù)據(jù)庫用戶時,對該用戶建立一個相應(yīng)的模式,模式名與用戶名相同。一旦用戶連接一數(shù)據(jù)庫,該用戶就可存取相應(yīng)模式中的全部對象,一個用戶僅與同名的模式相聯(lián)系,所以用戶和模式是類似的。
用戶的存取權(quán)利受用戶安全域的設(shè)置所控制,在建立一個數(shù)據(jù)庫的新用戶或更改一已有用戶時,安全管理員對用戶安全域有下列決策:
l 是由數(shù)據(jù)庫系統(tǒng)還是由操作系統(tǒng)維護(hù)用戶授權(quán)信息。
l 設(shè)置用戶的缺省表空間和臨時表空間。
l 列出用戶可存的表空間和在表空間中可使用空間份額。
l 設(shè)置用戶資源限制的環(huán)境文件,該限制規(guī)定了用戶可用的系統(tǒng)資源的總量。
l 規(guī)定用戶具有的特權(quán)和角色,可存取相應(yīng)的對象。
每一個用戶有一個安全域,它是一組特性,可決定下列內(nèi)容:
l 用戶可用的特權(quán)和角色;
l 用戶可用的表空間的份額;
l 用戶的系統(tǒng)資源限制。
1) 用戶鑒別:
為了防止非授權(quán)的數(shù)據(jù)庫用戶的使用,ORACLE提供二種確認(rèn)方法
操作系統(tǒng)確認(rèn)和相應(yīng)的ORACLE數(shù)據(jù)庫確認(rèn)。
如果操作系統(tǒng)允許,ORACLE可使用操作系統(tǒng)所維護(hù)的信息來鑒定用戶。由操作系統(tǒng)鑒定用戶的優(yōu)點是:
l 用戶可更方便地連接到ORACLE,不需要指定用戶名和口令。
l 對用戶授權(quán)的控制集中在操作系統(tǒng),ORACLE不需要存儲和管理用戶口令。然而用戶名在數(shù)據(jù)庫中仍然要維護(hù)。
l 在數(shù)據(jù)庫中的用戶名項和操作系統(tǒng)審計跟蹤相對應(yīng)。
ORACLE數(shù)據(jù)庫方式的用戶確認(rèn):ORACLE利用存儲在數(shù)據(jù)庫中的信息可鑒定試圖接到數(shù)據(jù)庫的一用戶,這種鑒別方法僅當(dāng)操作系統(tǒng)不能用于數(shù)據(jù)庫用戶鑒別時才使用。當(dāng)用戶使用一ORACLE數(shù)據(jù)庫時執(zhí)行用戶鑒別。每個用戶在建立時有一個口令,用戶口令在建立對數(shù)據(jù)庫連接時使用,以防止對數(shù)據(jù)庫非授權(quán)的使用。用戶的口令以密碼的格式存儲在數(shù)據(jù)庫數(shù)據(jù)字典中,用戶可隨時修改其口令。
2) 用戶的表空間設(shè)置和定額
關(guān)于表空間的使用有幾種設(shè)置選擇:
l 用戶的缺省表空間;
l 用戶的臨時表空間;
l 數(shù)據(jù)庫表空間的空間使用定額。
3) 用戶資源限制和環(huán)境文件
用戶可用的各種系統(tǒng)資源總量的限制是用戶安全域的部分。利用顯式地設(shè)置資源限制;安全管理員可防止用戶無控制地消耗寶貴的系統(tǒng)資源。資源限制是由環(huán)境文件管理。一個環(huán)境文件是命名的一組賦給用戶的資源限制。另外ORACLE為安全管理員在數(shù)據(jù)庫級提供使能或使不能實施環(huán)境文件資源限制的選擇。
ORACLE可限制幾種類型的系統(tǒng)資源的使用,每種資源可在會話級、調(diào)用級或兩者上控制。在會話級:每一次用戶連接到一數(shù)據(jù)庫,建立一會話。每一個會話在執(zhí)行SQL語句的計算機(jī)上耗費CPU時間和內(nèi)存量進(jìn)行限制。對ORACLE的幾種資源限制可在會話級上設(shè)置。如果會話級資源限制被超過,當(dāng)前語句被中止(回滾),并返回指明會話限制已達(dá)到的信息。此時,當(dāng)前事務(wù)中所有之前執(zhí)行的語句不受影響,此時僅可作COMMIT、ROLLBACK或刪除對數(shù)據(jù)庫的連接等操作,進(jìn)行其它操作都將出錯。
在調(diào)用級:在SQL語句執(zhí)行時,處理該語句有好幾步,為了防止過多地調(diào)用系統(tǒng),ORACLE在調(diào)用級可設(shè)置幾種資源限制。如果調(diào)用級的資源限制被超過,語句處理被停止,該語句被回滾,并返回一錯誤。然而當(dāng)前事務(wù)的已執(zhí)行所用語句不受影響,用戶會話繼續(xù)連接。
有下列資源限制:
l
為了防止無控制地使用CPU時間,ORACLE可限制每次ORACLE調(diào)用的CPU時間和在一次會話期間ORACLE調(diào)用所使用的CPU的時間,以0.01秒為單位。
l 為了防止過多的I/O,ORACLE可限制每次調(diào)用和每次會話的邏輯數(shù)據(jù)塊讀的數(shù)目。
l ORACLE在會話級還提供其它幾種資源限制。
每個用戶的并行會話數(shù)的限制;
會話空閑時間的限制,如果一次會話的ORACLE調(diào)用之間時間達(dá)到該空閑時間,當(dāng)前事務(wù)被回滾,會話被中止,會話資源返回給系統(tǒng);
每次會話可消逝時間的限制,如果一次會話期間超過可消逝時間的限制,當(dāng)前事務(wù)被回滾,會話被刪除,該會話的資源被釋放;
每次會話的專用SGA空間量的限制。
用戶環(huán)境文件:
用戶環(huán)境文件是指定資源限制的命名集,可賦給ORACLE數(shù)據(jù)庫的有效的用戶。利用用戶環(huán)境文件可容易地管理資源限制。要使用用戶環(huán)境文件,首先應(yīng)將數(shù)據(jù)庫中的用戶分類,決定在數(shù)據(jù)庫中全部用戶類型需要多少種用戶環(huán)境文件。在建立環(huán)境文件之前,要決定每一種資源限制的值。例如一類用戶通常不執(zhí)行大量邏輯數(shù)據(jù)塊讀,那就可將LOGICAL-READS-PER-SESSION和LOGICAL-READS-PER-CALL設(shè)置相應(yīng)的值。在許多情況中決定一用戶的環(huán)境文件的合適資源限制的最好的方法是收集每種資源使用的歷史信息。
2. 特權(quán)和角色
1) 特權(quán):特權(quán)是執(zhí)行一種特殊類型的SQL語句或存取另一用戶的對象的權(quán)力。有兩類特權(quán):系統(tǒng)特權(quán)和對象特權(quán)。
系統(tǒng)特權(quán):是執(zhí)行一處特殊動作或者在對象類型上執(zhí)行一種特殊動作的權(quán)利。ORACLE有60多種不同系統(tǒng)特權(quán),每一種系統(tǒng)允許用戶執(zhí)行一種特殊的數(shù)據(jù)庫操作或一類數(shù)據(jù)庫操作.
系統(tǒng)特權(quán)可授權(quán)給用戶或角色,一般,系統(tǒng)特權(quán)全管理人員和應(yīng)用開發(fā)人員,終端用戶不需要這些相關(guān)功能.授權(quán)給一用戶的系統(tǒng)特權(quán)并具有該
系統(tǒng)特權(quán)授權(quán)給其他用戶或角色.反之,可從那些被授權(quán)的用戶或角色回收系統(tǒng)特權(quán).
對象特權(quán):在指定的表、視圖、序列、過程、函數(shù)或包上執(zhí)行特殊動作的權(quán)利。對于不同類型的對象,有不同類型的對象特權(quán)。對于有些模式對象,如聚集、索引、觸發(fā)器、數(shù)據(jù)庫鏈沒有相關(guān)的對象特權(quán),它們由系統(tǒng)特權(quán)控制。
對于包含在某用戶名的模式中的對象,該用戶對這些對象自動地具有全部對象特權(quán),即模式的持有者對模式中的對象具有全部對象特權(quán)。這些對象的持有者可將這些對象上的任何對象特權(quán)可授權(quán)給其他用戶。如果被授者包含有GRANT
OPTION 授權(quán),那么該被授者也可將其權(quán)利再授權(quán)給其他用戶。
2) 角色:為相關(guān)特權(quán)的命名組,可授權(quán)給用戶和角色。ORACEL利用角色更容易地進(jìn)行特權(quán)管理。有下列優(yōu)點:
l 減少特權(quán)管理,不要顯式地將同一特權(quán)組授權(quán)給幾個用戶,只需將這特權(quán)組授給角色,然后將角色授權(quán)給每一用戶。
l 動態(tài)特權(quán)管理,如果一組特權(quán)需要改變,只需修改角色的特權(quán),所有授給該角色的全部用戶的安全域?qū)⒆詣拥胤从硨巧鞯男薷摹?br>l 特權(quán)的選擇可用性,授權(quán)給用戶的角色可選擇地使其使能(可用)或使不能(不可用)。
l 應(yīng)用可知性,當(dāng)一用戶經(jīng)一用戶名執(zhí)行應(yīng)用時,該數(shù)據(jù)庫應(yīng)用可查詢字典,將自動地選擇使角色使能或不能。
l 專門的應(yīng)用安全性,角色使用可由口令保護(hù),應(yīng)用可提供正確的口令使用權(quán)角色使能,達(dá)到專用的應(yīng)用安全性。因用戶不知其口令,不能使角色使能。
一般,建立角色服務(wù)于兩個目的:為數(shù)據(jù)庫應(yīng)用管理特權(quán)和為用戶組管理特權(quán)。相應(yīng)的角色稱為應(yīng)用角色和用戶角色。
應(yīng)用角色是授予的運行一數(shù)據(jù)庫應(yīng)用所需的全部特權(quán)。一個應(yīng)用角色可授給其它角色或指定用戶。一個應(yīng)用可有幾種不同角色,具有不同特權(quán)組的每一個角色在使用應(yīng)用時可進(jìn)行不同的數(shù)據(jù)存取。
用戶角色是為具有公開特權(quán)需求的一組數(shù)據(jù)庫用戶而建立的。用戶特權(quán)管理是受應(yīng)用角色或特權(quán)授權(quán)給用戶角色所控制,然后將用戶角色授權(quán)給相應(yīng)的用戶。
數(shù)據(jù)庫角色包含下列功能:
l 一個角色可授予系統(tǒng)特權(quán)或?qū)ο筇貦?quán)。
l 一個角色可授權(quán)給其它角色,但不能循環(huán)授權(quán)。
l 任何角色可授權(quán)給任何數(shù)據(jù)庫用戶。
l 授權(quán)給一用戶的每一角色可以是使能的或者使不能的。一個用戶的安全域僅包含當(dāng)前對該用戶使能的全部角色的特權(quán)。
l 一個間接授權(quán)角色(授權(quán)給另一角色的角色)對一用戶可顯式地使其能或使不能。
在一個數(shù)據(jù)庫中,每一個角色名必須唯一。角色名與用戶不同,角色不包含在任何模式中,所以建立一角色的用戶被刪除時不影響該角色。
ORACLE為了提供與以前版本的兼容性,預(yù)定義下列角色:CONNENT、RESOURCE、DBA、EXP-FULL-DATABASE和IMP-FULL-DATABASE。
3. 審計
審計是對選定的用戶動作的監(jiān)控和記錄,通常用于:
l 審查可疑的活動。例如:數(shù)據(jù)被非授權(quán)用戶所刪除,此時安全管理員可決定對該
數(shù)據(jù)庫的所有連接進(jìn)行審計,以及對數(shù)據(jù)庫的所有表的成功地或不成功地刪除進(jìn)行審計。
l 監(jiān)視和收集關(guān)于指定數(shù)據(jù)庫活動的數(shù)據(jù)。例如:DBA可收集哪些被修改、執(zhí)行了多少次邏輯的I/O等統(tǒng)計數(shù)據(jù)。
ORACLE支持三種審計類型:
l 語句審計,對某種類型的SQL語句審計,不指定結(jié)構(gòu)或?qū)ο蟆?br>l 特權(quán)審計,對執(zhí)行相應(yīng)動作的系統(tǒng)特權(quán)的使用審計。
l 對象審計,對一特殊模式對象上的指定語句的審計。
ORACLE所允許的審計選擇限于下列方面:
l 審計語句的成功執(zhí)行、不成功執(zhí)行,或者其兩者。
l 對每一用戶會話審計語句執(zhí)行一次或者對語句每次執(zhí)行審計一次。
l 對全部用戶或指定用戶的活動的審計。
當(dāng)數(shù)據(jù)庫的審計是使能的,在語句執(zhí)行階段產(chǎn)生審計記錄。審計記錄包含有審計的操作、用戶執(zhí)行的操作、操作的日期和時間等信息。審計記錄可存在數(shù)據(jù)字典表(稱為審計記錄)或操作系統(tǒng)審計記錄中。數(shù)據(jù)庫審計記錄是在SYS模式的AUD$表中。
二、 數(shù)據(jù)完整性
它是指數(shù)據(jù)的正確性和相容性。數(shù)據(jù)的完整性是為了防止數(shù)據(jù)庫存在不符合主義的數(shù)據(jù),防止錯誤信息輸入和輸出,即數(shù)據(jù)要遵守由DBA或應(yīng)用開發(fā)者所決定的一組預(yù)定義的規(guī)則。ORACLE應(yīng)用于關(guān)系數(shù)據(jù)庫的表的數(shù)據(jù)完整性有下列類型:
l 在插入或修改表的行時允許不允許包含有空值的列,稱為空與非空規(guī)則。
l 唯一列值規(guī)則,允許插入或修改的表行在該列上的值唯一。
l 引用完整性規(guī)則,同關(guān)系模型定義
l 用戶對定義的規(guī)則,為復(fù)雜性完整性檢查。
ORACLE允許定義和實施上述每一種類型的數(shù)據(jù)完整性規(guī)則,這些規(guī)則可用完整性約束和數(shù)據(jù)庫觸發(fā)器定義。
完整性約束,是對表的列定義一規(guī)則的說明性方法。
數(shù)據(jù)庫觸發(fā)器,是使用非說明方法實施完整性規(guī)則,利用數(shù)據(jù)庫觸發(fā)器(存儲的數(shù)據(jù)庫過程)可定義和實施任何類型的完整性規(guī)則。
1. 完整性約束
ORACLE利用完整性約束機(jī)制防止無效的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫的基表,如果任何DML執(zhí)行結(jié)果破壞完整性約束,該語句被回滾并返回一上個錯誤。ORACLE實現(xiàn)的完整性約束完全遵守ANSI
X3。135-1989和ISO9075-1989標(biāo)準(zhǔn)。
利用完整性約束實施數(shù)據(jù)完整性規(guī)則有下列優(yōu)點:
l 定義或更改表時,不需要程序設(shè)計,便很容易地編寫程序并可消除程序性錯誤,其功能是由ORACLE控制。所以說明性完整性約束優(yōu)于應(yīng)用代碼和數(shù)據(jù)庫觸發(fā)器。
l 對表所定義的完整性約束是存儲在數(shù)據(jù)字典中,所以由任何應(yīng)用進(jìn)入的數(shù)據(jù)都必須遵守與表相關(guān)聯(lián)的完整性約束。
l 具有最大的開發(fā)能力。當(dāng)由完整性約束所實施的事務(wù)規(guī)則改變時,管理員只需改變完整性約束的定義,所有應(yīng)用自動地遵守所修改的約束。
l 由于完整性約束存儲在數(shù)據(jù)字典中,數(shù)據(jù)庫應(yīng)用可利用這些信息,在SQL語句執(zhí)行之前或由ORACLE檢查之前,就可立即反饋信息。
l 由于完整性約束說明的語義是清楚地定義,對于每一指定說明規(guī)則可實現(xiàn)性能優(yōu)化。
l
由于完整性約束可臨時地使不能,以致在裝入大量數(shù)據(jù)時可避免約束檢索的開銷。當(dāng)數(shù)據(jù)庫裝入完成時,完整性約束可容易地使其能,任何破壞完整性約束的任何新行在例外表中列出。
ORACLE的DBA和應(yīng)用開始者對列的值輸入可使用的完整性約束有下列類型:
l NOT NULL約束:如果在表的一列的值不允許為空,則需在該列指定NOT NULL約束。
l
UNIQUE碼約束:在表指定的列或組列上不允許兩行是具有重復(fù)值時,則需要該列或組列上指定UNIQUE碼完整性約束。在UNIQUE碼約束定義中的列或組列稱為唯一碼。所有唯一完整性約束是用索引方法實施。
l PRIMARY KEY約束:在數(shù)據(jù)庫中每一個表可有一個PRIMARY KEY約束。包含在PRIMARY
KEY完整性約束的列或組列稱為主碼,每個表可有一個主碼。ORACLE使用索引實施PRIMARY KEY約束。
l FOREIGN
KEY約束(可稱引用約束):在關(guān)系數(shù)據(jù)庫中表可通過公共列相關(guān)聯(lián),該規(guī)則控制必須維護(hù)的列之間的關(guān)系。包含在引用完整性約束定義的列或組列稱為外來碼。由外來碼所引用的表中的唯一碼或方碼,稱為引用碼。包含有外來碼的表稱為子表或從屬表。由子表的外來碼所引用的表稱為雙親表或引用表。如果對表的每一行,其外來碼的值必須與主碼中一值相匹配,則需指定引用完整性約束。
l
CHECK約束:表的每行對一指定的條件必須是TRUE或未知,則需在一列或列組上指定CHECK完整性約束。如果在發(fā)出一個DML語句時,CHECK約束的條件計算得FALSE時,該語句被回滾。
2. 數(shù)據(jù)庫觸發(fā)器
ORACLE允許定義過程,當(dāng)對相關(guān)的表作INSERT、UPDATE或DELETE語句時,這些過程被隱式地執(zhí)行。這些過程稱為數(shù)據(jù)庫觸發(fā)器。觸發(fā)器類似于存儲的過程,可包含SQL語句和PL/SQL語句,可調(diào)用其它的存儲過程。過程與觸發(fā)器差別在于調(diào)用方法:過程由用戶或應(yīng)用顯式執(zhí)行;而觸發(fā)器是為一激發(fā)語句(INSERT、UPDATE、DELETE)發(fā)出進(jìn)由ORACLE隱式地觸發(fā)。一個數(shù)據(jù)庫應(yīng)用可隱式地觸發(fā)存儲在數(shù)據(jù)庫中多個觸發(fā)器。
在許多情況中觸發(fā)器補(bǔ)充ORACLE的標(biāo)準(zhǔn)功能,提供高度專用的數(shù)據(jù)庫管理系統(tǒng)。一般觸發(fā)器用于:
l 自動地生成導(dǎo)出列值。
l 防止無效事務(wù)。
l 實施復(fù)雜的安全審核。
l 在分布式數(shù)據(jù)庫中實施跨結(jié)點的引用完整性。
l 實施復(fù)雜的事務(wù)規(guī)則。
l 提供透明的事件記錄。
l 提供高級的審計。
l 維護(hù)同步的表副本。
l 收集表存取的統(tǒng)計信息。
注意:在ORACLE環(huán)境中利用ORACLE工具SQL*FORMS也可定義、存儲和執(zhí)行觸發(fā)器,它作為由SQL*FORMS所開發(fā)有應(yīng)用的一部分,它與在表上定義的數(shù)據(jù)庫觸發(fā)器有差別。數(shù)據(jù)庫觸發(fā)器在表上定義,存儲在相關(guān)的數(shù)據(jù)庫中,在對該表發(fā)出IMSERT、UPDATE、DELETE語句時將引起數(shù)據(jù)庫觸發(fā)器的執(zhí)行,不管是哪些用戶或應(yīng)用發(fā)出這些語句。而SQL*FORMS的觸發(fā)器是SQL*FORMS應(yīng)用的組成,僅當(dāng)在指定SQL*FORMS應(yīng)用中執(zhí)行指定觸發(fā)器點時才激發(fā)該觸發(fā)器。
一個觸發(fā)器由三部分組成:觸發(fā)事件或語句、觸發(fā)限制和觸發(fā)器動作。觸發(fā)事件或語句是指引起激發(fā)觸發(fā)器的SQL語句,可為對一指定表的INSERT、 UNPDATE或DELETE語句。觸發(fā)限制是指定一個布爾表達(dá)式,當(dāng)觸發(fā)器激以時該布爾表達(dá)式是必須為真。觸發(fā)器作為過程,是PL/SQL塊,當(dāng)觸發(fā)語句發(fā)出、觸發(fā)限制計算為真時該過程被執(zhí)行。
3. 并發(fā)控制
數(shù)據(jù)庫是一個共享資源,可為多個應(yīng)用程序所共享。這些程序可串行運行,但在許多情況下,由于應(yīng)用程序涉及的數(shù)據(jù)量可能很大,常常會涉及輸入/輸出的交換。為了有效地利用數(shù)據(jù)庫資源,可能多個程序或一個程序的多個進(jìn)程并行地運行,這就是數(shù)據(jù)庫的并行操作。在多用戶數(shù)據(jù)庫環(huán)境中,多個用戶程序可并行地存取數(shù)據(jù)庫,如果不對并發(fā)操作進(jìn)行控制,會存取不正確的數(shù)據(jù),或破壞數(shù)據(jù)庫數(shù)據(jù)的一致性。
例:在飛機(jī)票售票中,有兩個訂票員(T1,T2)對某航線(A)的機(jī)動性票作事務(wù)處理,操作過程如圖所示:
數(shù)據(jù)庫中的A111100
T1 READ A A:=A-1 WRITE A
T2 READ A A:=A-1 WRITE A
T1工作區(qū)中的A110000
T2工作區(qū)中的A 11000
首先T1讀A,接著T2也讀A。然后T1將其工作區(qū)中的A減1,T2也采取同樣動作,它們都得0值,最后分別將0值寫回數(shù)據(jù)庫。在這過程中沒有任何非法操作,但實際上多出一張機(jī)票。這種情況稱為數(shù)據(jù)庫的不一致性,這種不一致性是由于并行操作而產(chǎn)生的。所謂不一致,實際上是由于處理程序工作區(qū)中的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)不一致所造成的。如果處理程序不對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改,則決不會造成任何不一致。另一方面,如果沒有并行操作發(fā)生,則這種臨時的不一致也不會造成什么問題。數(shù)據(jù)不一致總是是由兩個因素造成:一是對數(shù)據(jù)的修改,二是并行操作的發(fā)生。因此為了保持?jǐn)?shù)據(jù)庫的一致性,必須對并行操作進(jìn)行控制。最常用的措施是對數(shù)據(jù)進(jìn)行封鎖。
1) 數(shù)據(jù)庫不一致的類型
l 不一致性
在一事務(wù)期間,其它提交的或未提交事務(wù)的修改是顯然的,以致由查詢所返回的數(shù)據(jù)集不與任何點相一致。
l 不可重復(fù)讀
在一個事務(wù)范圍內(nèi),兩個相同查詢將返回不同數(shù)據(jù),由于查詢注意到其它提交事務(wù)的修改而引起。
l 讀臟數(shù)據(jù)
如果事務(wù)T1將一值(A)修改,然后事務(wù)T2讀該值,在這之后T1由于某種原因撤銷對該值的修改,這樣造成T2讀取的值是臟的。
l 丟失更改
在一事務(wù)中一修改重寫另一事務(wù)的修改,如上述飛機(jī)票售票例子。
l 破壞性的DDL操作
在一用戶修改一表的數(shù)據(jù)時,另一用戶同時更改或刪除該表。
1) 封鎖
在多用戶數(shù)據(jù)庫中一般采用某些數(shù)據(jù)封鎖來解決并發(fā)操作中的數(shù)據(jù)一致性和完整性問題。封鎖是防止存取同一資源的用戶之間破壞性的干擾的機(jī)制,該干擾是指不正確地修改數(shù)據(jù)或不正確地更改數(shù)據(jù)結(jié)構(gòu)。
在多用戶數(shù)據(jù)庫中使用兩種封鎖:排它(專用)封鎖和共享封鎖。排它封鎖禁止相關(guān)資源的共享,如果一事務(wù)以排它方式封鎖一資源,僅僅該事務(wù)可更改該資源,直至釋放排它封鎖。共享封鎖允許相關(guān)資源可以共享,幾個用戶可同時讀同一數(shù)據(jù),幾個事務(wù)可在同一資源上獲取共享封鎖。共享封鎖比排它封鎖具有更高的數(shù)據(jù)并行性。
在多用戶系統(tǒng)中使用封鎖后會出現(xiàn)死鎖,引起一些事務(wù)不能繼續(xù)工作。當(dāng)兩個或多個用戶彼此等待所封鎖數(shù)據(jù)時可發(fā)生死鎖。
2) ORACLE多種一致性模型。
ORACLE利用事務(wù)和封鎖機(jī)制提供數(shù)據(jù)并發(fā)存取和數(shù)據(jù)完整性。在一事務(wù)內(nèi)由語句獲取的全部封鎖在事務(wù)期間被保持,防止其它并行事務(wù)的破壞性干擾。一個事務(wù)的SQL語句所作的修改在它提交之后所啟動的事務(wù)中才是可見的。在一事務(wù)中由語句所獲取的全部封鎖在該事務(wù)提交或回滾時被釋放。
ORACLE在兩個不同級上提供讀一致性:語句級讀一致性和事務(wù)級一致性。ORCLE總是實施語句級讀一致性,保證單個查詢所返回的數(shù)據(jù)與該查詢開始時刻相一致。所以一個查詢從不會看到在查詢執(zhí)行過程中提交的其它事務(wù)所作的任何修改。為了實現(xiàn)語句級讀一致性,在查詢進(jìn)入執(zhí)行階段時,在注視SCN的時候為止所提交的數(shù)據(jù)是有效的,而在語句執(zhí)行開始之后其它事務(wù)提交的任何修改,查詢將是看不到的。
ORACLE允許選擇實施事務(wù)級讀一致性,它保證在同一事務(wù)內(nèi)所有查詢的數(shù)據(jù)
4) 封鎖機(jī)制
ORACLE自動地使用不同封鎖類型來控制數(shù)據(jù)的并行存取,防止用戶之間的破壞性干擾。ORACLE為一事務(wù)自動地封鎖一資源以防止其它事務(wù)對同一資源的排它封鎖。在某種事件出現(xiàn)或事務(wù)不再需要該資源時自動地釋放。
ORACLE將封鎖分為下列類:
l
數(shù)據(jù)封鎖:數(shù)據(jù)封鎖保護(hù)表數(shù)據(jù),在多個用戶并行存取數(shù)據(jù)時保證數(shù)據(jù)的完整性。數(shù)據(jù)封鎖防止相沖突的DML和DDL操作的破壞性干擾。DML操作可在兩個級獲取數(shù)據(jù)封鎖:指定行封鎖和整個表封鎖,在防止沖突的DDL操作時也需表封鎖。當(dāng)行要被修改時,事務(wù)在該行獲取排它數(shù)據(jù)封鎖。表封鎖可以有下列方式:行共享、行排它、共享封鎖、共享行排它和排它封鎖。
l DDL封鎖(字典封鎖)
DDL封鎖保護(hù)模式對象(如表)的定義,DDL操作將影響對象,一個DDL語句隱式地提交一個事務(wù)。當(dāng)任何DDL事務(wù)需要時由ORACLE自動獲取字典封鎖,用戶不能顯式地請求DDL封鎖。在DDL操作期間,被修改或引用的模式對象被封鎖。
l 內(nèi)部封鎖:保護(hù)內(nèi)部數(shù)據(jù)庫和內(nèi)存結(jié)構(gòu),這些結(jié)構(gòu)對用戶是不可見的。
5) 手工的數(shù)據(jù)封鎖
下列情況允許使用選擇代替ORACLE缺省的封鎖機(jī)制:
l 應(yīng)用需要事務(wù)級讀一致或可重復(fù)讀。
l 應(yīng)用需要一事務(wù)對一資源可排它存取,為了繼續(xù)它的語句,具有對資源排它存取的事務(wù)不必等待其它事務(wù)完成。
ORACLE自動封鎖可在二級被替代:事務(wù)級各系統(tǒng)級。
l 事務(wù)級:包含下列SQL語句的事務(wù)替代ORACLE缺省封鎖:LOCK TABLE命令、SELECT…FOR UPDATE命令、具有READ
ONLY選項的SET TRANSACTIN命令。由這些語句所獲得的封鎖在事務(wù)提交或回滾后所釋放。
l 系統(tǒng)級:通過調(diào)整初始化參數(shù)SERIALIZABLE和REO-LOCKING,實例可用非缺省封鎖啟動。該兩參數(shù)據(jù)的缺省值為:
SERIALIZABLE=FALSE
ORW-LOCKING=ALWAYS
4. 數(shù)據(jù)庫后備和恢復(fù)
當(dāng)我們使用一個數(shù)據(jù)庫時,總希望數(shù)據(jù)庫的內(nèi)容是可靠的、正確的,但由于計算機(jī)系統(tǒng)的故障(硬件故障、軟件故障、網(wǎng)絡(luò)故障、進(jìn)程故障和系統(tǒng)故障)影響數(shù)據(jù)庫系統(tǒng)的操作,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,甚至破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分?jǐn)?shù)據(jù)丟失。因此當(dāng)發(fā)生上述故障后,希望能重新建立一個完整的數(shù)據(jù)庫,該處理稱為數(shù)據(jù)庫恢復(fù)?;謴?fù)子系統(tǒng)是數(shù)據(jù)庫管理系統(tǒng)的一個重要組成部分?;謴?fù)處理隨所發(fā)生的故障類型所影響的結(jié)構(gòu)而變化。
1) 恢復(fù)數(shù)據(jù)庫所使用的結(jié)構(gòu)
ORACLE數(shù)據(jù)庫使用幾種結(jié)構(gòu)對可能故障來保護(hù)數(shù)據(jù):數(shù)據(jù)庫后備、日志、回滾段和控制文件。
數(shù)據(jù)庫后備是由構(gòu)成ORACLE數(shù)據(jù)庫的物理文件的操作系統(tǒng)后備所組成。當(dāng)介質(zhì)故障時進(jìn)行數(shù)據(jù)庫恢復(fù),利用后備文件恢復(fù)毀壞的數(shù)據(jù)文件或控制文件。
日志,每一個ORACLE數(shù)據(jù)庫實例都提供,記錄數(shù)據(jù)庫中所作的全部修改。一個實例的日志至少由兩個日志文件組成,當(dāng)實例故障或介質(zhì)故障時進(jìn)行數(shù)據(jù)庫部分恢復(fù),利用數(shù)據(jù)庫日志中的改變應(yīng)用于數(shù)據(jù)文件,修改數(shù)據(jù)庫數(shù)據(jù)到故障出現(xiàn)的時刻。數(shù)據(jù)庫日志由兩部分組成:在線日志和歸檔日志。
每一個運行的ORACLE數(shù)據(jù)庫實例相應(yīng)地有一個在線日志,它與ORACLE后臺進(jìn)程LGWR一起工作,立即記錄該實例所作的全部修改。在線日志由兩個或多個預(yù)期分配的文件組成,以循環(huán)方式使用。
歸檔日志是可選擇的,一個ORACLE數(shù)據(jù)庫實例一旦在線日志填滿后,可形成在線日志的歸檔文件。歸檔的在線日志文件被唯一標(biāo)識并合成歸檔日志。
回滾段用于存儲正在進(jìn)行的事務(wù)(為未提交的事務(wù))所修改值的老值,該信息在數(shù)據(jù)庫恢復(fù)過程中用于撤消任何非提交的修改。
控制文件,一般用于存儲數(shù)據(jù)庫的物理結(jié)構(gòu)的狀態(tài)。控制文件中某些狀態(tài)信息在實例恢復(fù)和介質(zhì)恢復(fù)期間用于引導(dǎo)ORACLE。
2) 在線日志
一個ORACLE數(shù)據(jù)庫的每一實例有一個相關(guān)聯(lián)的在線日志。一個在線日志由多個在線日志文件組成。在線日志文件填入日志項,日志項記錄的數(shù)據(jù)用于重構(gòu)對數(shù)據(jù)庫所作的全部修改。后臺進(jìn)程LGWR以循環(huán)方式寫入在線日志文件。當(dāng)當(dāng)前的在線日志文件寫滿后,LGWR寫入到下一可用在線日志文件當(dāng)最后一個可用的在線日志文件的檢查點已完成時即可使用。如果歸檔不實施,一個已填滿的在線日志文件一當(dāng)包含該在線日志文件的檢查點完成,該文件已被歸檔后即可使用。在任何時候,僅有一個在線日志文件被寫入存儲日志項,它被稱為活動的或當(dāng)前在線日志文件,其它的在線日志文件為不活動的在線日志文件。
ORCLE結(jié)束寫入一在線日志文件并開始寫入到另一個在線日志文件的點稱為日志開關(guān)。日志開關(guān)在當(dāng)前在線日志文件完全填滿,必須繼續(xù)寫入到下一個在線日志文件時總出現(xiàn),也可由DBA強(qiáng)制日志開關(guān)。每一日志開關(guān)出現(xiàn)時,每一在線日志文件賦給一個新的日志序列號。如果在線日志文件被歸檔,在歸檔日志文件中包含有它的日志序列號。
ORACLE后臺進(jìn)程DBWR(數(shù)據(jù)庫寫)將SGA中所有被修改的數(shù)據(jù)庫緩沖區(qū)(包含提交和未提交的)寫入到數(shù)據(jù)文件,這樣的事件稱為出現(xiàn)一個檢查點。因下列原因?qū)崿F(xiàn)檢查點:
l
檢查點確保將內(nèi)存中經(jīng)常改變的數(shù)據(jù)段塊每隔一定時間寫入到數(shù)據(jù)文件。由于DBWR使用最近最少使用算法,經(jīng)常修改的數(shù)據(jù)段塊從不會作為最近最少使用塊,如果檢查點不出現(xiàn),它從不會寫入磁盤。
l 由于直至檢查點時所有的數(shù)據(jù)庫修改已記錄到數(shù)據(jù)文件,先于檢查點的日志項在實例恢復(fù)時不再需要應(yīng)用于數(shù)據(jù)文件,所以檢查點可加快實例恢復(fù)。
雖然檢查點有一些開銷,但ORACLE既不停止活動又不影響當(dāng)前事務(wù)。由于DBWR不斷地將數(shù)據(jù)庫緩沖區(qū)寫入到磁盤,所以一個檢查點一次不必寫許多數(shù)據(jù)塊。一個檢查點保證自前一個檢查點以來的全部修改數(shù)據(jù)塊寫入到磁盤。檢查點不管填滿的在線日志文件是否正在歸檔,它總是出現(xiàn)。如果實施歸檔,在LGWR重用在線日志文件之前,檢查點必須完成并且所填滿的在線日志文件必須被歸檔。
檢查點可對數(shù)據(jù)庫的全部數(shù)據(jù)文件出現(xiàn)(稱為數(shù)據(jù)庫檢查點),也可對指定的數(shù)據(jù)文件出現(xiàn)。下面說明一下什么時候出現(xiàn)檢查點及出現(xiàn)什么情況:
l 在每一個日志開關(guān)處自動地出現(xiàn)一數(shù)據(jù)庫檢查點。如果前一個數(shù)據(jù)庫檢查點正在處理,由日志開關(guān)實施的檢查點優(yōu)于當(dāng)前檢查點。
l
初始化參數(shù)據(jù)LOG-CHECKPOINT-INTERVAL設(shè)置所實施的數(shù)據(jù)庫檢查點,當(dāng)預(yù)定的日志塊數(shù)被填滿后(自最后一個數(shù)據(jù)庫檢查點以來),實施一數(shù)據(jù)庫檢查點。另一個參數(shù)LOG-CHECKPOINT-TIMEOUT可設(shè)置自上一個數(shù)據(jù)庫檢查點開始之后指定秒數(shù)后實施一數(shù)據(jù)庫檢查點。這種選擇對使用非常大的日志文件時有用,它在日志開頭之間增加檢查點。由初始化參數(shù)所啟動的數(shù)據(jù)庫檢查點只有在前一個檢查點完成后才能啟動。
l 當(dāng)一在線表空間開始后備時,僅對構(gòu)成該空間的數(shù)據(jù)文件實施一檢查點,該檢查點壓倒仍在進(jìn)行中的任何檢查點。
l 當(dāng)DBA使一表空間離線時,僅對構(gòu)成該表空間的在線文件實施一檢查點。
l 當(dāng)DBA以正?;蛄⒓捶绞疥P(guān)閉一實例時,ORACLE在實例關(guān)閉之前實施一數(shù)據(jù)庫檢查點,該檢查點壓倒任何運行檢查點。
l DBA可要求實施一數(shù)據(jù)庫檢查點,該檢查點壓倒任何運行檢查點。
檢查點機(jī)制:當(dāng)檢查點出現(xiàn)時,檢查點后臺進(jìn)程記住寫入在線文件的下一日志行的位置,并通知數(shù)據(jù)庫寫后臺進(jìn)程將SGA中修改的數(shù)據(jù)庫緩沖區(qū)寫入到磁盤上的數(shù)據(jù)文件。然后由CKPT修改全部控制文件和數(shù)據(jù)文件的標(biāo)頭,反映該最后檢查點。當(dāng)檢查點不發(fā)生,DBWR當(dāng)需要時僅將最近最少使用的數(shù)據(jù)庫緩沖區(qū)寫入磁盤,為新數(shù)據(jù)準(zhǔn)備緩沖區(qū)。
鏡象在線日志文件:為了安全將實例的在線日志文件鏡象到它的在線日志文件ORACLE提供鏡象功能。當(dāng)具有鏡象在線日志文件時,LGWR同時將同一日志信息寫入到多個同樣的在線日志文件。日志文件分成組,每個組中的日志文件稱為成員,每個組中的全部成員同時活動,由LGWR賦給相同的日志序列號。如果使用鏡象在線日志,則可建立在線日志文件組,在組中的每一成員要求是同一大小。
鏡象在線日志的機(jī)制:LGWR總是尋找組的全部成員,對一組的全部成員并行地寫,然后轉(zhuǎn)換到下一組的全部成員,并行地寫。
每個數(shù)據(jù)庫實例有自己的在線日志組,這些在線日志組可以是鏡象的或不是,稱為實例的在線日志線索。在典型配置中,一個數(shù)據(jù)庫實例存取一個ORACLE數(shù)據(jù)庫,于是僅一個線索存在。然而在運行ORACLE并行服務(wù)器中,兩個或多個實例并行地存取單個數(shù)據(jù)庫,在這種情況下,每個實例有自己的線索。
3) 歸檔日志
ORACLE要將填滿的在線日志文件組歸檔時,則要建立歸檔日志,或稱離線日志。其對數(shù)據(jù)庫后備和恢復(fù)有下列用處:
l 數(shù)據(jù)庫后備以及在線和歸檔日志文件,在操作系統(tǒng)或磁盤故障中可保證全部提交的事務(wù)可被恢復(fù)。
l 在數(shù)據(jù)庫打開時和正常系統(tǒng)使用下,如果歸檔日志是永久保持,在線后備可以進(jìn)行和使用。
如果用戶數(shù)據(jù)庫要求在任何磁盤故障的事件中不丟失任何數(shù)據(jù),那么歸檔日志必須要存在。歸檔已填滿的在線日志文件可能需要DBA執(zhí)行額外的管理操作。
歸檔機(jī)制:決定于歸檔設(shè)置,歸檔已填滿的在線日志組的機(jī)制可由ORACLE后臺進(jìn)程ARCH自動歸檔或由用戶進(jìn)程發(fā)出語句手工地歸檔。當(dāng)日志組變?yōu)椴换顒印⑷罩鹃_關(guān)指向下一組已完成時,ARCH可歸檔一組,可存取該組的任何或全部成員,完成歸檔組。在線日志文件歸檔之后才可為LGWR重用。當(dāng)使用歸檔時,必須指定歸檔目標(biāo)指向一存儲設(shè)備,它不同于個有數(shù)據(jù)文件、在線日志文件和控制文件的設(shè)備,理想的是將歸檔日志文件永久地移到離線存儲設(shè)備、如磁帶。
數(shù)據(jù)庫可運行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG方式。數(shù)據(jù)庫在NOARCHIVELOG方式下使用時,不能進(jìn)行在線日志的歸檔。在該數(shù)據(jù)庫控制文件指明填滿的組不需要歸檔,所以一當(dāng)填滿的組成為活動,在日志開關(guān)的檢查點完成,該組即可被LGWR重用。在該方式下僅能保護(hù)數(shù)據(jù)庫實例故障,不能保護(hù)介質(zhì)(磁盤)故障。利用存儲在在線日志中的信息,可實現(xiàn)實例故障恢復(fù)。
如果數(shù)據(jù)庫在ARCHIVELOG方式下,可實施在線日志的歸檔。在控制文件中指明填滿的日志文件組在歸檔之前不能重用。一旦組成為不活動,執(zhí)行歸檔的進(jìn)程立即可使用該組。
在實例起動時,通過參數(shù)LOG-ARCHIVE-START設(shè)置,可啟動ARCH進(jìn)程,否則ARCH進(jìn)程在實例啟動時不能被啟動。然而DBA在憑借時候可交互地啟動或停止自動歸檔。一旦在線日志文件組變?yōu)椴换顒訒r,ARCH進(jìn)程自動對它歸檔。
如果數(shù)據(jù)庫在ARCHIVELOG方式下運行,DBA可手工歸檔填滿的不活動的日志文件組,不管自動歸檔是可以還是不可以。
4) 數(shù)據(jù)庫后備
不管為ORACLE數(shù)據(jù)庫設(shè)計成什么樣的后備或恢復(fù)模式,數(shù)據(jù)庫數(shù)據(jù)文件、日志文件和控制文件的操作系統(tǒng)后備是絕對需要的,它是保護(hù)介質(zhì)故障的策略部分。操作系統(tǒng)后備有完全后備和部分后備
l
完全后備:一個完全后備將構(gòu)成ORACLE數(shù)據(jù)庫的全部數(shù)據(jù)庫文件、在線日志文件和控制文件的一個操作系統(tǒng)后備。一個完全后備在數(shù)據(jù)庫正常關(guān)閉之后進(jìn)行,不能在實例故障后進(jìn)行。在此時,所有構(gòu)成數(shù)據(jù)庫的全部文件是關(guān)閉的,并與當(dāng)前點相一致。在數(shù)據(jù)庫打開時不能進(jìn)行完全后備。由完全后備得到的數(shù)據(jù)文件在任何類型的介質(zhì)恢復(fù)模式中是有用的。
l 部分后備
部分后備為除完全后備外的任何操作系統(tǒng)后備,可在數(shù)據(jù)庫打開或關(guān)閉下進(jìn)行。如單個表空間中全部數(shù)據(jù)文件后備、單個數(shù)據(jù)文件后備和控制文件后備。部分后備僅對在ARCHIVELOG方式下運行數(shù)據(jù)庫有用,因為存在的歸檔日志,數(shù)據(jù)文件可由部分后備恢復(fù)。在恢復(fù)過程中與數(shù)據(jù)庫其它部分一致。
5) 數(shù)據(jù)庫恢復(fù)
l 實例故障的恢復(fù)
當(dāng)實例意外地(如掉電、后臺進(jìn)程故障等)或預(yù)料地(發(fā)出SHUTDOUM
ABORT語句)中止時出現(xiàn)實例故障,此時需要實例恢復(fù)。實例恢復(fù)將數(shù)據(jù)庫恢復(fù)一故障之前的事務(wù)一致狀態(tài)。如果在在線后備發(fā)現(xiàn)實例故障,則需介質(zhì)恢復(fù)。在其它情況ORACLE在下次數(shù)據(jù)庫起動時(對新實例裝配和打開),自動地執(zhí)行實例恢復(fù)。如果需要,從裝配狀態(tài)變?yōu)榇蜷_狀態(tài),自動地激發(fā)實例恢復(fù),由下列處理:
(1) 為了解恢復(fù)數(shù)據(jù)文件中沒有記錄的數(shù)據(jù),進(jìn)行向前滾。該數(shù)據(jù)記錄在在線日志,包括對回滾段的內(nèi)容恢復(fù)。
(2) 回滾未提交的事務(wù),按步1重新生成回滾段所指定的操作。
(3) 釋放在故障時正在處理事務(wù)所持有的資源。
(4) 解決在故障時正經(jīng)歷一階段提交的任何懸而未決的分布事務(wù)。
l 介質(zhì)故障的恢復(fù)
介質(zhì)故障是當(dāng)一個文件、一個文件的部分或一磁盤不能讀或不能寫時出現(xiàn)的故障。介質(zhì)故障的恢復(fù)有兩種形式,決定于數(shù)據(jù)庫運行的歸檔方式。
l 如果數(shù)據(jù)庫是可運行的,以致它的在線日志僅可重用但不能歸檔,此時介質(zhì)恢復(fù)為使用最新的完全后備的簡單恢復(fù)。在完全后備執(zhí)行的工作必須手工地重作。
l 如果數(shù)據(jù)庫可運行,其在線日志是被歸檔的,該介質(zhì)故障的恢復(fù)是一個實際恢復(fù)過程,重構(gòu)受損的數(shù)據(jù)庫恢復(fù)到介質(zhì)故障前的一個指定事務(wù)一致狀態(tài)。
不管哪種形式,介質(zhì)故障的恢復(fù)總是將整個數(shù)據(jù)庫恢復(fù)到故障之前的一個事務(wù)一致狀態(tài)。如果數(shù)據(jù)庫是在ARCHIVELOG方式運行,可有不同類型的介質(zhì)恢復(fù):完全介質(zhì)恢復(fù)和不完全介質(zhì)恢復(fù)。
完全介質(zhì)恢復(fù)可恢復(fù)全部丟失的修改。僅當(dāng)所有必要的日志可用時才可能。有不同類型的完全介質(zhì)恢復(fù)可使用,其決定于毀壞文件和數(shù)據(jù)庫的可用性。例:
l 關(guān)閉數(shù)據(jù)庫的恢復(fù)。當(dāng)數(shù)據(jù)庫可被裝配卻是關(guān)閉的,完全不能正常使用,此時可進(jìn)行全部的或單個毀壞數(shù)據(jù)文件的完全介質(zhì)恢復(fù)。
l
打開數(shù)據(jù)庫的離線表空間的恢復(fù)。當(dāng)數(shù)據(jù)庫是打開的,完全介質(zhì)恢復(fù)可以處理。未損的數(shù)據(jù)庫表空間是在線的可以使用,而受損耗捕空間是離線的,其所有數(shù)據(jù)文件作為恢復(fù)的單位。
l
打開數(shù)據(jù)庫的離線表間的單個數(shù)據(jù)文件的恢復(fù)。當(dāng)數(shù)據(jù)庫是打開的,完全介質(zhì)恢復(fù)可以處理。未損的數(shù)據(jù)庫表空間是在線的可以使用,而所損的表空間是離線的,該表空間的指定所損的數(shù)據(jù)文件可被恢復(fù)。
l 使用后備的控制文件的完全介質(zhì)恢復(fù)。當(dāng)控制文件所有拷貝由于磁盤故障而受損時,可進(jìn)行介質(zhì)恢復(fù)而不丟失數(shù)據(jù)。
不完全介質(zhì)恢復(fù)是在完全介質(zhì)恢復(fù)不可能或不要求時進(jìn)行的介質(zhì)恢復(fù)。重構(gòu)受損的數(shù)據(jù)庫,使其恢復(fù)介質(zhì)故障前或用戶出錯之前的一個事務(wù)一致性狀態(tài)。不完全介質(zhì)恢復(fù)有不同類型的使用,決定于需要不完全介質(zhì)恢復(fù)的情況,有下列類型:基于撤消、基于時間和基于修改的不完全恢復(fù)。
基于撤消恢復(fù):在某種情況,不完全介質(zhì)恢復(fù)必須被控制,DBA可撤消在指定點的操作。基于撤消的恢復(fù)地在一個或多個日志組(在線的或歸檔的)已被介質(zhì)故障所破壞,不能用于恢復(fù)過程時使用,所以介質(zhì)恢復(fù)必須控制,以致在使用最近的、未損的日志組于數(shù)據(jù)文件后中止恢復(fù)操作。
基于時間和基于修改的恢復(fù):如果DBA希望恢復(fù)到過去的某個指定點,不完全介質(zhì)恢復(fù)地理想的??稍谙铝星闆r下使用:
l 當(dāng)用戶意外地刪除一表,并注意到錯誤提交的估計時間,DBA可立即關(guān)閉數(shù)據(jù)庫,恢復(fù)它到用戶錯誤之前時刻。
l
由于系統(tǒng)故障,一個在線日志文件的部分被破壞,所以活動的日志文件突然不可使用,實例被中止,此時需要介質(zhì)恢復(fù)。在恢復(fù)中可使用當(dāng)前在線日志文件的未損部分,DBA利用基于時間的恢復(fù),一旦有將效的在線日志已應(yīng)用于數(shù)據(jù)文件后停止恢復(fù)過程。
在這兩種情況下,不完全介質(zhì)恢復(fù)的終點可由時間點或系統(tǒng)修改號(SCN)來指定。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。