1

巨大なデータを含むテーブルがあり、クライアント側で運用されています。これは、生産を停止できることを意味し、テーブルをパーティション分割する必要があります。私はそれを行うためのスクリプトを持っています。しかし、オンラインで行う方法がわかりません。私がこれを達成できる方法はありますか。提案してください..

4

1 に答える 1

3

以下の手順に従ってください。

  1. メイン テーブルと同じ構造で一時テーブルを作成し (たとえば、TABLE の場合は TABLE_P)、必要な列でこの一時テーブルをパーティション分割します。主テーブルの主キーやその他のインデックスをこの一時テーブルに追加しないでください。

    create table TABLE_P
        (
          COL1        VARCHAR2(35 CHAR) not null,
          COL2        VARCHAR2(35 CHAR) not null,
        )
        --add partition (Example taken here is Range partitioning)  from here
         PARTITION BY RANGE (COL1) (
         PARTITION p0 VALUES LESS THAN (5),
         PARTITION p1 VALUES LESS THAN (10),
         PARTITION p2 VALUES LESS THAN (15),
         PARTITION p3 VALUES LESS THAN (MAXVALUE)
        --add partition till here
    
  2. 必要な列を含むこのテーブルへのインデックスを作成します。

    create index IX01_TABLE on TABLE_P (COL1) local;         
    
  3. 以下のスクリプトを実行して再定義します。実際のスキーマ名に置き換えます。

    begin
    dbms_redefinition.can_redef_table( 'SCHEMA', 'TABLE' );
    end;
    /
    
    begin
    dbms_redefinition.start_redef_table('SCHEMA', 'TABLE','TABLE_P' );
    end;
    /
    
    declare
      error_count pls_integer := 0;
    BEGIN
      dbms_redefinition.copy_table_dependents(uname      => 'SCHEMA',
                                              orig_table => 'TABLE',
                                              int_table  => 'TABLE_P',
                                              num_errors => error_count);
      dbms_output.put_line('errors := ' || to_char(error_count));
    END;
    /
    
    begin
    dbms_redefinition.finish_redef_table('SCHEMA', 'TABLE','TABLE_P');
    end;
    /
    

これにより、依存オブジェクトがスキーマで無効になるため、これらの無効をクリアするためのダウンタイムに備えてください。

于 2013-01-08T06:38:15.290 に答える