數據庫管理員可以在數據庫處於開啟(open)狀態時令除 SYSTEM 表空間(tablespace)之外的任何表空間聯機(online)(可訪問)或脫機(offline)(不可訪問)。SYSTEM 表空間在數據庫處於開啟(open)狀態時總是處於聯機狀態,因為Oracle需要使用其中的數據字典(data dictionary)。
表空間(tablespace)通常處於聯機(online)狀態,以便數據庫用戶訪問其中的數據。但是數據庫管理員可以在對表空間進行維護,備份或恢復操作時,令表空間脫機(offline)。
令表空間脫機
當一個表空間(tablespace)脫機(offline)后,Oracle不允許任何SQL語句繼續引用此表空間內的對象(schema object)。如果一個活動事務(activetransaction)中的 SQL 語句正好在使用被置為脫機狀態的表空間內的對象,其事務性也不會被破壞。Oracle使用 SYSTEM 表空間內的延遲回滾段(deferred rollback segment)為此事務中已完成的 SQL 語句保存回滾信息(rollback data)。當脫機表空間被重新置位聯機(online)狀態后,Oracle會在需要時應用這些回滾信息。
表空間(tablespace)聯機(online)或脫機(offline)時,SYSTEM 表空間內的數據字典(data dictionary)會進行記錄。如果用戶關閉(shut down)一個數據庫時某個表空間處於脫機狀態,那么這個表空間在數據庫下次被裝載(mount)、打開(open)后依舊保持脫機狀態。
用戶只能將一個表空間(tablespace)聯機(online)到創建她的數據庫中,因為只有這個數據庫的 SYSTEM 表空間中才保存着與此表空間相關的必要的數據字典(data dictionary)信息。一個脫機(offline)的表空間不能被Oracle之外的工具打開或編輯。因此脫機表空間不能被移動到其他數據庫中。
當某些錯誤發生時,Oracle會自動地將相關的聯機表空間(online tablespace)切換到脫機(offline)狀態。例如,當數據庫寫入進程(database writerprocess,DBWn)多次嘗試向表空間的數據文件(datafile)寫入失敗后,Oracle就會將此表空間切換到脫機狀態。此時嘗試訪問脫機表空間內數據表的用戶將會得到錯誤信息。如果是介質故障(media failure)導致此次磁盤 I/O 失敗,用戶必須在處理故障后恢復(recover)受影響的表空間。
特殊情況下的表空間使用
用戶可以將不同類型的數據分開存儲在不同的表空間(tablespace)中。當用戶因為某些任務而令某個表空間脫機(offline)后,其余表空間仍保持聯機(online)狀態,其中的數據對用戶依然可用。但是表空間脫機后也會導致特殊情況發生。例如,有兩個表空間分別用於存儲表及此表對應的索引,將出現以下問題:● 如果包含索引的表空間脫機,那么查詢依舊可以訪問表數據,因為對表數據的訪問並不一定需要索引數據。
● 如果包含表的表空間脫機,那么查詢將無法訪問表數據,因為脫機表空間內的對象無法被引用。
如果Oracle能夠從聯機(online)表空間(tablespace)中獲得執行一個SQL語句的足夠的信息,那么語句就將被執行。如果相關信息必須從脫機(offline)的表空間中獲得,那么語句將失敗。
只讀表空間
使用只讀表空間(read-only tablespace)的主要目的是為了避免對靜態、且容量大的數據庫內容進行備份和恢復操作。Oracle不會更新只讀表空間內的數據,因此這類表空間的數據文件(datafile)可以放置在 CD-ROM 或 WORM之類的只讀介質(read-only media)上。
提示:用戶只能將一個表空間(tablespace)聯機(online)到創建她的數據庫,因此只讀表空間(read-only tablespace)技術不適用於存檔工作(archiving)。
只讀表空間(read-only tablespace)不能被修改。如需更新一個只讀表空間,首先要使表空間可讀寫。在更新后,還可以將表空間恢復到只讀狀態。
因為只讀表空間(read-only tablespace)不能被修改,只要沒有將只讀表空間置於可讀寫狀態,就無需對其進行重復的備份操作。當用戶需要恢復數據庫時,也沒必要恢復只讀表空間,原因同前所述。
進行此操作必須具有ALTER TABLESPACE 或 MANAGE TABLESPACE 系統權限,GRANT ALTER TABLESPACE TO "USER";
GRANT MANAGE TABLESPACE TO "USER";(雙引號內必須大寫)
也可以使表空間中所有的數據文件或臨時文件脫機,然后還能聯機,而不影響表空間自己的脫機或聯機狀態。
脫機表空間的原因
● 使數據庫的一部分失效,同時允許對數據庫剩余部分進行正常訪問。
● 進行脫機表空間備份(盡管表空間在聯機並正使用的情況下也能備份)
● 在升級或維護應用程序時,使應用程序和它的那組表臨時不可用。
脫機表空間選項
NORMAL
如果表空間所有數據文件都沒有錯誤,表空間可以正常脫機。寫入錯誤導致表空間所有數據文件都不能脫機。當指定OFFLINE NORMAL時,Oracle對所有數據文件一邊進行檢查一邊將他們脫機。
TEMPORARY
表空間能臨時脫機,即使表空間的一個或多個數據文件有錯誤。當指定OFFLINE TEMPORARY選項時,Oracle將還沒脫機的數據文件脫機,同時對他們進行檢查。如果沒有數據文件脫機,然后用臨時選項脫機,當聯機表空間時不需要介質恢復。但是,如果有表空間的文件因寫入錯誤脫機,然后將表空間臨時脫機,在將表空間聯機之前需要介質恢復。
IMMEDIATE
表空間能立即脫機,不等Oracle對任何數據文件做檢查。在指定OFFLINE IMMEDIATE的情況下,當聯機表空間時需要介質恢復。如果數據庫運行在NOARCHIVELOG模式下,表空間不能立即脫機。
FOR RECOVER
將在恢復集中的數據庫表空間脫機,以便進行時間點恢復。
如果必須脫機表空間,盡量用NORMAL選項(默認)。這將保證表空間聯機時不需要恢復。盡管部分恢復后用ALTER DATABASE OPEN RESETLOGS語句重置了重做日志序列,依然不需要恢復。只有當不能正常脫機表空間的時候才指定TEMPORARY選項。這種情況下,只有因錯誤被脫機的文件在表空間聯機時才需要恢復。只有當指定NORMAL和TEMPORARY都不行的情況下才用IMMEDIATE選項。
脫機表空間前的考慮:
- 驗證表空間不含有活動的回滾段,這樣的表空間不能脫機。
- 你可能想改變表空間的位置,這個表空間的用戶已經將它指定為默認的或臨時的表空間。這是明智的,因為當脫機時,他們不能訪問表空間的對象,不能排序表空間區域(sort areas in the tablespace)。
聯機表空間
只要數據庫打開,Oracle數據庫的表空間都能恢復聯機。如果要聯機的表空間不是“干凈”脫機(即用NORMAL選項的ALTER TABLESPACE OFFLINE語句),在聯機之前必須先對表空間進行介質恢復。否則,Oracle返回錯誤並保持表空間脫機。
改變數據文件或臨時文件的可用性
ALTER TABLESPACE語句的子句能改變表空間中所有數據文件或臨時文件的聯機或脫機狀態。影響聯機/脫機狀態的特定語句:
你只需要輸入表空間名稱,不是單獨的數據文件或臨時文件。所有數據文件或臨時文件都受到影響,但表空間自己的聯機/脫機狀態不變。大多數情況下,上面ALTER TABLESPACE語句能執行,只要數據庫掛載,即使沒有打開。如果是SYSTEM表空間,重做表空間,或默認臨時表空間,數據庫一定不能打開。ALTER DATABASE DATAFILE 和 ALTER DATABASE TEMPFILE語句也有ONLINE/OFFLINE子句,但在那些語句里需要輸入所有表空間的文件名。語法與改變表空間可用性的ALTER TABLESPACE … ONLINE|OFFLINE語句不同,因為那是不同的操作。ALTER TABLESPACE語句將數據文件和表空間脫機,但不能用於改變臨時表空間或它的臨時文件。
SELECT tablespace_name FROM dba_tablespaces
ALTER TABLESPACE users OFFLINE NORMAL;
ALTER TABLESPACE users ONLINE;