Oracleオンライン再定義
4283 ワード
高合併のシーンでは、テーブル構造を変更する場合があります。外部サービスに影響を与えないために、オンラインで定義された機能を再利用できます。 2、rowidによる再定義の具体例は以下の通りである。
--1、テーブル構造の構築
--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