Oracleオンライン再定義

4283 ワード

高合併のシーンでは、テーブル構造を変更する場合があります。外部サービスに影響を与えないために、オンラインで定義された機能を再利用できます。  2、rowidによる再定義の具体例は以下の通りである。
--1、テーブル構造の構築
SQL> l
  1  CREATE TABLE test(
  2	 id int primary key,
  3	 msg1 varchar2(20),
  4	 msg2 varchar2(30)
  5  )
  6  PARTITION BY RANGE(id)
  7  (
  8    PARTITION part01 VALUES LESS THAN (10000),
  9    PARTITION part02 VALUES LESS THAN (20000),
 10    PARTITION part03 VALUES LESS THAN (30000),
 11    PARTITION part04 VALUES LESS THAN (MAXVALUE)
 12* )
SQL> /


Table created.
--2、シーケンスの作成
SQL> CREATE SEQUENCE seqtest INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE 1000; 
Sequence created.
--3、データを塗りつぶす
SQL> ed
Wrote file afiedt.buf
  1  BEGIN
  2    FOR i IN 1..40000 LOOP
  3	 INSERT INTO TEST VALUES(seqtest.nextval,seqtest.nextval||'aaa',seqtest.nextval||'bbb');
  4	 IF MOD(i,10000)=0 THEN
  5	   COMMIT;
  6	 END IF;
  7    END LOOP;
  8* END;
  9  /
PL/SQL procedure successfully completed.
--4、再定義テスト
SQL> l
  1  BEGIN
  2    dbms_redefinition.can_redef_table('zybi','test',dbms_redefinition.cons_use_pk);
  3* END;
SQL> /


PL/SQL procedure successfully completed.
--5、試験表を作成し、新しいフィールドmsg 3 varrrhar 2を追加する(40)
SQL> l
  1  CREATE TABLE test2(
  2	 id int primary key,
  3	 msg1 varchar2(20),
  4	 msg2 varchar2(30),
  5	 msg3 varchar2(40)
  6  )
  7  PARTITION BY RANGE(id)
  8  (
  9    PARTITION part01 VALUES LESS THAN (10000),
 10    PARTITION part02 VALUES LESS THAN (20000),
 11    PARTITION part03 VALUES LESS THAN (30000),
 12    PARTITION part04 VALUES LESS THAN (MAXVALUE)
 13* )
SQL> /


Table created.
--6、テーブルマップを開始します。
SQL> l
  1  BEGIN
  2    dbms_redefinition.start_redef_table(
  3		'ZYBI',
  4		'TEST',
  5		'TEST2',
  6		'ID ID,MSG1 MSG1,MSG2 MSG2,MSG1||MSG2 MSG3',
  7		dbms_redefinition.cons_use_pk);
  8* END;
SQL> /


PL/SQL procedure successfully completed.
--7、一時テーブルのための制約インデックスなどを作成します。
SQL> ed
Wrote file afiedt.buf


  1  DECLARE
  2	 errcnt NUMBER;
  3  BEGIN
  4	 errcnt := 0;
  5	 dbms_redefinition.copy_table_dependents(
  6		uname => 'ZYBI',
  7		orig_table => 'TEST',
  8		int_table => 'TEST2',
  9		copy_indexes => dbms_redefinition.cons_orig_params,
 10		num_errors => errcnt,
 11		ignore_errors => TRUE
 12	      );
 13	 dbms_output.put_line(errcnt);
 14* END;
 15  /


PL/SQL procedure successfully completed.
--8、エラーメッセージを確認します。仮テーブルを作成する時、メインキーを確立しましたので、ここでエラーを報告します。無視します。
SQL> select ddl_txt from DBA_REDEFINITION_ERRORS;


DDL_TXT
--------------------------------------------------------------------------------
CREATE UNIQUE INDEX "ZYBI"."TMP$$_SYS_C00166330" ON "ZYBI"."TEST2" ("ID")
  PCT


ALTER TABLE "ZYBI"."TEST2" ADD CONSTRAINT "TMP$$_SYS_C00166330" PRIMARY KEY ("ID
--9、スタートテーブル同期
SQL> l
  1  BEGIN
  2    dbms_redefinition.sync_interim_table('ZYBI','TEST','TEST2');
  3* END;
SQL> /


PL/SQL procedure successfully completed.
--10、データ挿入テスト同期の場合、下のデータを挿入してから9ステップ実行すれば、同期効果が見られます。
SQL> INSERT INTO TEST VALUES(40001,'x','y');


1 row created.


SQL> commit;


Commit complete.


SQL> SELECT * FROM TEST2 WHERE ID=40001;


no rows selected


SQL> exec dbms_redefinition.sync_interim_table('ZYBI','TEST','TEST2');


PL/SQL procedure successfully completed.
SQL> SELECT * FROM TEST2 WHERE ID=40001;


	ID MSG1  MSG2  MSG3
---------- ----- ----- -----
     40001 x	 y     xy
--11、完成表同期
SQL> l
  1  BEGIN
  2    dbms_redefinition.finish_redef_table('zybi','test','test2');
  3* END;
SQL> /


PL/SQL procedure successfully completed.
--12、検証テーブルデータ
SQL> SELECT * FROM TEST WHERE ID=40001;


	ID MSG1  MSG2  MSG3
---------- ----- ----- -----
     40001 x	 y     xy