線上重定義方式將普通表修改為分割槽表
線上重定義表具有以下功能
(1)修改表的儲存引數;
(2)可以將錶轉移到其他表空間;
(3)增加並行查詢選項;
(4)增加或刪除分割槽;
(5)重建表以減少碎片;
(6)將堆表改為索引組織表或相反的操作;
(7)增加或刪除一個列。
呼叫DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色,除此之外,
還需要CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE和SELECT ANY TABLE的許可權。
線上重定義表的步驟說明
1.選擇一種重定義方法:
存在兩種重定義方法,一種是基於主鍵、另一種是基於ROWID。
ROWID的方式不能用於索引組織表,而且重定義後會存在隱藏列M_ROW$$。預設採用主鍵的方式。
2.呼叫DBMS_REDEFINITION.CAN_REDEF_TABLE()過程,如果表不滿足重定義的條件,將會報錯並給出原因。
3.在用一個方案中建立一個空的中間表,根據重定義後你期望得到的結構建立中間表。
比如:採用分割槽表,增加了COLUMN等。
4.呼叫DBMS_REDEFINITION.START_REDEF_TABLE()過程,並提供下列引數:
被重定義的表的名稱、中間表的名稱、列的對映規則、重定義方法。
如果對映方法沒有提供,則認為所有包括在中間表中的列用於表的重定義。
如果給出了對映方法,則只考慮對映方法中給出的列。如果沒有給出重定義方法,則認為使用主鍵方式。
5.在中間表上建立觸發器、索引和約束,並進行相應的授權。任何包含中間表的完整性約束應將狀態置為disabled。
當重定義完成時,中間表上建立的觸發器、索引、約束和授權將替換重定義表上的觸發器、索引、約束和授權。
中間表上disabled的約束將在重定義表上enable。
6.(可選)如果在執行DBMS_REDEFINITION.START_REDEF_TABLE()過程
和執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程直接在重定義表上執行了大量的DML操作,
那麼可以選擇執行一次或多次的SYNC_INTERIM_TABLE()過程,
以減少最後一步執行FINISH_REDEF_TABLE()過程時的鎖定時間。
7.執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程完成表的重定義。
這個過程中,原始表會被獨佔模式鎖定一小段時間,具體時間和表的資料量有關。
執行完FINISH_REDEF_TABLE()過程後,原始表重定義後具有了中間表的屬性、索引、約束、授權和觸發器。
中間表上disabled的約束在原始表上處於enabled狀態。
8.(可選)可以重新命名索引、觸發器和約束。對於採用了ROWID方式重定義的表,包括了一個隱含列M_ROW$$。
推薦使用下列語句經隱含列置為UNUSED狀態或刪除。
-- MA_User
-- 1、檢查是否支援線上重定義
execute dbms_redefinition.can_redef_table('TEST','MA_User');
-- 2、建立分割槽表 表名_temp
create table MA_User_TEMP ( UserNum INTEGER not null, UserName VARCHAR2(30), CreateDate DATE NOT NULL, Remark VARCHAR2(64) ) partition by range (CreateDate) interval (NUMTOYMINTERVAL(1,'MONTH')) store in (ET_Month_Part) (partition part_01 values less than (TO_DATE('20170101','YYYYMMDD'))) enable row movement; alter table MA_User_TEMP add constraint PK_MA_User_TEMP primary key (UserNum);
-- 3、執行表的線上重定義
execute dbms_redefinition.start_redef_table('TEST','MA_User','MA_User_TEMP');
-- 4、執行中間表和資料來源表的資料同步。
execute dbms_redefinition.sync_interim_table('TEST','MA_User','MA_User_TEMP');
-- 5、執行結束線上定義過程。
execute dbms_redefinition.finish_redef_table('TEST','MA_User','MA_User_TEMP');
-- 6、驗證資料
select t1.partition_name from DBA_TAB_PARTITIONS t1 where t1.table_name = 'MA_USER'; select t1.partition_name from DBA_TAB_PARTITIONS t1 where t1.table_name = 'MA_USER_TEMP';
-- 7、刪除臨時表
drop table MA_User_TEMP purge;
-- 8、修改索引名
-- alter index IDX_PART_TABLE rename to IDX_T_TABLE; alter index PK_MA_User_TEMP rename to PK_MA_User; alter table MA_User rename constraint PK_MA_User_TEMP to PK_MA_User;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69903557/viewspace-2749255/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 線上重定義與普通表改為分割槽表
- 指令碼:線上重定義,從普通表到分割槽表,redefinition_table.sh指令碼
- 線上重定義的操作步驟__普通錶轉換為分割槽表的實驗案例
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- LightDB 22.4 新特性之相容Oracle線上轉換普通表為分割槽表Oracle
- PG的非分割槽表線上轉分割槽表
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- Oracle 12C新特性-線上把非分割槽錶轉為分割槽表Oracle
- oracle分割槽表和分割槽表exchangeOracle
- oracle分割槽表和非分割槽表exchangeOracle
- 在oracle 9i下線上重定義表Oracle
- 【ASK_ORACLE】使用insert語句將普通錶轉換成分割槽表Oracle
- PostgreSQL分割槽表、繼承表記錄去重方法SQL繼承
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- 增加表分割槽時,為local分割槽索引指定不同表空間的方法索引
- 壓縮錶轉非壓縮表(線上重定義)
- 【MYSQL】 分割槽表MySql
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 移動分割槽表和分割槽索引的表空間索引
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- MySQL 分割槽表探索MySql
- 分割槽表-實戰
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- SQL SERVER之分割槽表SQLServer
- ORACLE分割槽表梳理系列Oracle
- Spark操作Hive分割槽表SparkHive
- OceaBase 分割槽表建立技巧
- Mysql表分割槽實現MySql
- mysql 進行表分割槽MySql
- Mysql表分割槽實操MySql
- PostgreSQL:傳統分割槽表SQL