使用ORACLE在線重定義將普通表改為分區表


因客戶現場有一張表數據流量巨大,達到50G,查詢起來較慢,遂決定進行分區表改造,測試環境進行測試,此次方法才用在線重定義方法

 

1.創建測試表

create table elan(id int primary key,name varchar2(32)); --表中需要定義主鍵,如果沒有主鍵可以在后期添加

2.批量向表中插入數據

begin
     for i in 1..100000
     loop
         insert into elan.elan values(i,'x');
     end loop;
     commit;
end;
 /

查看表中的數據是否插入

SQL> select count(1) from elan;

  COUNT(1)
----------
    100000

3.創建中間表

--此次分區才用hash分區的方式

CREATE TABLE elan_new (ID NUMBER PRIMARY KEY, name varchar2(32)) PARTITION BY hash (id) 
( PARTITION PART01 TABLESPACE elan,   
  PARTITION PART02 TABLESPACE elan,   
  PARTITION PART03 TABLESPACE elan);

4.檢測表是否可以執行在線重定義

QL> BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('ELAN','ELAN',DBMS_REDEFINITION.CONS_USE_PK);
END;
/  2    3    4  

PL/SQL procedure successfully completed.

如果沒有定義主鍵會提示以下錯誤信息
begin dbms_redefinition.can_redef_table(user,'pft_party_profit_detail'); end;
ORA-12089: cannot online redefine table "elan"."elan" with no primary key
ORA-06512: at "SYS.DBMS_REDEFINITION", line 8
ORA-06512: at "SYS.DBMS_REDEFINITION", line 247
ORA-06512: at line 1

添加方法:

alter table elan add constraint pk_elan primary key(id);

5.開始執行數據遷移

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('ELAN', 'ELAN', 'ELAN_NEW');

PL/SQL procedure successfully completed.

6.如果表的數據很多,第5步的時候可能會很長,這期間系統可能會繼續對表EMP進行寫入或者更新數據,那么可以執行以下的語句,這樣在執行最后一步的時候可以避免長時間的鎖定(該過程可選可不選)

SQL> EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('ELAN', 'ELAN', 'ELAN_NEW');

PL/SQL procedure successfully completed.

7.進行權限對象的遷移

SQL> DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('ELAN', 'ELAN','ELAN_NEW',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/  2    3    4    5    6    7  

PL/SQL procedure successfully completed.

8.結束整個重定義

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('ELAN', 'ELAN', 'ELAN_NEW');

PL/SQL procedure successfully completed.

9.查詢兩端數據是否一致

SQL> select count(1) from elan.elan;

  COUNT(1)
----------
    100000

SQL> select count(1) from elan.elan_new;

  COUNT(1)
----------
    100000

10.刪除中間表

SQL> select table_name, partition_name from user_tab_partitions where table_name = 'ELAN';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
ELAN			       PART01
ELAN			       PART02
ELAN			       PART03

SQL> 
SQL> 
SQL> select table_name, partition_name from user_tab_partitions where table_name = 'ELAN_NEW';

no rows selected


SQL> drop table elan_new purge;

Table dropped.

SQL> 
SQL> 
SQL> select table_name, partition_name from user_tab_partitions where table_name = 'ELAN';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
ELAN			       PART01
ELAN			       PART02
ELAN			       PART03

SQL> select table_name, partition_name from user_tab_partitions where table_name = 'ELAN_NEW';

no rows selected

SQL> select count(1) from elan_new;
select count(1) from elan_new
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

 至此,表分區改造完成

 

 


免責聲明!

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



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