Oracle General Table->Partitioning Table Transformation(9億単位)

3536 ワード

背景:
環境:Linux 5.5 + Oracle 10.2.0.4
ある一般表Tは、前期の設計が不適切で区分がなかったため、現在数年来のデータ量は9億+に達している. スペース占有量は約350 Gで、オンライン再定義はパーティションテーブルが現実的ではないため、申請時間ウィンドウを採用してこのテーブルの応用を停止し、パーティションテーブルに改造した.
Tテーブルのデータ量が適切であれば、オンライン再定義操作を選択できる場合、参考:http://www.cnblogs.com/jyzhao/p/3876634.html
  • 1.パーティションテーブル
  • を作成する
  • .新しいパーティションテーブルをnologgingに設定し、元のテーブルTをT_に名前を変更OLD
  • 3.パラレルダイレクトパス挿入
  • 4.パーティションテーブルのインデックス
  • を作成する
  • 5.renameテーブル、回復Tテーブルの関連応用
  • 1.パーティション表の作成
    --Create tableパーティションテーブルT_を作成するPART、パーティション化は14年6月から.
    create table T_PART
    (
    ……
    )
    partition by range(time_stamp)(
      partition P20140601 values less than (TO_DATE(' 2014-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace DBS_D_JINGYU
    );
    

    パーティション追加ツールを使用して15年6月に追加します.
    2.新しいパーティションテーブルをnologgingに設定し、元のテーブルTをT_に名前を変更するOLD
    alter table t_part nologging;
    
    rename T to T_old;
    

    3.パラレルダイレクトパス挿入
    alter session enable parallel dml; 
    
    insert /*+ append parallel(p,10) */ into t_part p select /*+ parallel(n,10) */ * from T_old n;
    
    commit;
    

    Insertの実行計画を確認し、並列度が使用できることを確認します.
    explain plan for insert /*+ append parallel(p,10) */ into t_part p select /*+ parallel(n,10) */ * from T_old n;
    

    挿入スクリプトの実行
    SQL> @/home/oracle/insert
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    
       908792694 。
    
        :  02: 09: 37.94
    
        。
    
        :  00: 08: 13.76
    

    4.パーティション表の索引付け
    4.1履歴テーブルのインデックス名の変更
    alter index PK_T rename to PK_T_bak;
    alter table T_old rename constraint PK_T to PK_T_bak;
    alter index IDX_T_2 rename to IDX_T_2_bak;
    alter index IDX_T_3 rename to IDX_T_3_bak;
    

    4.2新規パーティションテーブルT_へPARTプライマリ・キーおよびインデックスの作成
    create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
         。
        :  04: 39: 53.10
    alter table T_PART add constraint PK_T primary key (OID, TIME_STAMP, SERIAL_NO, CITY_ID);
        。
        :  00: 00: 00.43
    
    create index IDX_T_2 on T_PART (TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
         。
        :  02: 27: 49.92
    create index IDX_T_3 on T_PART (TIME_STAMP, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
         。
        :  02: 19: 06.74
    

    4.3索引と表をlogging、noparallelに変更する
    alter index PK_T logging noparallel;
    alter index IDX_T_2 logging noparallel;
    alter index IDX_T_3 logging noparallel;
    alter table T_PART logging;
    

    4.4問題
    一意性インデックスの作成エラー:
    SQL> create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace dbs_i_jingyu nologging parallel 32;
    
    create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace dbs_i_jingyu nologging parallel 32
    
    ORA-12801:         P000        
    
    ORA-01652:      128 (     TMP  )    temp  
    

    解決策:一時表領域のサイズを増やす
    alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp02.dbf' size 30G;
    
    alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp03.dbf' size 30G;
    
    alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp04.dbf' size 30G;
    

    5.rename表、T表の関連応用を回復する
    rename T_PARTはTであり,Tテーブルアプリケーションを復元する.
    rename T_PART to T;
    

    実際の状況で徹底的にドロップするかどうかを決めるOLD、空間を解放します.
    drop table T_OLD purge;