Oracle 在線重定義

Oracle 在線重定義(Online Redefinition) 是一種功能,通過DBMS_REDEFINITION 包提供,允許DBA在不需要停止或顯著影響數據庫正常操作的情況下,對數據庫表進行結構化修改。

可以實現的功能

  • 將表移動到其它表空間

  • 增加、修改或者刪除表的字段

  • 將非分區表轉換為分區表

  • 修改表的分區結構

  • 高水位線回收

  • 將普通表轉換為索引組織表

測試數據

五千萬條數據,數據文件test_tbs01.dbf,表空間test_tbs

將表移動到其它表空間

#創建新表空間
CREATE?TABLESPACE?new_tbs?DATAFILE?'/datafile/new_tbs01.dbf'?SIZE?10G?AUTOEXTEND?ON?NEXT?1G?MAXSIZE?UNLIMITED;#給用戶授權
ALTER?USER?TEST_USER?QUOTA?UNLIMITED?ON?NEW_TBS;#檢查選擇的表是否可以執行在線重定義
BEGINDBMS_REDEFINITION.CAN_REDEF_TABLE('TEST_USER',?'TEST_TABLE');
END;
/#創建中間表(結構與原表一致,但指定新表空間)
CREATE?TABLE?test_user.test_table_int?(id?NUMBER?PRIMARY?KEY,name?VARCHAR2(100)?NOT?NULL,created_date?DATE,value?NUMBER(10),comments?VARCHAR2(500)
)?TABLESPACE?new_tbs;#?開始在線重定義(使用主鍵方式)
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK??--?使用主鍵);
END;
/#?復制依賴對象(自動復制索引、約束)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',copy_indexes?=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers?=>?TRUE,copy_constraints?=>?TRUE,copy_privileges?=>?TRUE,ignore_errors?=>?TRUE,num_errors?=>?num_errors);
END;
/#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/#?完成重定義(短暫鎖表)#?DBMS_REDEFINITION.FINISH_REDEF_TABLE?會執行flush?shard?pool?需要規避
alter?session?set?events?'10995?trace?name?context?forever,?level?2';BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

增加、修改或者刪除表的字段

操作:添加字段new_column VARCHAR2(50),刪除字段comments。

#檢查選擇的表是否可以執行在線重定義
BEGINDBMS_REDEFINITION.CAN_REDEF_TABLE('TEST_USER',?'TEST_TABLE');
END;
/

#?創建中間表(添加新字段,刪除舊字段)
CREATE?TABLE?test_user.test_table_int?(id?NUMBER?PRIMARY?KEY,name?VARCHAR2(100)?NOT?NULL,created_date?DATE,value?NUMBER(10),new_column?VARCHAR2(50)
)?TABLESPACE?test_tbs;

#?開始在線重定義(使用主鍵方式)
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname????????=>?'TEST_USER',?orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT',col_mapping??=>?'id?id,?name?name,?created_date?created_date,?value?value',?options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK);
END;
/

#?復制依賴對象(自動復制索引、約束)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',copy_indexes?=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers?=>?TRUE,copy_constraints?=>?TRUE,copy_privileges?=>?TRUE,ignore_errors?=>?TRUE,num_errors?=>?num_errors);
END;
/
#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

#?完成重定義
BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

將非分區表轉換為分區表

#檢查選擇的表是否可以執行在線重定義
BEGINDBMS_REDEFINITION.CAN_REDEF_TABLE('TEST_USER',?'TEST_TABLE');
END;
/

#創建中間表
CREATE?TABLE?test_user.test_table_int?(id????????????NUMBER,name??????????VARCHAR2(100)?NOT?NULL,created_date??DATE?NOT?NULL,?value?????????NUMBER(10),new_column????VARCHAR2(50),CONSTRAINT?pk_test_table_int?PRIMARY?KEY?(id,?created_date)?
)
PARTITION?BY?RANGE?(created_date)?(PARTITION?p1?VALUES?LESS?THAN?(TO_DATE('2023-01-01',?'YYYY-MM-DD')),PARTITION?p2?VALUES?LESS?THAN?(TO_DATE('2024-01-01',?'YYYY-MM-DD')),PARTITION?p3?VALUES?LESS?THAN?(MAXVALUE)
)?TABLESPACE?test_tbs;

#?開始在線重定義(使用主鍵方式)
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname????????=>?'TEST_USER',orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT',col_mapping??=>?'id?id,?name?name,?created_date?created_date,?value?value,?new_column?new_column',??options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK);
END;
/

