oracle分割槽交換(exchange)技術
需求:一個幾億條資料的分割槽表,要把一些老資料分出來,放一個新建的表上。按時間劃分,指定時間以前的放在老資料表,指定時間以後的資料保留在原表,然後把備份老資料表空間truncate掉。按照分割槽操作分割槽交換是最好的解決辦法。
分割槽交換技術可以實現資料快速轉移,所以在資料載入提速,歷史資料清理等方面特別有用。分割槽交換技術實際上只修改了資料字典中的資料物理段位置,而不是實際的移動資料,所以速度很快。
建立分割槽表:
create table t_exchange
(
sno number not null primary key,
oitime date DEFAULT sysdate,
word varchar2(100)
)
PARTITION BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;
歷史分割槽表:
create table t_exchange_his
(
sno number not null primary key,
oitime date DEFAULT sysdate,
word varchar2(100)
)
PARTITION BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;
插入資料:
begin
for i in 1..30000 loop
insert into t_exchange values(i,sysdate,lpad('mingshuo',100,'x'));
end loop;
dbms_output.put_line('success!');
commit;
end;
/
建立一些不同型別的索引,觀察分割槽交換是不是會對索引產生影響:
源表:
建立全域性分割槽索引:
create index t_exchange_idx_01 on t_exchange(sno,oitime,word)
GLOBAL partition by range(sno)
(
partition p01 values less than(10000) tablespace TBS_MING,
partition p02 values less than(20000) tablespace TBS_MING,
partition p03 values less than(MAXVALUE) tablespace TBS_MING
);
建立本地非字首索引:
create index t_exchange_idx_02 on t_exchange(word) local;
建立唯一索引:
create unique index t_exchange_idx_03 on t_exchange(sno,oitime);
歷史表:
建立全域性分割槽索引:
create index t_exchange_his_idx_01 on t_exchange_his(sno,oitime,word)
GLOBAL partition by range(sno)
(
partition p01 values less than(10000) tablespace TBS_MING,
partition p02 values less than(20000) tablespace TBS_MING,
partition p03 values less than(MAXVALUE) tablespace TBS_MING
);
建立本地非字首分割槽索引:
create index t_exchange__his_idx_02 on t_exchange_his(word) local;
源表與歷史表的區別在於沒有建立唯一索引。
建立中間表:
create table t_exchange_tmp as select * from t_exchange where 1=2;
SQL> !ora ddl ming table t_exchange_tmp
\n=============Fri Jun 22 19:31:13 CST 2018===================\n
Session altered.
DBMS_METADATA.GET_DDL(UPPER('TABLE'),UPPER('T_EXCHANGE_TMP'),UPPER('MING'))
-------------------------------------------------------------------------------
CREATE TABLE "MING"."T_EXCHANGE_TMP"
( "SNO" NUMBER NOT NULL ENABLE,
"OITIME" DATE,
"WORD" VARCHAR2(100)
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "TBS_MING"
插入資料之前開啟10046事件跟蹤:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, true);
將資料裝載到中間表:
alter table t_exchange exchange partition p1 with table t_exchange_tmp;
此時的資料:
SQL> select count(*) from t_exchange_tmp;
COUNT(*)
----------
9999
SQL> select count(*) from t_exchange partition(p1);
COUNT(*)
----------
0
將資料載入到歷史表:
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;
SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp
*
ERROR at line 1:
ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION
建立唯一索引:
create unique index t_exchange_his_idx_03 on t_exchange_his(sno,oitime);
再次載入資料,還是同樣地錯。
觀察一下歷史表和中間表的定義,unique約束只能是sno的主鍵約束了,這個說法不對,只是說明可能是主鍵約束的緣故,中間表增加主鍵約束:
alter table t_exchange_tmp add primary key (sno);
再次載入資料:
SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;
Table altered.
成功!
關閉10046事件:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, false);
資料已經成功從中間表到了歷史表:
SQL> select count(*) from t_exchange_tmp;
COUNT(*)
----------
0
SQL> select count(*) from t_exchange_his partition(p1);
COUNT(*)
----------
9999
檢查索引:
SQL> !ora unusable
\n=============Fri Jun 22 19:55:13 CST 2018===================\n
Session altered.
UNUSABLE_INDEXES
-------------------------------------------------------------------------
ALTER INDEX MING.SYS_C0012382 REBUILD ONLINE; --中間表主鍵索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_03 REBUILD ONLINE; --歷史表的唯一索引
ALTER INDEX MING.SYS_C0012380 REBUILD ONLINE; --歷史表主鍵索引
ALTER INDEX MING.T_EXCHANGE_IDX_03 REBUILD ONLINE; --源表的唯一索引
ALTER INDEX MING.SYS_C0012378 REBUILD ONLINE; --源表主鍵索引
ALTER INDEX MING.T_EXCHANGE__HIS_IDX_02 REBUILD PARTITION P1 ONLINE; --歷史表的本地非字首分割槽索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P03 ONLINE; --歷史表的全域性分割槽索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P02 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P01 ONLINE; --源表的全域性分割槽索引
ALTER INDEX MING.T_EXCHANGE_IDX_02 REBUILD PARTITION P1 ONLINE; --源表的本地非字首分割槽索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P01 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P03 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P02 ONLINE;
13 rows selected.
總結:
1.從10046中可以看到exchange的過程會以獨佔模式(exclusive)鎖住兩張表,不過執行速度很快,也不用擔心阻塞業務dml語句。
2.10046中還考慮ogg和dataguard的影響,都是一些對系統表的修改。
3.裝載到歷史表的時候,需要兩端的表上的約束都要一致。其實也很好理解,這個過程修改的資料字典中的物理位置指向,那麼必然要滿足約束的要求,否則載入過去的資料違反了表上的主鍵約束或者唯一約束,那就沒有意義了。
4.所有的索引都失效了,可見這種方法的弊端是雖然資料載入快速,但是索引需要重建,這個就比較致命了。如果表很大的話,分割槽的可用性會變差,日常交易效能衰退,恢復需要的時間長。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547066/viewspace-2285963/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle分割槽表和分割槽表exchangeOracle
- oracle分割槽表和非分割槽表exchangeOracle
- linux交換分割槽Linux
- unbuntu新增交換分割槽
- linux交換分割槽調整Linux
- Ubuntu 啟用交換分割槽Ubuntu
- 【INDEX】Oracle分割槽索引技術詳解IndexOracle索引
- oracle交換分割槽所引起的索引失效問題探究測試Oracle索引
- 交換分割槽時報錯:ORA-14098
- 雲端計算:交換分割槽管理 Swap
- Linux下swap(交換分割槽)的增刪改Linux
- Seven 儲存結構與磁碟劃分 主分割槽交換分割槽的作用!
- [20190503]12C R2 分割槽交換.txt
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- 2萬字詳解Oracle分割槽表技術,太頂了Oracle
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- 非分割槽錶轉換成分割槽表
- mpls atm交換技術 ip技術——VecloudCloud
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Linux交換分割槽相關都有哪些命令?Linux運維基礎Linux運維
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- ORACLE分割槽表梳理系列Oracle
- E6 資料庫分割槽技術資料庫
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle
- 華為網路技術-三層交換技術
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- 從10046看Oracle分割槽裁剪Oracle
- 非分割槽錶轉換成分割槽表以及注意事項
- 如何檢視 Linux 下 CPU、記憶體和交換分割槽的佔用率?Linux記憶體
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Mysql資料分片技術(一)——初識表分割槽MySql
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維