oracle表空間管理分析

表空間管理得到了重大的改進,這可以歸因於一個 sparser SYSTEM、爲用戶定義一個默認表空間的支持、新的 SYSAUX、甚至重命名

在 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>;

來源:考試大-Oracle認證考試

 

這個功能還將應用在存檔過程中。假定您有一個按範圍分區的表,用於記錄銷售歷史數據,每個月的這個分區位於按這個月份命名的一個表空間中 — 例如,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 引進了列重命名,現在 — 在最新的版本中 — 表空間自身的重命名成爲可能。這些增強顯著地減輕了數據庫管理員的任務 — 特別是在數據倉庫或數據中心環境中。  

來源:考試大-Oracle認證考試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章