巨大なデータを含むテーブルがあり、クライアント側で運用されています。これは、生産を停止できることを意味し、テーブルをパーティション分割する必要があります。私はそれを行うためのスクリプトを持っています。しかし、オンラインで行う方法がわかりません。私がこれを達成できる方法はありますか。提案してください..
質問する
149 次
1 に答える
3
以下の手順に従ってください。
メイン テーブルと同じ構造で一時テーブルを作成し (たとえば、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
必要な列を含むこのテーブルへのインデックスを作成します。
create index IX01_TABLE on TABLE_P (COL1) local;
以下のスクリプトを実行して再定義します。実際のスキーマ名に置き換えます。
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 に答える