溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

oracle在線重定義表有什么功能

發(fā)布時間:2021-11-05 11:21:39 來源:億速云 閱讀:237 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要講解了“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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI