Oracle大表改為分區表及表空間切換方案


Oracle大表改為分區表及表空間切換方案

一、            背景

由於之前數據庫表和索引放在一個表空間導致表空間數據文件增長太快,文件數量即將達到Oracle表空間的限制,需要對表(沒有分區,有些表數據量多達幾十億,文件大小TB級)進行表空間遷移,並對某些表改造為分區表。

二、            可選方案分析

1.    使用IMP/EXP

導入(import)導出(export)工具年頭已久,將數據導出為二進制文件,將會在11g r2之后廢棄,只用於遺留數據的導入導出

此工具可以完成所需功能,但有如下限制:

1)         導出數據量大時非常慢,只能分批操作

2)         不支持表名映射,需要第三個用戶或者數據庫參與

3)         需要操作用戶有DBA權限

4)         需要有IMP/EXP工具操作權限

5)         在客戶端操作,受到網絡影響

2.    使用IMPDP/IMPDP

EXPDP/IMPDP工具從10g開始引入,參數格式與EXP/IMP類似

優點:

1)         可以並發執行導入導出任務

2)         可以導入導出多個文件

3)         無需緩存,直接操作數據庫和目標文件

4)         不受網絡影響,expdp服務端程序

5)         支持對象映射,可直接映射表空間和表

6)         可以從未分區表導入到分區表

缺點:

1)         需要服務器約5TB的磁盤空間來存儲二進制文件,可以分批導出

2)         一次性導入undo空間要足夠大

3.    使用alter table ** move tablespace ***

此命令是將一個表移動到另外一個表空間中

優點:

1)         對於大表move時,對此表的查詢不受影響,只有DML操作受影響

2)         索引結構不受影響,只需move完成后rebuild

3)         與其它對象依賴關系不受影響,操作前不必為對象間的依賴關系操心

4)         move操作可以parallel。

5)         NOLOGGING選項可大大加快重建速度,如果要move的表是nologging的,則不需指定

缺點:

1)         當前的用戶必須對原表空間和新表空間都有操作權限

2)         不能改變表結構從普通表轉換為分區表

3)         數據太大可能操作不成功

4)         經過驗證不會釋放原表空間數據文件已經格式化的磁盤空間

5)         當目標表空間不足時會中途才提示失敗

 

4.    采用表重定義

把一個數據量非常大的普通表改造成分區表,如果離線操作能夠解決問題,就不要用在線重定義,例如一些靜態數據、歷史數據的歸檔遷移,可使用CTAS、alter table move、或導出導入完成

使用場景:

1)         修改表的物理屬性、存儲參數

2)         將表遷移到別的表空間

3)         消除表碎片、釋放空間

4)         在表中增加、刪除或重命名字段

5)         大批量改變表中的數據

原理:

通過DBMS_REDEFINITION包來實現,首先會創建一個快速刷新的物化視圖作為過渡表,然后將源表的數據加載到過渡表中,並在源表上創建物化視圖日志,以支持快速刷新同步數據

限制條件與風險:

1)         使用基於主鍵的方式,則原表與重定義后的表必須有相同的主鍵

2)         使用基於ROWID的方式,不能是索引組織表

3)         有物化視圖或者物化視圖日志的表、物化視圖容器表、高級隊列表、索引組織表的溢出表、擁有BFILE,LOGN列的表、 Cluster表、sys和system下的表、臨時表不能在線重定義

4)         不支持水平數據子集

5)         在列映射時只能使用有確定結果的表達式,如子查詢就不行

6)         中間表有新增列,則不能有NOT NULL約束

7)         原表和中間表之間不能有引用完整性

8)         在線重定義無法采用nologging

9)         表空間至少要留有比源表所用空間更大的剩余空間,也就說至少要事先創建5T的表空間

10)     對業務的影響小,但過程耗時較長,測試兩千萬的數據花費十多分鍾   20

11)     如果源表上的事務操作過於頻繁,可能會發生較嚴重的等待,不存在事務

參考:https://www.sohu.com/a/166577098_505827

 

5.    采用CATS +RENAME

CTAS這種方法采用DDL語句,不產生UNDO,只產生少量REDO,建表后數據已經在分布到各個分區中,最后交換源表與目標表的名字即可

核心sql:create table t(id, time) partition by range (time) (partition t1 values less than (to_date('201311', 'yyyymm')), partition t2 values less than (maxvalue)) nologging parallel 4 as select /*+parallel*/ id, time from s;

性能提升方式:

1)   加nologging:alter table t nologging;完成后根據需要將表修改為logging

2)   並行DDL: alter session enable parallel dml;

3)         查詢並行

6.    采用INSERT+RENAME

這種方法適用於包含大數據量的表轉到分區表中的一個分區的操作,就是先建立分區表結構然后使用insert來實現,將滿足一個分區的數據查到某個中間表中,然后交換中間表和目標表的分區,每個部分都做完后交換源表與目標表的名字(alter table p exchange partition p1 with table t)。

性能提升:

1)         表修改為nologging

2)         啟用並行DML,alter session enable parallel dml;

3)         采用 append方式插入

4)         所有數據插入完成后再建索引

不足:

1)         仍然存在一致性問題,交換分區之后RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據,不過當前不存在

2)         要求數據分布到多個分區中,會增加操作的復雜度,效率也會降低

7.    數據清洗方式

這種方法就是先建立表結構,然后建立任務每個一段時間,從源表查詢一定時間方位內的數據插入到新表中,最后交換源表與目標表的名字,操作簡單。

性能提升:

5)         表修改為nologging,

6)         數據插入完成后再建索引

7)         啟用並行DML,alter session enable parallel dml;

8)         采用 append方式插入

三、            遷移原則

  1. 將所有的索引都放在TM_INDX表空間
  2. 遷移后的表(或者分區)盡量均勻分布在新的表空間
  3. 選擇合適的表結構(聚簇表、IOT、分區表…),提升查詢性能、可維護性
  4. 合理設置表結構的參數,提升查詢性能、節約存儲空間
  5. 選擇合適的索引(函數、位圖…)、刪除不合理的無用的索引

四、            遷移步驟

1.    小表

對於小表或者數據量穩定的表不需要分區,不需要做表空間遷移,或者直接采用方案5(ctas+rename)方式均勻遷移到新的表空間中

2.    遷移大表

首先排除方案3(不能釋放空間)和方案4(效率低,基本不涉及事務)

1)         確認需要操作的表(遷移、重建、刪除)

2)         刪除功能重復的表

3)         先遷移數據量相對比較小的表(10-100G),分別驗證方案1、2、5、6、7的效率和可行性

4)         根據驗證結果選擇最優的方式遷移大表

3.    索引

將用不到的索引刪除

將所有放在TM_DATA表空間的索引rebuild到TM_INDX表空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM