天天看點

Oracle ~ 線上重定義将普通表改為分區表1.線上重定義2.線上重定義的方法3.實列

Oracle ~ 線上重定義将普通表改為分區表

  • 1.線上重定義
  • 2.線上重定義的方法
  • 3.實列
    • 3.1:建表(用主鍵的方式使用線上重定義)
    • 3.2:檢視此表是否可以重定義(無報錯即可)
    • 3.3:建立線上重定義需要的中間表,表結構就是要将原測試表重定義成什麼樣子
    • 3.4:啟動線上重定義
    • 3.5:啟動線上重定義後,中間表就可以查到原表的資料
    • 3.6:由于在生成系統中,線上重定義的過程中原資料表可能會發生資料改變,向原表中插入資料模拟資料改變
    • 3.7:此時原表被修改,中間表并沒有更新
    • 3.8:使用dbms_redefinition包的sync_interim_table子產品重新整理資料後,中間表也可以看到資料更改
    • 3.9:結束線上重定義
    • 3.10:驗證資料
    • 3.11:檢視各分區資料是否正确
    • 3.12:線上重定義後,中間表已經沒有意義,删掉中間表

1.線上重定義

(1)修改表的存儲參數;

(2)可以将表轉移到其他表空間;

(3)在表上增加、修改或删除一列或是多列;

(4)增加并行查詢選項;

(5)增加分區支援;

(6)修改分區結構;

(7)重建表以減少碎片;

(8)将堆表改為索引組織表或相反的操作;

2.線上重定義的方法

1.基于主鍵

2.基于ROWID。ROWID的方式不能用于索引組織表,而且重定義後會存在隐藏列M_ROW$$。

預設采用主鍵的方式。

線上重定義的一些限制

1.要求原始表和中間表在同一個方案下;

2.要求有2倍甚至是多于2倍的表空間空間;

3.如果使用主鍵重定義的方式,原始表上要有主鍵;

3.實列

3.1:建表(用主鍵的方式使用線上重定義)

create table myPartition(id number,code varchar2(5),identifier varchar2(20));
insert into myPartition values(1,'01','01-01-0001-000001');
insert into myPartition values(2,'02','02-01-0001-000001');
insert into myPartition values(3,'03','03-01-0001-000001');
insert into myPartition values(4,'04','04-01-0001-000001');
commit;
alter table myPartition add constraint pk_test_id primary key (id);
           

3.2:檢視此表是否可以重定義(無報錯即可)

--管理者權限執行begin
--在指令行執行
SQL> exec dbms_redefinition.can_redef_table('scott', 'myPartition');
PL/SQL procedure successfully completed
--管理者權限執行end
           

3.3:建立線上重定義需要的中間表,表結構就是要将原測試表重定義成什麼樣子

create table t_temp(id number,code varchar2(5),
identifier varchar2(20)) partition by range(id)(  
          partition TAB_PARTOTION_01 values less than (2),  
          partition TAB_PARTOTION_02 values less than (3),  
          partition TAB_PARTOTION_03 values less than (4),  
          partition TAB_PARTOTION_04 values less than (5),  
          partition TAB_PARTOTION_OTHER values less THAN (MAXVALUE)  
);

alter table t_temp add constraint pk_temp_id2 primary key (id);
           

3.4:啟動線上重定義

--管理者權限執行sql指令行執行
exec dbms_redefinition.start_redef_table('scott', 'myPartition', 't_temp');
--管理者權限執行sql指令行執行
           

這裡dbms_redefinition包的start_redef_table子產品有3個參數,分别是SCHEMA名字、原表的名字、中間表的名字

3.5:啟動線上重定義後,中間表就可以查到原表的資料

3.6:由于在生成系統中,線上重定義的過程中原資料表可能會發生資料改變,向原表中插入資料模拟資料改變

insert into myPartition values(5,'05','05-01-0001-000001');
commit;
           

3.7:此時原表被修改,中間表并沒有更新

select * from myPartition;
select * from t_temp;
           

3.8:使用dbms_redefinition包的sync_interim_table子產品重新整理資料後,中間表也可以看到資料更改

--管理者權限執行sql指令行執行,同步兩邊資料
exec dbms_redefinition.sync_interim_table('scott', 'myPartition', 't_temp');
--管理者權限執行sql指令行執行
           
查詢同步後的兩邊資料是否一緻:
           
select * from myPartition;
select * from t_temp;
           

3.9:結束線上重定義

--管理者權限執行sql指令行執行,結束重定義
exec dbms_redefinition.finish_redef_table('scott', 'myPartition', 't_temp');
--管理者權限執行sql指令行執行
           

3.10:驗證資料

select * from myPartition;
select * from t_temp;
           

3.11:檢視各分區資料是否正确

select table_name, partition_name from user_tab_partitions where table_name = 'myPartition';

select * from myPartition partition(TAB_PARTOTION_01);
           

3.12:線上重定義後,中間表已經沒有意義,删掉中間表