--?復制依賴對象(自動復制索引、約束)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',copy_indexes?=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers?=>?TRUE,copy_constraints?=>?TRUE,copy_privileges?=>?TRUE,ignore_errors?=>?TRUE,num_errors?=>?num_errors);
END;
/

#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

#?完成重定義#?DBMS_REDEFINITION.FINISH_REDEF_TABLE?會執行flush?shard?pool?需要規避
alter?session?set?events?'10995?trace?name?context?forever,?level?2';BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

#創建新表空間
CREATE?TABLESPACE?new_tbs?DATAFILE?'/datafile/new_tbs01.dbf'?SIZE?10G?AUTOEXTEND?ON?NEXT?1G?MAXSIZE?UNLIMITED;#給用戶授權
ALTER?USER?TEST_USER?QUOTA?UNLIMITED?ON?NEW_TBS;#檢查選擇的表是否可以執行在線重定義
BEGINDBMS_REDEFINITION.CAN_REDEF_TABLE('TEST_USER',?'TEST_TABLE');
END;
/#創建中間表(結構與原表一致,但指定新表空間)
CREATE?TABLE?test_user.test_table_int?(id?NUMBER?PRIMARY?KEY,name?VARCHAR2(100)?NOT?NULL,created_date?DATE,value?NUMBER(10),comments?VARCHAR2(500)
)?TABLESPACE?new_tbs;#?開始在線重定義(使用主鍵方式)
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK??--?使用主鍵);
END;
/--?復制依賴對象(自動復制索引、約束)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',copy_indexes?=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers?=>?TRUE,copy_constraints?=>?TRUE,copy_privileges?=>?TRUE,ignore_errors?=>?TRUE,num_errors?=>?num_errors);
END;
/#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/#?完成重定義(短暫鎖表)#?DBMS_REDEFINITION.FINISH_REDEF_TABLE?會執行flush?shard?pool?需要規避
alter?session?set?events?'10995?trace?name?context?forever,?level?2';BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

修改表的分區結構

當前表為范圍分區:

#?創建哈希分區中間表CREATE?TABLE?test_user.test_table_int?(id????????????NUMBER,name??????????VARCHAR2(100)?NOT?NULL,created_date??DATE,value?????????NUMBER(10),new_column????VARCHAR2(50),CONSTRAINT?pk_test_table_int?PRIMARY?KEY?(id)
)
PARTITION?BY?HASH?(id)
PARTITIONS?4
TABLESPACE?test_tbs;

#?啟動在線重定義
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname????????=>?'TEST_USER',orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT',col_mapping??=>?'id?id,?name?name,?created_date?created_date,?value?value,?new_column?new_column',options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK);
END;
/

#?復制依賴對象(自動復制索引、觸發器等)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname??????????=>?'TEST_USER',orig_table?????=>?'TEST_TABLE',int_table??????=>?'TEST_TABLE_INT',copy_indexes???=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers??=>?TRUE,ignore_errors??=>?TRUE,num_errors?????=>?num_errors);DBMS_OUTPUT.PUT_LINE('依賴對象錯誤:?'?||?num_errors);
END;
/

#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname????????=>?'TEST_USER',orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT');
END;
/

#?完成重定義(短暫鎖表)
BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname????????=>?'TEST_USER',orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT');
END;
/

高水位線回收(碎片整理)

#?記錄當前高水位線
SELECT?blocks,?empty_blocks?
FROM?dba_tables?
WHERE?owner?=?'TEST_USER'?AND?table_name?=?'TEST_TABLE';

#檢查選擇的表是否可以執行在線重定義
BEGINDBMS_REDEFINITION.CAN_REDEF_TABLE('TEST_USER',?'TEST_TABLE');
END;
/

#創建中間表
CREATE?TABLE?test_user.test_table_int?(id?NUMBER?PRIMARY?KEY,name?VARCHAR2(100)?NOT?NULL,created_date?DATE,value?NUMBER(10),new_column?VARCHAR2(50)
)?TABLESPACE?test_tbs;

#?開始在線重定義(使用主鍵方式)
BEGINDBMS_REDEFINITION.START_REDEF_TABLE(uname????????=>?'TEST_USER',orig_table???=>?'TEST_TABLE',int_table????=>?'TEST_TABLE_INT',col_mapping??=>?'id?id,?name?name,?created_date?created_date,?value?value,?new_column?new_column',??options_flag?=>?DBMS_REDEFINITION.CONS_USE_PK);
END;
/

--?復制依賴對象(自動復制索引、約束)
DECLAREnum_errors?PLS_INTEGER;
BEGINDBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT',copy_indexes?=>?DBMS_REDEFINITION.CONS_ORIG_PARAMS,copy_triggers?=>?TRUE,copy_constraints?=>?TRUE,copy_privileges?=>?TRUE,ignore_errors?=>?TRUE,num_errors?=>?num_errors);
END;
/

#?同步數據
BEGINDBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

#?完成重定義#?DBMS_REDEFINITION.FINISH_REDEF_TABLE?會執行flush?shard?pool?需要規避
alter?session?set?events?'10995?trace?name?context?forever,?level?2';BEGINDBMS_REDEFINITION.FINISH_REDEF_TABLE(uname?=>?'TEST_USER',orig_table?=>?'TEST_TABLE',int_table?=>?'TEST_TABLE_INT');
END;
/

檢查高水位是否回收

SELECT?blocks,?empty_blocks?
FROM?dba_tables?
WHERE?owner?=?'TEST_USER'?AND?table_name?=?'TEST_TABLE';

轉換為索引組織表(IOT)

總體步驟都與前面相同

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92060.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web 開發 12

1 網址里的 “搜索請求” 結構 這張圖是在教你怎么看懂 網址里的 “搜索請求” 結構,特別基礎但超重要,對你學前端幫別人做搜索功能超有用,用大白話拆成 3 步講: 1. 先看「協議(Protocol)」 HTTPS 就是瀏…

網絡安全 | 如何構建一個有效的企業安全響應團隊

網絡安全 | 如何構建一個有效的企業安全響應團隊 一、前言 二、團隊組建的基礎要素 2.1 人員選拔 2.2 角色定位 三、團隊應具備的核心能力 3.1 技術專長 3.2 應急處置能力 3.3 溝通協作能力 四、團隊的運作機制 4.1 威脅監測與預警流程 4.2 事件響應流程 4.3 事后復盤與改進機制…

HTTP、WebSocket、TCP、Kafka等通訊渠道對比詳解

在當今互聯的數字世界中,通信渠道是系統、應用程序和設備之間數據交換的支柱。從傳統的HTTP和TCP協議到專為特定場景設計的Kafka和MQTT等平臺,這些通信方式滿足了從實時消息傳遞到大規模數據流處理的多樣化需求。本文將深入探討主要的通信協議和平臺。一…

臭氧、顆粒物和霧霾天氣過程的大氣污染物計算 CAMx模型

隨著我國經濟快速發展,我國面臨著日益嚴重的大氣污染問題。大氣污染是工農業生產、生活、交通、城市化等方面人為活動的綜合結果,同時氣象因素是控制大氣污染的關鍵自然因素。大氣污染問題既是局部、當地的,也是區域的,甚至是全球…

數據結構(13)堆

目錄 1、堆的概念與結構 2、堆的實現 2.1 向上調整算法(堆的插入) 2.2 向下調整算法(堆的刪除) 2.3 完整代碼 3、堆的應用 3.1 堆排序 3.2 Top-K問題 1、堆的概念與結構 堆是一種特殊的二叉樹,根結點最大的堆稱…

C++模板知識點3『std::initializer_list初始化時逗號表達式的執行順序』

std::initializer_list初始化時逗號表達式的執行順序 在使用Qt Creator4.12.2&#xff0c;Qt5.12.9 MinGW開發的過程中發現了一個奇怪的現象&#xff0c;std::initializer_list<int>在初始化構造時的執行順序反了&#xff0c;經過一番測試發現&#xff0c;其執行順序可正…

【Unity3D】Shader圓形弧度裁剪

片元著色器&#xff1a; float3 _Center float3(0, 0, 0); float3 modelPos i.modelPos;// float angle atan2(modelPos.y - _Center.y, modelPos.x - _Center.x); // 計算角度&#xff0c;范圍-π到π float angle atan2(modelPos.y - _Center.y, modelPos.z - _Center.z)…

curl發送文件bodyParser無法獲取請求體的問題分析

問題及現象 開發過程使用curlPUT方式發送少量數據, 后端使用NodeJSexpress框架bodyParser,但測試發現無法獲取到請求體內容,現象表現為req.body 為空對象 {} 代碼如下: const bodyParser require(body-parser); router.use(/api/1, bodyParser.raw({limit: 10mb, type: */*}))…

Vue3 學習教程,從入門到精通,Vue 3 內置屬性語法知識點及案例代碼(25)

Vue 3 內置屬性語法知識點及案例代碼 Vue 3 提供了豐富的內置屬性&#xff0c;幫助開發者高效地構建用戶界面。以下將詳細介紹 Vue 3 的主要內置屬性&#xff0c;并結合詳細的案例代碼進行說明。每個案例代碼都包含詳細的注釋&#xff0c;幫助初學者更好地理解其用法。1. data …

機器學習基石:深入解析線性回歸

線性回歸是機器學習中最基礎、最核心的算法之一&#xff0c;它為我們理解更復雜的模型奠定了基礎。本文將帶你全面解析線性回歸的方方面面。1. 什么是回歸&#xff1f; 回歸分析用于預測連續型數值。它研究自變量&#xff08;特征&#xff09;與因變量&#xff08;目標&#xf…

OneCodeServer 架構深度解析:從組件設計到運行時機制

一、架構概覽與設計哲學1.1 系統定位與核心價值OneCodeServer 作為 OneCode 平臺的核心服務端組件&#xff0c;是連接前端設計器與后端業務邏輯的橋梁&#xff0c;提供了從元數據定義到應用程序執行的完整解決方案。它不僅是一個代碼生成引擎&#xff0c;更是一個全生命周期管理…

Jwts用于創建和驗證 ??JSON Web Token(JWT)?? 的開源庫詳解

Jwts用于創建和驗證 ??JSON Web Token&#xff08;JWT&#xff09;?? 的開源庫詳解在 Java 開發中&#xff0c;提到 Jwts 通常指的是 ??JJWT&#xff08;Java JWT&#xff09;庫??中的核心工具類 io.jsonwebtoken.Jwts。JJWT 是一個專門用于創建和驗證 ??JSON Web To…

如果發送的數據和接受的數據不一致時,怎么辦?

那ART4222這個板卡舉例&#xff0c;我之間輸入一個原始數據“6C532A14”&#xff0c;但是在選擇偶校驗時&#xff0c;接收的是“6C532B14”&#xff0c;我發送的碼率&#xff08;運行速度&#xff09;是100000&#xff0c;但接受的不穩定&#xff0c;比如&#xff1b;“100100.…

ISCC認證:可持續生產的新標桿。ISCC如何更快認證

在全球可持續發展浪潮中&#xff0c;ISCC&#xff08;國際可持續與碳認證&#xff09;體系已成為企業綠色轉型的重要工具。這一國際公認的認證系統覆蓋農業、林業、廢棄物處理等多個領域&#xff0c;通過嚴格的可持續性標準、供應鏈可追溯性要求和碳排放計算規范&#xff0c;建…

想對學習自動化測試的一些建議

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;接觸了不少同行&#xff0c;由于他們之前一直做手工測試&#xff0c;現在很迫切希望做自動化測試&#xff0c;其中不乏工作5年以上的人。 本人從事軟件自動化測試已經近5年&#xff0c;從server端到web…

電子電氣架構 ---智能電動汽車嵌入式軟件開發過程中的block點

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

createAsyncThunk

下面&#xff0c;我們來系統的梳理關于 Redux Toolkit 異步操作&#xff1a;createAsyncThunk 的基本知識點&#xff1a;一、createAsyncThunk 概述 1.1 為什么需要 createAsyncThunk 在 Redux 中處理異步操作&#xff08;如 API 調用&#xff09;時&#xff0c;傳統方法需要手…

STM32F103C8T6 BC20模塊NBIOT GPS北斗模塊采集溫濕度和經緯度發送到EMQX

云平臺配置 訪問下載頁面&#xff1a;免費試用 EMQX Cloud 或 EMQX Enterprise | 下載 EMQX&#xff0c;根據需求選擇對應版本下載。將下載的壓縮包上傳至服務器&#xff08;推薦存放于C盤根目錄&#xff0c;便于后續操作&#xff09;&#xff0c;并解壓至指定路徑&#xff08…

YOLO11漲點優化:自研檢測頭, 新創新點(SC_C_11Detect)檢測頭結構創新,實現有效漲點

目標檢測領域迎來重大突破!本文揭秘原創SC_C_11Detect檢測頭,通過空間-通道協同優化與11層深度結構,在YOLO系列上實現mAP最高提升5.7%,小目標檢測精度暴漲9.3%!創新性結構設計+即插即用特性,為工業檢測、自動駕駛等場景帶來革命性提升! 一、傳統檢測頭的三大痛點 在目…

OSCP 考試期間最新考試政策

根據 Offensive Security 官方最新考試政策&#xff08;2025 年 7 月&#xff09;&#xff0c;OSCP 考試期間禁止或嚴格限制以下工具與行為&#xff1a; 一、絕對禁止使用的工具/服務 類別舉例說明商業/付費版本Metasploit Pro、Burp Suite Pro、Cobalt Strike、Canvas、Core …