在Oracle9i出現之前,你只能通過MOVE或匯出和匯入的方式來進行表的重定義,因此表重已定義流程可能相當漫長或者說是一個離線過程,在此期間應用程式對該表的操作將失敗。除了這個,如果用exp,我們也不能保證exp的時候該表的資料沒有改變(除非單使用者),而imp更是一個漫長的過程。為瞭解決這個問題,Oracle9i在其DBMS_REDEFINITION軟體包中引入了線上重定義功能。這個特性對24*7的資料庫系統來說非常重要,使用這個技術DBA可以在保持表允許DML語句的情況下修改結構,比如添加列、移動表到其他資料表空間、處理表的片段等,當然了對於表的片段處理,在10g以後,可以考慮使用shrink操作來實現,關於shrink在這裡不做討論。
線上重定義具有以下功能:
(1)修改表的儲存參數;
(2)可以將錶轉移到其他資料表空間;
(3)在表上增加、修改或刪除一列或是多列;
(4)增加並行查詢選項;
(5)增加分區支援;
(6)修改分區結構;
(7)重建表以減少片段;
(8)將堆表改為索引組織表或相反的操作;
線上重定義的方法
1.基於主鍵
2.基於ROWID。ROWID的方式不能用於索引組織表,而且重定義後會存在隱藏列M_ROW$$。
預設採用主鍵的方式。
線上重定義的一些限制
1.要求原始表和中間表在同一個方案下;
2.要求有2倍甚至是多於2倍的資料表空間空間;
3.如果使用主鍵重定義的方式,原始表上要有主鍵;
對於線上重定義的步驟,這裡不再具體說明,我們通過一個實驗來示範一下,下面是一個把普通錶轉換成分區表線上重定義的例子
一、首先建立使用者tj,並授予能夠完成線上重定義的許可權和角色
SQL> create user tj identified by tj
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users;
User created.
SQL> GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE,
2 DROP ANY TABLE, LOCK ANY TABLE ,SELECT ANY TABLE,
3 CREATE ANY INDEX,CREATE ANY TRIGGER
4 TO TJ;
Grant succeeded.
SQL> GRANT EXECUTE_CATALOG_ROLE TO TJ;
Grant succeeded.