這一章描述了Oracle數(shù)據(jù)庫(kù)的主要邏輯數(shù)據(jù)庫(kù)結(jié)構(gòu)---表空間以及其對(duì)應(yīng)的數(shù)據(jù)文件。
本章包含下列內(nèi)容:
u 表空間、數(shù)據(jù)文件和控制文件介紹
u 表空間概述
u 數(shù)據(jù)文件概述
u 控制文件概述
Oracle數(shù)據(jù)庫(kù)邏輯上在表空間保存數(shù)據(jù),物理上在表空間對(duì)應(yīng)的數(shù)據(jù)文件保存數(shù)據(jù)。圖3-1描述了其中的關(guān)系。
圖3-1 數(shù)據(jù)文件和表空間
數(shù)據(jù)庫(kù)、表空間和數(shù)據(jù)文件緊密關(guān)聯(lián),但是它們還是有重要的區(qū)別:
u 一個(gè)Oracle由一個(gè)或多個(gè)邏輯存儲(chǔ)單位組成,這些單位叫做表空間,表空間負(fù)責(zé)保存數(shù)據(jù)庫(kù)所有的數(shù)據(jù)。
u Oracle數(shù)據(jù)庫(kù)的每個(gè)表空間由一個(gè)或多個(gè)叫做數(shù)據(jù)文件的文件組成,數(shù)據(jù)文件是Oracle所運(yùn)行的操作系統(tǒng)上的文件。
u 一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)在構(gòu)成數(shù)據(jù)庫(kù)中表空間的數(shù)據(jù)文件上。例如,一個(gè)最簡(jiǎn)單的數(shù)據(jù)庫(kù)可能只有一個(gè)表空間和一個(gè)數(shù)據(jù)文件。另一個(gè)數(shù)據(jù)庫(kù)可能擁有三個(gè)表空間,每個(gè)有兩個(gè)數(shù)據(jù)文件(整體上就是六個(gè)數(shù)據(jù)文件)。
Oracle管理文件減少了DBA直接管理組成Oracle數(shù)據(jù)庫(kù)的操作系統(tǒng)文件的必要性。你可以基于數(shù)據(jù)庫(kù)對(duì)象而不是文件名稱來指定操作。Oracle內(nèi)部使用標(biāo)準(zhǔn)的操作系統(tǒng)接口來創(chuàng)建和刪除下列數(shù)據(jù)庫(kù)構(gòu)件需要的文件:
u 表空間
u 重做日志文件
u 控制文件
通過初始化參數(shù),你可以指定特定類型文件使用的文件系統(tǒng)目錄。Oracle就可以在創(chuàng)建和刪除不需要的文件時(shí)確定唯一的一個(gè)Oracle管理的文件。
表空間的大小就是組成表空間的數(shù)據(jù)文件的大小之和。數(shù)據(jù)庫(kù)的大小是組成數(shù)據(jù)庫(kù)的表空間的大小總和。
你可以用三種方式擴(kuò)充數(shù)據(jù)庫(kù):
u 為表空間增加數(shù)據(jù)文件
u 增加新的表空間
u 增加數(shù)據(jù)文件的大小
當(dāng)你增加了一個(gè)數(shù)據(jù)文件到一個(gè)現(xiàn)存的表空間中,你就增加了分配給對(duì)應(yīng)表空間的磁盤空間大小。圖3-2說明了這類型的空間增長(zhǎng)。
圖3-2 通過給表空間增加數(shù)據(jù)文件的方式擴(kuò)充數(shù)據(jù)庫(kù)
同樣,你可以創(chuàng)建一個(gè)新的表空間(包含至少一個(gè)數(shù)據(jù)文件)來提高數(shù)據(jù)庫(kù)的大小。圖3-3說明了這種情況。
圖3-3 通過增加表空間擴(kuò)充數(shù)據(jù)庫(kù)
擴(kuò)充數(shù)據(jù)庫(kù)的第三種辦法就是修改數(shù)據(jù)文件的大小或者使允許現(xiàn)存表空間的數(shù)據(jù)文件在有足夠空間的情況下根據(jù)需要?jiǎng)討B(tài)增長(zhǎng)??梢酝ㄟ^調(diào)整現(xiàn)在文件大小或者為文件增加自動(dòng)擴(kuò)展屬性來達(dá)到上述目的。圖3-4說明了這種情況。
圖3-4 通過動(dòng)態(tài)擴(kuò)充數(shù)據(jù)文件來擴(kuò)充數(shù)據(jù)庫(kù)
一個(gè)數(shù)據(jù)庫(kù)由一個(gè)或多個(gè)叫做表空間的邏輯存儲(chǔ)單位組成。表空間有過個(gè)叫做段的邏輯存儲(chǔ)單位組成,段由多個(gè)區(qū)段組成。區(qū)段由一系列連續(xù)的塊組成。
這一部分包含表空間的下列話題:
u 大文件表空間
u SYSTEM表空間
u SYSAUX表空間
u Undo表空間
u 默認(rèn)臨時(shí)表空間
u 使用多種表空間
u 表空間空間管理
u 多個(gè)塊大小
u 在線和離線表空間
u 只讀表空間
u 臨時(shí)表空間的排序操作
u 數(shù)據(jù)庫(kù)之間的表空間傳送
Oracle允許你創(chuàng)建大文件表空間。這允許Oracle數(shù)據(jù)庫(kù)包含由一個(gè)大文件而不是多個(gè)小文件組成的表空間。這使得Oracle可以利用64位系統(tǒng)的優(yōu)勢(shì)來創(chuàng)建和管理超大文件。這樣的結(jié)果是Oracle數(shù)據(jù)庫(kù)可以擴(kuò)大至8EB(1EB = 1,073,741,824 (1024**3)GB)。
在Oracle管理文件的情況下,大文件表空間使得數(shù)據(jù)文件對(duì)用戶來說完全透明。換句話說,你可以在表空間上執(zhí)行操作,而不是在底層的數(shù)據(jù)文件上操作。大文件表空間使得表空間成為磁盤空間管理、備份、恢復(fù)等等的主要單位。大文件表空間還簡(jiǎn)化了Oracle管理文件和自動(dòng)存儲(chǔ)管理的文件管理,因?yàn)樗档土嗽黾有挛募吞幚矶鄠€(gè)文件的必要性。
系統(tǒng)默認(rèn)是創(chuàng)建一個(gè)小文件表空間,這也是Oracle表空間的傳統(tǒng)格式。SYSTEM和SYSAUX表空間總是創(chuàng)建為系統(tǒng)默認(rèn)類型。
大文件表空間只支持使用自動(dòng)段空間管理的本地管理表空間的情況。不過也有兩個(gè)例外:本地管理的undo表空間和臨時(shí)表空間即使在段空間手動(dòng)管理的情況下也可以是用大文件表空間。
一個(gè)Oracle數(shù)據(jù)庫(kù)可以同時(shí)包含大文件和小文件表空間。表空間的不同類型對(duì)于執(zhí)行沒有明確指定數(shù)據(jù)文件的SQL語(yǔ)句來說是沒有多大區(qū)別。
你可以創(chuàng)建一個(gè)臨時(shí)表空間組,這樣一個(gè)用戶就可以從多個(gè)表空間獲得臨時(shí)空間了。表空間組也可以指定為數(shù)據(jù)庫(kù)的默認(rèn)臨時(shí)表空間。這對(duì)于大文件表空間很有用,這里你可能需要大量的臨時(shí)表空間來進(jìn)行排序。
大文件表空間的優(yōu)點(diǎn)
u 大文件表空間可以有效的提高一個(gè)Oracle數(shù)據(jù)庫(kù)的存儲(chǔ)容量。小文件表空間能夠包含1024個(gè)數(shù)據(jù)文件,但是大文件表空間可以只包含一個(gè)1024倍小文件表空間大小的文件。小文件表空間和大文件表空間總?cè)萘渴窍嗤?。雖然如此,由于存在一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)文件數(shù)不能超過64K的限制,一個(gè)包含大文件表空間的數(shù)據(jù)庫(kù)可以1024倍小文件表空間的數(shù)據(jù)庫(kù),所以大文件表空間提升了整個(gè)數(shù)據(jù)庫(kù)容量達(dá)3個(gè)數(shù)量級(jí)。換句話說,當(dāng)文件表空間使用最大塊大?。?2K)時(shí),Oracle數(shù)據(jù)庫(kù)的最大尺寸是8EB。
u 超大規(guī)模的數(shù)據(jù)庫(kù)中使用大文件表空間可以簡(jiǎn)化數(shù)據(jù)文件的管理,因?yàn)樗档土诵枰獢?shù)據(jù)文件的數(shù)目。你也可以調(diào)整參數(shù)來減少數(shù)據(jù)文件信息需要的SGA空間和控制文件的大小。
u 通過數(shù)據(jù)文件透明來簡(jiǎn)化了數(shù)據(jù)庫(kù)管理。
使用大文件表空間應(yīng)該注意
u 大文件表空間傾向于在自動(dòng)存儲(chǔ)管理或者其他的支持自動(dòng)擴(kuò)展的邏輯卷和條帶化的邏輯卷管理或者RAID的情況下使用。
u 避免在不支持條帶化的系統(tǒng)上創(chuàng)建大文件數(shù)據(jù)庫(kù)。因?yàn)樗恢С植l(fā)執(zhí)行和并發(fā)RMAN備份。
u 避免在下列情況下使用大文件表空間:磁盤組中沒有足夠的空閑空間,只能通過在另外一個(gè)磁盤組中增加數(shù)據(jù)文件的方式擴(kuò)展表空間。
u 不推薦在不支持大文件尺寸的平臺(tái)上使用大文件數(shù)據(jù)庫(kù),因?yàn)檫@會(huì)限制表空間容量。參考你的操作系統(tǒng)規(guī)格文檔來獲得支持的最大的文件大小的信息。
u 在大文件表空間上而不是在傳統(tǒng)表空間上保存數(shù)據(jù),可以提高數(shù)據(jù)庫(kù)打開、檢查點(diǎn)和DBWR進(jìn)程的性能。雖然如此,提高數(shù)據(jù)文件大小可能會(huì)增加創(chuàng)建一個(gè)新數(shù)據(jù)文件或者恢復(fù)一個(gè)被破壞的數(shù)據(jù)文件所需的時(shí)間。
每個(gè)Oracle數(shù)據(jù)庫(kù)創(chuàng)建時(shí)都會(huì)自動(dòng)創(chuàng)建一個(gè)SYSTEM表空間。SYSTEM表空間在數(shù)據(jù)庫(kù)打開時(shí)總是在線。
為利用本地管理表空間的優(yōu)勢(shì),你可以創(chuàng)建本地管理SYSTEM表空間,或者你可以將現(xiàn)存的字典管理的SYSTEM表空間遷移為本地管理格式。
在包含本地管理SYSTEM表空間的數(shù)據(jù)庫(kù)中,無法創(chuàng)建字典管理表空間。雖然可以使用表傳送功能來附加一個(gè)字典管理的表空間,但是它也是不能寫入的。
數(shù)據(jù)字典
SYSTEM表空間包含著整個(gè)數(shù)據(jù)庫(kù)的所有數(shù)據(jù)字典表。數(shù)據(jù)字典表保存在編號(hào)為1的數(shù)據(jù)文件上。
PL/SQL程序單位描述
PL/SQL程序單位(如過程、函數(shù)、包和觸發(fā)器)的所有數(shù)據(jù)在保存在SYSTEM表空間上。如果數(shù)據(jù)庫(kù)包含這些程序單位,數(shù)據(jù)庫(kù)管理員必須在SYSTEM表空間中提供這些單位需要的空間。
SYSAUX表空間是SYSTEM表空間的輔助。許多數(shù)據(jù)庫(kù)組件使用SYSAUX表空間作為它們的默認(rèn)位置來保存數(shù)據(jù)。因?yàn)樵跀?shù)據(jù)庫(kù)創(chuàng)建或者升級(jí)時(shí)總會(huì)創(chuàng)建SYSAUX表空間。
SYSAUX表空間集中存儲(chǔ)不包含在SYSTEM表空間中的數(shù)據(jù)庫(kù)元數(shù)據(jù)。它降低了默認(rèn)需要?jiǎng)?chuàng)建的表空間數(shù)量,不論在標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)還是用戶自定義的數(shù)據(jù)庫(kù)中都是如此。
在通常的數(shù)據(jù)庫(kù)操作中,Oracle數(shù)據(jù)庫(kù)服務(wù)器不允許刪除或重命名SYSAUX表空間。也不支持SYSAUX的表空間傳送。
Undo表空間是用來存儲(chǔ)undo信息的特定表空間。你不能在undo表空間上創(chuàng)建任何其他段類型(如表或者索引)。每個(gè)數(shù)據(jù)庫(kù)包含0個(gè)或多個(gè)undo表空間。在自動(dòng)undo管理模式下,每個(gè)Oracle實(shí)例會(huì)分配一個(gè)(只有一個(gè))undo表空間。Undo數(shù)據(jù)在undo表空間的undo中管理,undo段由Oracle自動(dòng)創(chuàng)建和管理。
當(dāng)事務(wù)中的第一個(gè)DML操作運(yùn)行時(shí),事務(wù)會(huì)在當(dāng)前undo表空間中綁定(分配)一個(gè)undo段(或者說事務(wù)表)。極少情況下,如果實(shí)例沒有分配一個(gè)指定的重做表空間,事務(wù)會(huì)綁定到system undo段上。
每個(gè)undo表空間有一系列undo文件組成,采取本地管理方式。和其他類型的表空間一樣,undo塊組成區(qū)段,區(qū)段的狀態(tài)在位圖中展現(xiàn)。在任何時(shí)間點(diǎn)上,一個(gè)區(qū)段或者空閑,或者分配給一個(gè)事務(wù)表。
你可以創(chuàng)建大文件undo表空間。
創(chuàng)建undo表空間
數(shù)據(jù)庫(kù)管理員可以使用CREATE UNDO TABLESPACE語(yǔ)句來創(chuàng)建undo表空間。它也可以使用CREATE DATABASE創(chuàng)建數(shù)據(jù)庫(kù)時(shí)創(chuàng)建。新創(chuàng)建的undo表空間會(huì)包含一系列的文件。和通常的表空間一樣,可以通過ALTER TABLESPACE和DROP TABLESPACE來調(diào)整和刪除表空間。
Undo表空間的分配
你可以通過兩種方式給一個(gè)實(shí)例分配一個(gè)undo表空間:
u 實(shí)例啟動(dòng),你可以在初始化文件中指定undo表空間或者讓系統(tǒng)選擇一個(gè)可用的undo表空間。
u 當(dāng)實(shí)例運(yùn)行時(shí),使用ALTER SYSTEM SET UNDO_TABLESPACE來用另外一個(gè)undo表空間來代替活動(dòng)的undo表空間。這種方式很少采用。
你可以使用ALTER TABLESPACE命令來給undo表空間增加更多的數(shù)據(jù)文件來擴(kuò)展undo表空間的空間。
你可以擁有多個(gè)undo表空間,在它們中間來切換。使用數(shù)據(jù)庫(kù)資源管理器來構(gòu)建每個(gè)用戶undo表空間的限額。你可以指定undo信息的持續(xù)周期。
默認(rèn)臨時(shí)表空間
當(dāng)SYSTEM表空間采取本地管理方式時(shí),你必須在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定至少一個(gè)默認(rèn)臨時(shí)表空間。本地管理的SYSTEM表空間不能作為默認(rèn)臨時(shí)存儲(chǔ)使用。
如果SYSTEM是字典管理模式,你在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)可以不指定默認(rèn)臨時(shí)表空間,然后SYSTEM作為默認(rèn)臨時(shí)存儲(chǔ)使用。即使如此,你會(huì)在ALERT.LOG中收到一個(gè)警告,推薦使用一個(gè)默認(rèn)的臨時(shí)表空間,而且在將來的版本中是必須的。
如何指定默認(rèn)臨時(shí)表空間
在創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句CREATE DATABASE的字句DEFAULT TEMPORARY TABLESPACE字句來指定默認(rèn)臨時(shí)表空間。
一個(gè)非常小的數(shù)據(jù)庫(kù)可能只需要一個(gè)SYSTEM表空間;雖然如此,Oracle推薦你至少創(chuàng)建一個(gè)額外的表空間來單獨(dú)保存用戶數(shù)據(jù),這樣用戶數(shù)據(jù)和數(shù)據(jù)字典信息是分離的。這樣讓你在管理不同的數(shù)據(jù)庫(kù)操作時(shí)有更多的靈活性,并且降低了保存在同一個(gè)數(shù)據(jù)文件上字典對(duì)象和模式對(duì)象的爭(zhēng)用。
你可以使用多個(gè)表空間來執(zhí)行下列任務(wù):
u 對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)控制磁盤空間分配
u 針對(duì)數(shù)據(jù)庫(kù)用戶分配指定的空間限額
u 通過將單個(gè)表空間離線或者在線控制數(shù)據(jù)的可見性
u 執(zhí)行部分?jǐn)?shù)據(jù)庫(kù)的備份和恢復(fù)操作
u 跨設(shè)備存儲(chǔ)數(shù)據(jù)來提高性能
數(shù)據(jù)庫(kù)管理員可以對(duì)表空間做如下操作:
u 創(chuàng)建新的表空間
u 為表空間增加新數(shù)據(jù)文件
u 為表空間的段設(shè)定或者修改默認(rèn)段存儲(chǔ)設(shè)定
u 設(shè)定表空間只讀或者可讀寫
u 設(shè)定表空間臨時(shí)或者持久
u 重命名表空間
u 刪除表空間
在表空間中管理空間
表空間以區(qū)段為單位來分配空間。表空間可以使用兩種不同的方式來跟蹤他們的空閑和已用空間:
u 本地管理表空間:表空間管理區(qū)段
u 字典管理表空間:數(shù)據(jù)字典管理區(qū)段
當(dāng)你創(chuàng)建表空間時(shí),你可以選擇這兩個(gè)空間管理方式的一個(gè)。創(chuàng)建之后,你也可以使用DBMS_SPACE_ADMIN這個(gè)PL/SQL包來修改管理方式。
本地管理表空間
表空間在它的每個(gè)數(shù)據(jù)文件中維護(hù)一個(gè)位圖來跟蹤那個(gè)數(shù)據(jù)文件的塊的空閑或者已用狀態(tài),進(jìn)而來管理它的區(qū)段。位圖中的每個(gè)位都對(duì)應(yīng)一個(gè)塊或者一組塊。當(dāng)一個(gè)區(qū)段被分配或者被釋放可以重新使用時(shí),Oracle會(huì)修改位圖值來顯示塊的新的狀態(tài)。這些改變不會(huì)產(chǎn)生回滾信息,因?yàn)樗]有更新數(shù)據(jù)字典的表(特定情況如表空間限額信息例外)。
本地管理表空間比字典管理表空間有如下優(yōu)勢(shì):
u 區(qū)段的本地管理會(huì)自動(dòng)跟蹤臨近的空閑空間,降低了區(qū)段合并的可能
u 區(qū)段的本地管理避免了遞歸的空間管理操作。如果在一個(gè)區(qū)段內(nèi)使用或者釋放空間引起另外一個(gè)操作在數(shù)據(jù)字典表或者回滾段中使用或者釋放表空間的話,字典管理表空間中會(huì)產(chǎn)生這種遞歸操作。
本地管理下的區(qū)段尺寸可以自動(dòng)由系統(tǒng)指定,當(dāng)然,本地管理的表空間的所有區(qū)段也可以都是同樣的尺寸,這樣會(huì)覆蓋對(duì)象的存儲(chǔ)選項(xiàng)。
CREATE TABLESPACE和CREATE TEMPORARY TABLESPACE語(yǔ)句的LOCAL子句會(huì)分別指定創(chuàng)建本地管理的持久或者臨時(shí)表空間。
本地管理表空間的段空間管理
當(dāng)你使用CREATE TABLESPACE語(yǔ)句創(chuàng)建本地管理的表空間時(shí),SEGMENT SPACE MANAGEMENT字句可以讓你指定如何管理一個(gè)段內(nèi)空閑和使用空間??梢杂腥缦逻x擇:
u AUTO
這個(gè)關(guān)鍵字告訴Oracle你打算使用位圖來管理段內(nèi)的空閑空間。這種情況下,一個(gè)位圖是描述段內(nèi)每一個(gè)數(shù)據(jù)塊的關(guān)于插入數(shù)據(jù)庫(kù)有多大的可用空間這個(gè)狀態(tài)。隨著塊中有增加或者減少可用空間,位圖中會(huì)刷新它的狀態(tài)。位圖可以讓Oracle更自動(dòng)的管理空閑空間;因?yàn)檫@種空間管理方式叫做自動(dòng)段空間管理(automatic segment-space management)。
無論是傳統(tǒng)的小文件表空間還是大文件表空間,本地管理的情況下都可以使用字段段空間管理。AUTO也是默認(rèn)值。
u MANUAL
這個(gè)關(guān)鍵字告訴Oracle你打算使用空閑列表(free lists)來管理段內(nèi)的空閑空間??臻e列表包含的是擁有可用空間可以插入的數(shù)據(jù)塊列表。
字典管理表空間
如果你在早期Oracle版本上創(chuàng)建你的數(shù)據(jù)庫(kù),然后你可以使用字典管理表空間。這樣的表空間使用數(shù)據(jù)字典來管理它的區(qū)段。無論區(qū)段被分配還是回收重新使用時(shí),Oracle都會(huì)更新數(shù)據(jù)字典的適當(dāng)?shù)谋怼racle還保存數(shù)據(jù)字典表每個(gè)更新的回滾信息。因?yàn)閿?shù)據(jù)字典表和回滾段是數(shù)據(jù)庫(kù)的一部分,它們占用的空間和其他數(shù)據(jù)一樣使用相同的空間管理方式。
Oracle支持一個(gè)數(shù)據(jù)庫(kù)中多個(gè)塊大小。SYSTEM表空間使用標(biāo)準(zhǔn)的塊大小。這個(gè)值在Oracle創(chuàng)建時(shí)設(shè)定,可以使用任何有效值。你可以通過初始化參數(shù)DB_BLOCK_SIZE來指定標(biāo)準(zhǔn)的塊大小。取值區(qū)間是2K到32K。
在初始化參數(shù)文件或者服務(wù)器參數(shù)中,你可以定義針對(duì)每個(gè)塊大小的子Cache。子Cache可以在實(shí)例運(yùn)行時(shí)定義。您可以創(chuàng)建使用任一這些塊大小的表空間。SYSTEM表空間和其他大多數(shù)表空間采用標(biāo)準(zhǔn)的塊大小。
多個(gè)塊大小在從一個(gè)OLTP數(shù)據(jù)庫(kù)到一個(gè)企業(yè)數(shù)據(jù)倉(cāng)庫(kù)中傳輸表空間比較有用。它降低了在不同塊大小數(shù)據(jù)庫(kù)之間傳輸數(shù)據(jù)的困難性。
在數(shù)據(jù)庫(kù)打開狀態(tài)時(shí),數(shù)據(jù)庫(kù)管理員隨時(shí)可以將除SYSTEM表空間之外的表空間在線(online,可訪問)和離線(offline,不可訪問)。Oracle打開狀態(tài)時(shí)SYSTEM表空間必須一直在線,因?yàn)閿?shù)據(jù)文件必須可以訪問。
一個(gè)表空間通常是在線的,所以其中的數(shù)據(jù)對(duì)于數(shù)據(jù)庫(kù)用戶是可用的。雖然如此,數(shù)據(jù)庫(kù)管理員可以將一個(gè)表空間離線,這樣就可以維護(hù)或者備份以及恢復(fù)。
將表空間離線
當(dāng)一個(gè)表空間離線時(shí),Oracle不允許任何指向這個(gè)表空間上的對(duì)象的SQL運(yùn)行。指向這個(gè)表空間數(shù)據(jù)的活動(dòng)事務(wù)的完成的SQL語(yǔ)句在事務(wù)級(jí)別是不受影響的。Oracle保存這些完成的語(yǔ)句回滾數(shù)據(jù)到SYSTEM表空間的延期回滾段上。當(dāng)表空間重新在線時(shí),如果需要的話,Oracle會(huì)在表空間上應(yīng)用這個(gè)回滾數(shù)據(jù)。
當(dāng)一個(gè)表空間離線或者恢復(fù)在線,這些會(huì)在SYSTEM表空間的數(shù)據(jù)字典中記錄。如果你離線表空間之后關(guān)閉數(shù)據(jù)庫(kù),那么數(shù)據(jù)庫(kù)隨后裝載和重新打開時(shí)表空間仍然保持離線。
Oracle會(huì)在遇到某些錯(cuò)誤時(shí)自動(dòng)將一個(gè)表空間從在線轉(zhuǎn)為離線。例如,當(dāng)遇到數(shù)據(jù)庫(kù)寫進(jìn)程DBWn在多次寫入表空間的數(shù)據(jù)文件失敗之后,Oracle會(huì)切換表空間為離線。用戶試圖訪問離線表空間的數(shù)據(jù)表會(huì)得到一個(gè)錯(cuò)誤。如果錯(cuò)誤是媒體失敗導(dǎo)致的磁盤I/O問題,解決問題之后,你必須恢復(fù)表空間。
表空間在特殊程序下的使用
如果你創(chuàng)建了多個(gè)表空間來分離不同類型的數(shù)據(jù),你針對(duì)特定目錄指定表空間離線。其他的表空間保持在線,這樣他們的信息仍然可用。雖然如此,表空間離線可能會(huì)發(fā)生特殊情況。例如,如果兩個(gè)表空間分別存儲(chǔ)表數(shù)據(jù)和相應(yīng)的索引數(shù)據(jù),遵守下列情況:
u 如果包含索引的表空間離線,查詢?nèi)匀豢梢栽L問表數(shù)據(jù),因?yàn)樵L問表數(shù)據(jù)索引不是必需的。
u 如果包含表數(shù)據(jù)的表空間離線,然后數(shù)據(jù)庫(kù)的表數(shù)據(jù)就不可訪問,因?yàn)樵L問數(shù)據(jù)是需要表的。
如果Oracle從在線表空間上擁有運(yùn)行語(yǔ)句足夠的信息,它就會(huì)運(yùn)行。如果需要離線表空間的數(shù)據(jù),這樣語(yǔ)句會(huì)失敗。
只讀表空間的主要目的是降低備份和恢復(fù)數(shù)據(jù)庫(kù)的較大的靜態(tài)部分的工作量。Oracle從不更新只讀表空間的數(shù)據(jù)文件,因而這些數(shù)據(jù)文件可以在只讀媒體上如CDROM和WORM驅(qū)動(dòng)器。
只讀表空間不能修改。要想更新一個(gè)只讀表空間,首先必須使表空間可以讀寫。更新表空間之后,你可以重新設(shè)置它為只讀。
因?yàn)橹蛔x表空間不能被修改,而且在任何時(shí)間點(diǎn)都不會(huì)被讀寫,所以它們不需要重復(fù)備份。而且,如果你需要恢復(fù)你的數(shù)據(jù)庫(kù),你不需要恢復(fù)任何只讀表空間,因?yàn)樗鼈儚膩頉]有改變過。(recover,restore是有區(qū)別的,前者是恢復(fù),后者是覆蓋,恢復(fù)數(shù)據(jù)庫(kù)需要先覆蓋,然后再恢復(fù),所以才說不需要恢復(fù)只讀表空間)。
你可以通過指定一個(gè)或多個(gè)專門用來的排序的臨時(shí)表空間來更好的有效的管理排序操作。這樣會(huì)有效的降低包括排序空間的分配和釋放的串行化空間的管理。單一的SQL操作可以使用多個(gè)臨時(shí)表空間來排序。例如,你可以在很大的表上創(chuàng)建索引,索引創(chuàng)建時(shí)的排序操作可以分布在多個(gè)表空間上。
使用排序的操作都從臨時(shí)表空間中受益。排序操作包含連接、索引創(chuàng)建、排序、聚集計(jì)算(GROUP BY)和收集優(yōu)化統(tǒng)計(jì)等等。在真正應(yīng)用集群中這種性能提高會(huì)體現(xiàn)的更充分。
排序段
一個(gè)或多個(gè)臨時(shí)表空間只能用于排序段。一個(gè)臨時(shí)表空間不同于用戶指定臨時(shí)段的表空間,任何這些表空間對(duì)用戶來說都是可用的。臨時(shí)表空間不能包含任何持久模式對(duì)象。
排序段在一個(gè)段被平行排序操作共享時(shí)使用。每個(gè)實(shí)例的一個(gè)排序段都在指定的表空間執(zhí)行排序操作。
臨時(shí)表空間在你執(zhí)行內(nèi)存無法容納的多個(gè)排序時(shí)能夠提高性能。給定臨時(shí)表空間的排序段在第一個(gè)排序操作執(zhí)行時(shí)創(chuàng)建。排序段會(huì)自動(dòng)擴(kuò)展區(qū)段,直到大于或者等于那個(gè)實(shí)例所有活動(dòng)排序的需要的存儲(chǔ)為止。
臨時(shí)表空間的創(chuàng)建
使用CREATE TABLESPACE和CREATE TEMPORARY TABLESPACE語(yǔ)句來創(chuàng)建臨時(shí)表空間。
表空間傳輸允許你傳輸數(shù)據(jù)庫(kù)的一部分到另一個(gè)數(shù)據(jù)庫(kù),甚至可以跨平臺(tái)。你可以克隆一個(gè)表空間,然后插入另一個(gè)數(shù)據(jù)庫(kù)中,在數(shù)據(jù)庫(kù)之間拷貝表空間,或者從一個(gè)Oracle數(shù)據(jù)庫(kù)抽出表空間插入另一個(gè)Oracle數(shù)據(jù)庫(kù)中,或者在兩個(gè)數(shù)據(jù)庫(kù)中移動(dòng)表空間。
通過表空間移動(dòng)數(shù)據(jù)比導(dǎo)入導(dǎo)出和卸載裝載同樣的數(shù)據(jù)的速度高出一個(gè)數(shù)量級(jí),因?yàn)閭鬏敱砜臻g只包括拷貝數(shù)據(jù)文件和集成表空間元數(shù)據(jù)。當(dāng)你傳輸表空間時(shí),你也可以移動(dòng)索引數(shù)據(jù),所以你不需要像導(dǎo)入或裝載表數(shù)據(jù)時(shí)那樣重建索引。
你可以跨平臺(tái)傳送表空間。(大部分但不是全部平臺(tái)支持跨平臺(tái)表空間傳送)。這個(gè)可以在以下方面使用:
u 提供一個(gè)更簡(jiǎn)單高效的方式為用戶在不同平臺(tái)上運(yùn)行的Oracle發(fā)布和散發(fā)結(jié)構(gòu)化數(shù)據(jù)。
u 簡(jiǎn)化從數(shù)據(jù)倉(cāng)庫(kù)環(huán)境到運(yùn)行在小型平臺(tái)上的數(shù)據(jù)集市分配數(shù)據(jù)的過程
u 通過異構(gòu)集群共享只讀表空間
u 允許數(shù)據(jù)庫(kù)從一個(gè)平臺(tái)到另一平臺(tái)的遷移
表空間檔案庫(kù)
一個(gè)表空間檔案庫(kù)是一系列表空間的合集。表空間檔案庫(kù)構(gòu)建在文件組檔案庫(kù)上,但是表空間檔案庫(kù)只包含數(shù)據(jù)庫(kù)之間需要移動(dòng)或者拷貝的表空間。不同的表空間集合可能保存在一個(gè)表空間檔案庫(kù)中,不同版本的特定表空間集合也可能保存在一起。表空間檔案庫(kù)中某一版本的表空間集合由以下部分組成:
u 對(duì)于表空間集合數(shù)據(jù)泵導(dǎo)出的dump文件
u 導(dǎo)出的數(shù)據(jù)泵的日志文件
u 組成表空間集合的數(shù)據(jù)文件
如何移動(dòng)或拷貝一個(gè)表空間到另一個(gè)數(shù)據(jù)庫(kù)
為移動(dòng)或者拷貝一系列表空間,你必須先使表空間只讀,拷貝這些表空間的數(shù)據(jù)文件,然后使用export/import來移動(dòng)保存在數(shù)據(jù)字典中的信息(元數(shù)據(jù))。元數(shù)據(jù)導(dǎo)出文件和數(shù)據(jù)文件都要拷貝到目標(biāo)數(shù)據(jù)庫(kù)所在機(jī)器上。傳輸這些文件可以使用任何拷貝平面文件的工具,如操作系統(tǒng)拷貝工具、FTP或者用CD分發(fā)。
在拷貝數(shù)據(jù)文件和導(dǎo)入元數(shù)據(jù)之后,你可以將表空間設(shè)置為讀/寫模式。
首先Oracle數(shù)據(jù)庫(kù)將COMPATIBLE初始化參數(shù)設(shè)為10或者更高來打開表空間的數(shù)據(jù)文件,每個(gè)文件支持它所屬的平臺(tái)。這些文件在文件頭的塊的磁盤格式都是一致的,這些文件頭的塊是用來對(duì)文件進(jìn)行標(biāo)識(shí)和校驗(yàn)的。只讀或者離線文件在它們被設(shè)為讀/寫或者在線模式后會(huì)獲得更高的兼容性。這暗示著Oracle 10g數(shù)據(jù)庫(kù)之前只讀表空間在他們使用跨平臺(tái)傳輸特性之前至少要啟用讀/寫一次。
Oracle數(shù)據(jù)庫(kù)的一個(gè)表空間由一個(gè)或者多個(gè)物理數(shù)據(jù)文件組成。一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間和一個(gè)數(shù)據(jù)庫(kù)。
Oracle通過指定特定大小的磁盤空間來為表空間創(chuàng)建數(shù)據(jù)文件,數(shù)據(jù)文件的大小還要加上文件頭需要的空間。當(dāng)數(shù)據(jù)文件創(chuàng)建時(shí),Oracle所運(yùn)行的操作系統(tǒng)會(huì)從文件上清除舊信息和認(rèn)證信息,然后才分配給Oracle使用。如果文件很大,這個(gè)步驟可能花費(fèi)大量的使間。數(shù)據(jù)庫(kù)中的第一個(gè)表空間總是SYSTEM表空間,所以任何Oracle數(shù)據(jù)庫(kù)創(chuàng)建時(shí)都要自動(dòng)將數(shù)據(jù)庫(kù)的第一個(gè)數(shù)據(jù)文件分配給SYSTEM表空間。
當(dāng)數(shù)據(jù)文件第一次創(chuàng)建時(shí),分配的磁盤空間被格式化但沒有包含任何用戶數(shù)據(jù)。雖然如此,Oracle保留了空間來為關(guān)聯(lián)的表空間(它是Oracle專用的文件)容納將來的段的數(shù)據(jù)。隨著表空間數(shù)據(jù)的增長(zhǎng),Oracle使用關(guān)聯(lián)數(shù)據(jù)文件的空閑空間來為段分配區(qū)段。
表空間中模式對(duì)象的數(shù)據(jù)物理的保存在構(gòu)成表空間的一個(gè)或多個(gè)數(shù)據(jù)文件中。注意一個(gè)模式對(duì)象并不對(duì)應(yīng)特定的數(shù)據(jù)文件;相反一個(gè)數(shù)據(jù)文件是指定表空間內(nèi)的任何模式對(duì)象數(shù)據(jù)的檔案庫(kù)。Oracle在表空間上一個(gè)或者多個(gè)數(shù)據(jù)文件為模式對(duì)象的數(shù)據(jù)分配空間。因此一個(gè)模式對(duì)象可以跨越一個(gè)或者多個(gè)數(shù)據(jù)文件。除非啟用表?xiàng)l帶化(這里數(shù)據(jù)是跨多個(gè)磁盤存儲(chǔ)的),數(shù)據(jù)庫(kù)管理員和最終用戶無法控制模式對(duì)象保存在哪個(gè)數(shù)據(jù)文件上。
你可以創(chuàng)建數(shù)據(jù)文件后修改數(shù)據(jù)文件的大小,或者你可以指定數(shù)據(jù)文件可以隨著表空間內(nèi)的模式對(duì)象的增長(zhǎng)而增長(zhǎng)。這個(gè)功能使得每個(gè)表空間擁有更少的數(shù)據(jù)文件和更簡(jiǎn)化數(shù)據(jù)文件管理。
你任何時(shí)候都可以讓表空間離線或者在線,當(dāng)然SYSTEM表空間不可以。在你讓表空間離線或者在線時(shí),表空間的所有數(shù)據(jù)文件作為一個(gè)整體離線或者在線。
你也可以使單獨(dú)的數(shù)據(jù)文件離線。雖然如此,這通常僅在某些數(shù)據(jù)庫(kù)恢復(fù)過程中使用。
本地管理的臨時(shí)表空間擁有臨時(shí)數(shù)據(jù)文件(tempfiles),它和通常的數(shù)據(jù)文件類似,但也有如下例外:
u 臨時(shí)文件總是設(shè)置為NOLOGGING模式
u 你不能使一個(gè)臨時(shí)文件只讀
u 你不能使用ALTER DATABASE語(yǔ)句來創(chuàng)建臨時(shí)文件
u 媒體恢復(fù)并不識(shí)別臨時(shí)文件:
² BACKUP CONTROLFILE不會(huì)產(chǎn)生任何臨時(shí)文件的信息
² CREATE CONTROLFILE不指定臨時(shí)文件的任何信息
u 當(dāng)你創(chuàng)建和改變臨時(shí)文件的大小,并不保證分配指定文件大小的磁盤空間。在特定的文件系統(tǒng)上(例如,UNIX)磁盤塊在文件創(chuàng)建和改變大小時(shí)并不分配,只在塊訪問前創(chuàng)建。
u 臨時(shí)文件的信息在數(shù)據(jù)字典視圖DBA_TEMP_FILES和動(dòng)態(tài)性能視圖V$TEMPFILE中顯示,但不在DBA_DATA_FILES和V$DATAFILE視圖中顯示。
數(shù)據(jù)庫(kù)控制文件是數(shù)據(jù)庫(kù)成功啟動(dòng)和操作必須的一個(gè)小二進(jìn)制文件??刂莆募贠racle數(shù)據(jù)庫(kù)使用的過程中持續(xù)更新,所以它在數(shù)據(jù)庫(kù)打開時(shí)必須保持可用。如果因?yàn)槟承┰蚩刂莆募豢稍L問,然后數(shù)據(jù)庫(kù)就不能正常工作了。
每個(gè)控制文件只能關(guān)聯(lián)一個(gè)Oracle數(shù)據(jù)庫(kù)。
控制文件包含相關(guān)數(shù)據(jù)庫(kù)的信息,實(shí)例啟動(dòng)或者正常操作時(shí)都需要訪問。控制文件的信息只能被Oracle修改;數(shù)據(jù)庫(kù)管理員和用戶都不能編輯控制文件。
在其他方面,控制文件包含如下信息:
u 數(shù)據(jù)庫(kù)名稱
u 數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)間戳
u 相關(guān)數(shù)據(jù)文件和重做日志文件的名稱和位置
u 表空間信息
u 數(shù)據(jù)文件離線范圍
u 日志歷史
u 歸檔日志信息
u 備份集和備份組件信息
u 數(shù)據(jù)文件和重做日志的備份信息
u 數(shù)據(jù)文件拷貝信息
u 當(dāng)前日志序列號(hào)
u 檢查點(diǎn)信息
數(shù)據(jù)庫(kù)名稱和時(shí)間戳來源于數(shù)據(jù)庫(kù)創(chuàng)建時(shí)。數(shù)據(jù)庫(kù)名稱來源于初始化參數(shù)DB_NAME或者CREATE DATABASE語(yǔ)句使用的名字。
每次數(shù)據(jù)文件或者重做日志文件被增加、重命名或者從數(shù)據(jù)庫(kù)中刪除,控制文件都會(huì)更新來反映物理結(jié)構(gòu)的修改。記錄這些改變是為了:
u Oracle可以在數(shù)據(jù)庫(kù)啟動(dòng)過程中標(biāo)識(shí)出數(shù)據(jù)文件和重做日志文件
u Oracle可以在數(shù)據(jù)庫(kù)恢復(fù)時(shí)標(biāo)識(shí)出需要的或可用的文件
因而,如果你修改了你的數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)(使用ALTER DATABASE語(yǔ)句),然后你應(yīng)該立刻對(duì)你的控制文件做一個(gè)備份。
控制文件還記錄檢查點(diǎn)信息。每3秒鐘,檢查點(diǎn)進(jìn)程(CKPT)在控制文件中記錄重做日志中的檢查點(diǎn)位置信息。在數(shù)據(jù)庫(kù)恢復(fù)過程中,這些信息告訴Oracle在重做日志組中的這個(gè)點(diǎn)之前的所有重做條目不需要進(jìn)行恢復(fù);它們已經(jīng)寫入到數(shù)據(jù)文件了。
和重做日志文件一樣,Oracle可以在同一個(gè)數(shù)據(jù)庫(kù)中使用多個(gè)同樣的控制文件來并行打開和寫入。通過在多個(gè)磁盤中多路復(fù)用控制文件,你可以避免控制文件的單點(diǎn)失敗問題。如果包含控制文件的一個(gè)磁盤崩潰,然后當(dāng)前實(shí)例在Oracle視圖訪問損壞的控制文件時(shí)會(huì)失敗。雖然如此,當(dāng)其他磁盤上的當(dāng)前控制文件可用時(shí),一個(gè)實(shí)例可以重新啟動(dòng)而不需要進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)。
如果一個(gè)數(shù)據(jù)庫(kù)的所有數(shù)據(jù)文件在操作時(shí)都丟失了,然后實(shí)例會(huì)中斷,需要進(jìn)行媒體恢復(fù)。如果當(dāng)前的控制文件拷貝不可用,需要使用舊的控制文件備份的話,媒體恢復(fù)是個(gè)很復(fù)雜的過程。所以強(qiáng)烈建議你遵循如下建議:
u 每個(gè)數(shù)據(jù)庫(kù)都使用多路復(fù)用
u 在不同的物理盤上保存一個(gè)拷貝
u 使用操作系統(tǒng)鏡像
u 監(jiān)控備份
聯(lián)系客服