首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 9i 線上表格重定義:零停機重組資料表結構

     編輯:Oracle 資料庫基礎

背景與動機

Oracle 9i 前,表格重組需匯出/匯入(離線操作),甚至 ALTER TABLE ADD COLUMN 也會導致獨佔鎖,阻塞所有 DML。9i 引入 DBMS_REDEFINITION 套件,實現線上表格重定義,允許在保持表格可更新狀態下重組結構,對 24/7 系統至關重要。

核心流程四步驟

  1. 以 CTAS 建立暫存表(CREATE TABLE ... AS SELECT)
  2. 建立暫存表快照
  3. 將重組期間發生的變更排入佇列
  4. 同步變更佇列至新表,完成切換

完整重組腳本範例

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、原始表名、暫存表名,會清除快照並允許重新開始。

主要限制條件

  • 需預留雙倍表空間容量
  • 不可變更主鍵欄位
  • 表格必須有主鍵
  • 僅限同一 Schema 內操作
  • 重組完成前,新增欄位不可加 NOT NULL 約束
  • 不支援 LONG、BFILE、使用者定義型別 (UDT)
  • 不支援叢集表、SYS/SYSTEM Schema、具體化視圖日誌、含具體化視圖的表
  • 不支援水平子集化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved