Oracle 9i 前,表格重組需匯出/匯入(離線操作),甚至 ALTER TABLE ADD COLUMN 也會導致獨佔鎖,阻塞所有 DML。9i 引入 DBMS_REDEFINITION 套件,實現線上表格重定義,允許在保持表格可更新狀態下重組結構,對 24/7 系統至關重要。
CREATE TABLE ... AS SELECT)EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('PUBS','TITLES','TITLES2');
ALTER TABLE TITLES ADD CONSTRAINT PK_TITLES PRIMARY KEY (TITLE_ID);
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('PUBS','TITLES');
CREATE TABLE TITLES2 AS SELECT * FROM TITLES;
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(
'PUBS','TITLES','TITLES2',
'TITLE_ID TITLE_ID, TITLE TITLE, TYPE TYPE, PUB_ID PUB_ID,
PRICE PRICE, ADVANCE ADVANCE, ROYALTY*1.1 ROYALTY,
YTD_SALES YTD_SALES, NOTES NOTES, PUBDATE PUBDATE'
);
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('PUBS','TITLES','TITLES2');
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('PUBS','TITLES','TITLES2');
DROP TABLE TITLES2;
若重組失敗,必須先釋放快照才能重新開始:
EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('PUBS','TITLES','TITLES2');
該程序接受三個參數:Schema、原始表名、暫存表名,會清除快照並允許重新開始。
NOT NULL 約束