這篇文章主要講解了“oracle在線重定義表有什么功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“oracle在線重定義表有什么功能”吧!
在線重定義表具有以下功能:
修改表的存儲參數;
可以將表轉移到其他表空間;
增加并行查詢選項;
增加或刪除分區;
重建表以減少碎片;
將堆表改為索引組織表或相反的操作;
增加或刪除一個列。
原理:增量物化視圖刷新
目的:清理表中碎片,釋放空間(重建表以減少碎片)
重定義方法:
存在兩種重定義方法,一種是基于主鍵、另一種是基于ROWID。
ROWID的方式不能用于索引組織表,而且重定義后會存在隱藏列M_ROW$$。
默認采用主鍵的方式。
前提條件:
1)查看表中是否含有主鍵,在線重定義需要表中存在主鍵
select a.constraint_name, a.column_name from dba_cons_columns a, dba_constraints b
where a.constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name in('ZWD_JDMSG_GD','ZB2C_KUCUN_LOG');
2)如果在執行在線重定義的過程中出現任何的失敗操作,那么需要執行dbms_redefinition.abort_redef_table來回退;
1、檢查是否能夠重定義
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('用戶名', '源表', DBMS_REDEFINITION.CONS_USE_PK); --主鍵方式
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('用戶名', '源表', DBMS_REDEFINITION.CONS_USE_ROWID); --ROWID方式
2、獲取源表建表語句
SET SERVEROUTPUT ON
SET LINESIZE 1000
SET FEEDBACK OFF
set long 99999
set pagesize 4000
select dbms_metadata.get_ddl('TABLE','ZWD_JDMSG_GD','SAPSR3') from dual;
3、創建中間表(根據源表創建語句)
4、查看依賴對象
SELECT * from dba_dependencies where REFERENCED_NAME in ('ZWD_JDMSG_GD','ZB2C_KUCUN_LOG');
5、調用dbms_redefinition包執行表的在線重定義。
EXEC DBMS_REDEFINITION.start_redef_table('SAPSR3','ZWD_JDMSG_GD','T_TEMP');
或者
--null代表所有的列名與原表一樣
begin
dbms_redefinition.start_redef_table(‘用戶’,‘原表’,‘中間表’,null,dbms_redefinition.cons_use_rowid);
end;
6、復制依賴對象到中間表,后幾個參數分別表示從原表復制索引、觸發器、約束、權限、某一項復制出錯跳過、復制過程中的出錯數目、復制統計信息、復制物化視圖日志
(各選項憑需要取用,完畢后需檢查num_errors的值,有錯一定要查看,酌情處理)
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
(‘用戶’, ‘原表’,‘臨時表’, DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors, TRUE, TRUE);
END;
7、查看報錯信息
select object_name,base_table_name,ddl_txt from DBA_REDEFINITION_ERRORS;
8、 將中間表中的數據和原始表中的數據進行同步操作(這一步不是必須的)。
如果在執行dbms_redefinition.start_redef_table和dbms_redefinition.finish_redef_table之間有大量的DML操作發生,
那么執行一次dbms_redefinition.sync_interim_table來減少最后一步執行dbms_redefinition.finish_redef_table時的鎖定時間。
EXEC dbms_redefinition.sync_interim_table('DBSYAN','T_TEST','T_TEMP');
9、結束在線重定義過程
EXEC dbms_redefinition.finish_redef_table('DBSYAN','T_TEST','T_TEMP');
執行完FINISH_REDEF_TABLE()過程后,原始表重定義后具有了中間表的屬性、索引、約束、授權和觸發器。中間表上disabled的約束在原始表上處于enabled狀態。
10、檢查原表的表空間是否改變,檢查其數據、結構、索引等依賴對象是否正確
11、執行失敗,進行回退
EXEC dbms_redefinition.abort_redef_table ('DBSYAN','T_TEST','T_TEMP');
注意:
對于采用了ROWID方式重定義的表,包括了一個隱含列M_ROW$$。推薦使用下列語句經隱含列置為UNUSED狀態或刪除
ALTER TABLE TABLE_NAME SET UNUSED (M_ROW$$);
ALTER TABLE TABLE_NAME DROP UNUSED COLUMNS;
感謝各位的閱讀,以上就是“oracle在線重定義表有什么功能”的內容了,經過本文的學習后,相信大家對oracle在線重定義表有什么功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。