Oracle Database 10g:改善的表空間管理
2024-08-29 13:29: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_valuefrom database_propertieswhere 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_propertieswhere 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--------undotbs1sql> 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 引進了列重命名,現在 — 在最新的版本中 — 表空間自身的重命名成為可能。這些增強顯著地減輕了數據庫管理員的任務 — 特別是在數據倉庫或數據中心環境中。