您好,登錄后才能下訂單哦!
這篇文章主要講解了“oracle在線重定義表有什么功能”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“oracle在線重定義表有什么功能”吧!
在線重定義表具有以下功能:
修改表的存儲參數(shù);
可以將表轉(zhuǎn)移到其他表空間;
增加并行查詢選項(xiàng);
增加或刪除分區(qū);
重建表以減少碎片;
將堆表改為索引組織表或相反的操作;
增加或刪除一個列。
原理:增量物化視圖刷新
目的:清理表中碎片,釋放空間(重建表以減少碎片)
重定義方法:
存在兩種重定義方法,一種是基于主鍵、另一種是基于ROWID。
ROWID的方式不能用于索引組織表,而且重定義后會存在隱藏列M_ROW$$。
默認(rèn)采用主鍵的方式。
前提條件:
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)如果在執(zhí)行在線重定義的過程中出現(xiàn)任何的失敗操作,那么需要執(zhí)行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、創(chuàng)建中間表(根據(jù)源表創(chuàng)建語句)
4、查看依賴對象
SELECT * from dba_dependencies where REFERENCED_NAME in ('ZWD_JDMSG_GD','ZB2C_KUCUN_LOG');
5、調(diào)用dbms_redefinition包執(zhí)行表的在線重定義。
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、復(fù)制依賴對象到中間表,后幾個參數(shù)分別表示從原表復(fù)制索引、觸發(fā)器、約束、權(quán)限、某一項(xiàng)復(fù)制出錯跳過、復(fù)制過程中的出錯數(shù)目、復(fù)制統(tǒng)計(jì)信息、復(fù)制物化視圖日志
(各選項(xiàng)憑需要取用,完畢后需檢查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、查看報(bào)錯信息
select object_name,base_table_name,ddl_txt from DBA_REDEFINITION_ERRORS;
8、 將中間表中的數(shù)據(jù)和原始表中的數(shù)據(jù)進(jìn)行同步操作(這一步不是必須的)。
如果在執(zhí)行dbms_redefinition.start_redef_table和dbms_redefinition.finish_redef_table之間有大量的DML操作發(fā)生,
那么執(zhí)行一次dbms_redefinition.sync_interim_table來減少最后一步執(zhí)行dbms_redefinition.finish_redef_table時的鎖定時間。
EXEC dbms_redefinition.sync_interim_table('DBSYAN','T_TEST','T_TEMP');
9、結(jié)束在線重定義過程
EXEC dbms_redefinition.finish_redef_table('DBSYAN','T_TEST','T_TEMP');
執(zhí)行完FINISH_REDEF_TABLE()過程后,原始表重定義后具有了中間表的屬性、索引、約束、授權(quán)和觸發(fā)器。中間表上disabled的約束在原始表上處于enabled狀態(tài)。
10、檢查原表的表空間是否改變,檢查其數(shù)據(jù)、結(jié)構(gòu)、索引等依賴對象是否正確
11、執(zhí)行失敗,進(jìn)行回退
EXEC dbms_redefinition.abort_redef_table ('DBSYAN','T_TEST','T_TEMP');
注意:
對于采用了ROWID方式重定義的表,包括了一個隱含列M_ROW$$。推薦使用下列語句經(jīng)隱含列置為UNUSED狀態(tài)或刪除
ALTER TABLE TABLE_NAME SET UNUSED (M_ROW$$);
ALTER TABLE TABLE_NAME DROP UNUSED COLUMNS;
感謝各位的閱讀,以上就是“oracle在線重定義表有什么功能”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對oracle在線重定義表有什么功能這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。