資料表空間管理得到了重大的改進, 這可以歸因於一個 sparser SYSTEM、為使用者定義一個預設資料表空間的支援、新的 SYSAUX、甚至重新命名
您曾經多少次因使用者在 SYSTEM 資料表空間中建立了非 SYS 和 SYSTEM 的段而傷透腦筋?
在 Oracle9i Database 之前,如果在建立使用者時沒有指定預設資料表空間,那麼它將預設為 SYSTEM 資料表空間。如果使用者在建立一個段時沒有顯式地指定一個資料表空間,那麼這個段將在 SYSTEM 中建立—前提是使用者在 SYSTEM 資料表空間中擁有配額(要麼顯式地授予,要麼通過系統許可權 UNLIMITED TABLESPACE 來授予)。Oracle9i 允許 DBA 為所有未用顯式的暫存資料表空間子句建立的使用者指定一個預設的暫存資料表空間,從而減少了這個問題。
在 Oracle Database 10g 中,您可以類似地為使用者指定一個預設資料表空間。在資料庫建立期間,CREATE DATABASE 命令可以包含子句 DEFAULT TABLESPACE 。在建立之後,您可以通過發出以下命令來使一個資料表空間變成預設資料表空間:
ALTER DATABASE DEFAULT TABLESPACE <tsname>; |
未用 DEFAULT TABLESPACE 子句建立的所有使用者將以 作為它們的預設資料表空間。您可以在任何時候通過這個 ALTER 命令來改變預設資料表空間,從而允許您在不同的節點上將不同的資料表空間指定為預設資料表空間。
重要注意事項:擁有舊的資料表空間的所有使用者的預設資料表空間都被修改為 ,即使有些資料表空間是為某些使用者顯式指定的。例如,假定使用者 USER1 和 USER2 的資料表空間分別是 TS1 和 TS2 — 它們是在使用者建立期間顯式指定的。資料庫當前的預設資料表空間是 TS2,但之後,資料庫的預設資料表空間變為 TS1。即使 USER2 的預設資料表空間是顯式指定為 TS2 的,它也將變為 TS1。小心這種邊界效應!
如果在資料庫建立期間沒有指定預設資料表空間,它將預設為 SYSTEM。但您如何才能知道現有的資料庫的預設資料表空間是哪一個?發出以下查詢:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'; |
DATABASE_PROPERTIES 視圖顯示預設資料表空間之外,還顯示一些非常重要的資訊 — 例如預設暫存資料表空間、全域資料庫名、時區等。
資料表空間管理得到了重大的改進, 這可以歸因於一個 sparser SYSTEM、為使用者定義一個預設資料表空間的支援、新的 SYSAUX、甚至重新命名
您曾經多少次因使用者在 SYSTEM 資料表空間中建立了非 SYS 和 SYSTEM 的段而傷透腦筋?
在 Oracle9i Database 之前,如果在建立使用者時沒有指定預設資料表空間,那麼它將預設為 SYSTEM 資料表空間。如果使用者在建立一個段時沒有顯式地指定一個資料表空間,那麼這個段將在 SYSTEM 中建立—前提是使用者在 SYSTEM 資料表空間中擁有配額(要麼顯式地授予,要麼通過系統許可權 UNLIMITED TABLESPACE 來授予)。Oracle9i 允許 DBA 為所有未用顯式的暫存資料表空間子句建立的使用者指定一個預設的暫存資料表空間,從而減少了這個問題。
在 Oracle Database 10g 中,您可以類似地為使用者指定一個預設資料表空間。在資料庫建立期間,CREATE DATABASE 命令可以包含子句 DEFAULT TABLESPACE 。在建立之後,您可以通過發出以下命令來使一個資料表空間變成預設資料表空間:
ALTER DATABASE DEFAULT TABLESPACE <tsname>; |
未用 DEFAULT TABLESPACE 子句建立的所有使用者將以 作為它們的預設資料表空間。您可以在任何時候通過這個 ALTER 命令來改變預設資料表空間,從而允許您在不同的節點上將不同的資料表空間指定為預設資料表空間。
重要注意事項:擁有舊的資料表空間的所有使用者的預設資料表空間都被修改為 ,即使有些資料表空間是為某些使用者顯式指定的。例如,假定使用者 USER1 和 USER2 的資料表空間分別是 TS1 和 TS2 — 它們是在使用者建立期間顯式指定的。資料庫當前的預設資料表空間是 TS2,但之後,資料庫的預設資料表空間變為 TS1。即使 USER2 的預設資料表空間是顯式指定為 TS2 的,它也將變為 TS1。小心這種邊界效應!
如果在資料庫建立期間沒有指定預設資料表空間,它將預設為 SYSTEM。但您如何才能知道現有的資料庫的預設資料表空間是哪一個?發出以下查詢:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'; |
DATABASE_PROPERTIES 視圖顯示預設資料表空間之外,還顯示一些非常重要的資訊 — 例如預設暫存資料表空間、全域資料庫名、時區等。
非必要模式的預設資料表空間
幾種模式(如智能代理使用者 DBSNMP、資料採礦使用者 ODM)與使用者操作不直接相關,但對資料庫完整性仍很重要。這些模式中的一些曾經用 SYSTEM 作為它們的預設資料表空間 — 這是在 SYSTEM 資料表空間內對象增殖的又一個原因。
Oracle Database 10g 引進了一個新的稱為 SYSAUX 的資料表空間,它用來儲存這些模式的對象。這個資料表空間是在資料庫建立期間自動建立的,並在本地進行管理。唯一允許修改的是資料檔案的名稱。
這種方法在 SYSTEM 損壞需要完整的資料庫恢複時,為恢複提供支援。SYSAUX 中的對象可以被恢複為任意正常的使用者物件,同時資料庫本身保持運行。
但如果您想將 SYSAUX 中的這些模式中的一些轉移到一個不同的資料表空間中時,該怎麼辦?例如,考慮 LogMiner 使用的對象,這些對象的大小經常增長,直到最終填滿資料表空間。出於可管理性的原因,您可能考慮將它們轉移到它們自己的資料表空間中。但實現這一目的的最好的方法 是什嗎?
作為一個資料庫管理員,瞭解轉移這些特殊對象的正確過程對您而言是很重要的。幸運的 是,Oracle Database 10g 提供了一個新的視圖使要憑猜測來做的工作形象化。這個視圖,V$SYSAUX_OCCUPANTS,列出了資料表空間 SYSAUX 中的模式的名稱、它們的說明、當前使用的空間,以及如何轉移它們。(參見表 1。)
注意 LogMiner 如何被清楚地顯示為佔用 7,488 KB 的空間。它歸模式 SYSTEM 所有,而要轉移對象,您需要執行打包的過程 SYS.DBMS_LOGMNR_D.SET_TABLESPACE。不過,對於 STATSPACK 對象,這個視圖推薦使用匯入/匯出方法;而對於流,沒有轉移過程 — 因而您不能容易地將它們從 SYSAUX 資料表空間中轉移出來。列 MOVE_PROCEDURE 預設顯示 SYSAUX 中存在的幾乎所有工具的正確的轉移過程。也可以逆向使用轉移過程來使對象回到 SYSAUX 資料表空間中。
重新命名一個資料表空間
在資料倉儲環境中(典型地,對於資料中心體繫結構),在資料庫之間傳輸資料表空間是很常 見的。但來源資料庫和目標資料庫必須不存在擁有相同名稱的資料表空間。如果存在兩個擁有相同名稱的資料表空間,則目標資料表空間中的段必須轉移到一個不同的資料表空間中,然 後重新建立這個資料表空間— 這個任務說起來容易做起來難。
Oracle Database 10g 提供了一個方便的解決方案:您可以用以下命令來簡單地重新命名一個現有的資料表空間(SYSTEM 和 SYSAUX 除外) — 無論是永久資料表空間還是暫存資料表空間:
ALTER TABLESPACE <oldname> RENAME TO <newname>; |
這個功能還將應用在存檔過程 中。假定您有一個定界分割的表,用於記錄銷售曆史資料,每個月的這個分區位於按這個月份命名的一個資料表空間中 — 例如,1 月份的分區命名為 JAN,並位於一個名稱為 JAN 的資料表空間中。這樣您就擁有了一個將資訊保留 12 個月的策略。在 2004 年 1 月,您將能夠存檔 2003 年 1 月的資料。大致的操作流程類似於以下操作:
● 利用 ALTER TABLE EXCHANGE PARTITION 從分區 JAN 中建立一個獨立的表 JAN03。
● 將資料表空間重新命名為 JAN03。
● 為資料表空間 JAN03 建立一個可傳輸資料表空間集。
● 將資料表空間 JAN03 重新命名為 JAN。
● 將空的分區交換回表中。
第 1、2、4 和 5 步很簡單,並且不會過度地消耗資源(如重做和撤消空間)。第 3 步只是拷貝檔案並只為 JAN03 輸出資料字典資訊,這也是個非常輕鬆的過程。如果您需要恢複之前存檔的分區,這個過程也非常簡單,您只需要將相同的過程反過來就行了。
Oracle Database 10g 在處理這些重新命名的方式上相當智能化。如果您重新命名作為 UNDO 或預設暫存資料表空間的資料表空間,這可能產生混淆。但資料庫將自動調整必要的記錄來反映這種變化。例如,將預設資料表空間的名稱從 USERS 修改為 USER_DATA 將自動修改視圖 DATABASE_PROPERTIES。在修改之前,查詢:
select property_value from database_properties where property_name = 'DEFAULT_PERMANENT_TABLESPACE'; |
返回 USERS。在運行下面的語句之後
alter tablespace users rename to user_data; |
上述查詢返回 USER_DATA,因為所有對 USERS 的引用都被修改為到 USER_DATA。修改預設暫存資料表空間的情況一樣。甚至修改 UNDO 資料表空間的名稱也將觸發 SPFILE 中的變化,如下所示:
SQL> select value from v$spparameter where name = 'undo_tablespace'; VALUE -------- UNDOTBS1 SQL> alter tablespace undotbs1 rename to undotbs; Tablespace altered. SQL> select value from v$spparameter where name = 'undo_tablespace'; VALUE -------- UNDOTBS |
結論
在最近的幾個 Oracle 版本演變的過程中,對象處理得到了穩定的增強。Oracle8i 引進了表從一個資料表空間到另一個資料表空間的轉移,Oracle 9i Database R2 引進了列重新命名,現在 — 在最新的版本中 — 資料表空間自身的重新命名成為可能。這些增強顯著地減輕了資料庫管理員的任務 — 特別是在資料倉儲或資料中心環境中。
(T004)