Oracle Database 10g新特性-改善的表空間管理

pxbibm發表於2015-07-30

表空間管理得到了重大的改進,這可以歸因於一個 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 月的資料。大致的操作流程類似於以下操作:

 

  1. 利用 ALTER TABLE EXCHANGE PARTITION 從分割槽 JAN 中建立一個獨立的表 JAN03。
  2. 將表空間重新命名為 JAN03。
  3. 為表空間 JAN03 建立一個可傳輸表空間集。
  4. 將表空間 JAN03 重新命名為 JAN。
  5. 將空的分割槽交換回表中。

 

第 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 引進了列重新命名,現在 — 在最新的版本中 — 表空間自身的重新命名成為可能。這些增強顯著地減輕了資料庫管理員的任務 — 特別是在資料倉儲或資料中心環境中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12798004/viewspace-1757064/,如需轉載,請註明出處,否則將追究法律責任。

相關文章