UTL COPYSWAP
UTL_COPYSWAP#
UTL_COPYSWAP 패키지는 테이블 스키마 복사, 데이터 복제, 테이블 교환 인터페이스를 제공한다.
UTL_COPYSWAP 패키지를 구성하는 프로시저와 함수는 아래의 표와 같다. UTL_COPYSWAP을 사용하기 위한 전제 조건은 CHECK_PRECONDITION의 설명을 참고한다.
| 프로시저 및 함수 | 설명 | 
|---|---|
| CHECK_PRECONDITION | 권한, 세션 프로퍼티, 시스템 프로퍼티, 이중화 제약조건을 검사한다. | 
| COPY_TABLE_SCHEMA | 테이블 스키마를 복사한다. 이후에 복사한 테이블에 사용자가 원하는 DDL을 수행한다. | 
| REPLICATE_TABLE | 데이터를 복제한다. | 
| SWAP_TABLE | 테이블을 교환한다. | 
| SWAP_TABLE_PARTITION | 테이블 파티션을 교환한다. | 
| FINISH | COPY_TABLE_SCHEMA, REPLICATE_TABLE에서 생성한 것을 정리한다. | 
CHECK_PRECONDITION#
UTL_COPYSWAP을 사용하기 위한 권한, 세션 프로퍼티, 시스템 프로퍼티, 이중화 제약조건 등의 전제조건을 검사하는 프로시저이다.
검사할 전제 조건들은 아래와 같다.
- 
권한
SYS 사용자이어야 한다. - 
세션 프로퍼티
AUTOCOMMIT 프로퍼티가 FALSE이어야 한다.
REPLICATION 프로퍼티가 TRUE이어야 한다. - 
시스템 프로퍼티
REPLICATION_PORT_NO 프로퍼티가 0이 아니어야 한다.
REPLICATION_DDL_ENABLE 프로퍼티가 1이어야 한다.
REPLICATION_ALLOW_DUPLICATE_HOSTS 프로퍼티가 1이어야 한다. - 
이중화 제약조건
Compressed Column을 지원하지 않는다.
관련 Eager Sender/Receiver Thread가 없어야 한다. 
구문#
UTL_COPYSWAP.CHECK_PRECONDITION(
  source_user_name IN VARCHAR(128),
  source_table_name IN VARCHAR(128) );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| source_user_name | IN | VARCHAR2(128) | 원본 테이블의 소유자 이름 | 
| source_table_name | IN | VARCHAR2(128) | 원본 테이블 이름 | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> CREATE TABLE T1 ( I1 INTEGER PRIMARY KEY, V1 VARCHAR(1024) );
Create success.
iSQL> EXEC UTL_COPYSWAP.CHECK_PRECONDITION( 'SYS', 'T1' );
[SESSION PROPERTY] AUTOCOMMIT property value must be FALSE.
[SYSTEM PROPERTY] REPLICATION_PORT_NO property value must be larger than 0.
[SYSTEM PROPERTY] REPLICATION_DDL_ENABLE property value must be 1.
[SYSTEM PROPERTY] REPLICATION_ALLOW_DUPLICATE_HOSTS property value must be 1.
Execute success.
COPY_TABLE_SCHEMA#
Table Schema를 복사하는 프로시저이다. 이후에 복사한 Table에 사용자가 원하는 DDL을 수행한다. 복사 대상은 아래와 같다.
- 
Table 기본 정보
 - 
Column
 - 
Index
 - 
Constraint
 - 
Trigger
 - 
Comment
 - 
Partition
 
구문#
UTL_COPYSWAP.COPY_TABLE_SCHEMA(
  target_user_name IN VARCHAR(128),
  target_table_name IN VARCHAR(128),
  source_user_name IN VARCHAR(128),
  source_table_name IN VARCHAR(128) );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| target_user_name | IN | VARCHAR2(128) | 사본 테이블의 소유자 이름 | 
| target_table_name | IN | VARCHAR2(128) | 사본 테이블 이름 | 
| source_user_name | IN | VARCHAR2(128) | 원본 테이블의 소유자 이름 | 
| source_table_name | IN | VARCHAR2(128) | 원본 테이블 이름 | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> CREATE TABLE T1 ( I1 INTEGER PRIMARY KEY, V1 VARCHAR(1024) );
Create success.
iSQL> INSERT INTO T1 VALUES ( 1, 'ABC' );
1 row inserted.
iSQL> ALTER SESSION SET AUTOCOMMIT = FALSE;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_ALLOW_DUPLICATE_HOSTS = 1;
Alter success.
iSQL> EXEC UTL_COPYSWAP.COPY_TABLE_SCHEMA( 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
0    
1 row selected.
iSQL> ALTER TABLE T1_COPY ALTER TABLESPACE SYS_TBS_DISK_DATA;
Alter success.
REPLICATE_TABLE#
Replication을 사용하여 데이터를 복제하는 프로시저이다.
구문#
UTL_COPYSWAP.REPLICATE_TABLE(
  replication_name IN VARCHAR(35),
  target_user_name IN VARCHAR(128),
  target_table_name IN VARCHAR(128),
  source_user_name IN VARCHAR(128),
  source_table_name IN VARCHAR(128),
  sync_parallel_factor IN INTEGER DEFAULT 8,
  receiver_applier_count IN INTEGER DEFAULT 8 );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| replication_name | IN | VARCHAR2(35) | 이중화 이름 | 
| target_user_name | IN | VARCHAR2(128) | 사본 테이블의 소유자 이름 | 
| target_table_name | IN | VARCHAR2(128) | 사본 테이블 이름 | 
| source_user_name | IN | VARCHAR2(128) | 원본 테이블의 소유자 이름 | 
| source_table_name | IN | VARCHAR2(128) | 원본 테이블 이름 | 
| sync_parallel_factor | IN | INTEGER | 초기 동기화에 적용할 병렬 인자 | 
| receiver_applier_count | IN | INTEGER | 증분 동기화에 적용할 병렬 인자 | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> CREATE TABLE T1 ( I1 INTEGER PRIMARY KEY, V1 VARCHAR(1024) );
Create success.
iSQL> INSERT INTO T1 VALUES ( 1, 'ABC' );
1 row inserted.
iSQL> ALTER SESSION SET AUTOCOMMIT = FALSE;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_ALLOW_DUPLICATE_HOSTS = 1;
Alter success.
iSQL> EXEC UTL_COPYSWAP.COPY_TABLE_SCHEMA( 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
0    
1 row selected.
iSQL> ALTER TABLE T1_COPY ALTER TABLESPACE SYS_TBS_DISK_DATA;
Alter success.
iSQL> EXEC UTL_COPYSWAP.REPLICATE_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
1    
1 row selected.
SWAP_TABLE#
Replication을 이용한 동기화를 완료하고 테이블을 교환하는 프로시저이다. 교환 대상은 아래와 같다.
- 
Table 기본 정보
 - 
Column
 - 
Index
 - 
Constraint
 - 
Trigger
 - 
Comment
 - 
Partition
 
구문#
UTL_COPYSWAP.SWAP_TABLE(  
  replication_name IN VARCHAR(35),  
  target_user_name IN VARCHAR(128),  
  target_table_name IN VARCHAR(128),  
  source_user_name IN VARCHAR(128),  
  source_table_name IN VARCHAR(128),  
  force_to_rename_encrypt_column IN BOOLEAN DEFAULT FALSE,  
  ignore_foreign_key_child IN BOOLEAN DEFAULT FALSE );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| replication_name | IN | VARCHAR2(35) | 이중화 이름 | 
| target_user_name | IN | VARCHAR2(128) | 사본 테이블의 소유자 이름 | 
| target_table_name | IN | VARCHAR2(128) | 사본 테이블 이름 | 
| source_user_name | IN | VARCHAR2(128) | 원본 테이블의 소유자 이름 | 
| source_table_name | IN | VARCHAR2(128) | 원본 테이블 이름 | 
| force_to_rename_encrypt_column | IN | BOOLEAN | 암호화 컬럼이 있고 암호화 모듈이 Rename을 지원하면, TRUE로 설정한다. | 
| ignore_foreign_key_child | IN | BOOLEAN | 원본 테이블을 참조하는 테이블이 있으면, TRUE로 설정한다. | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> CREATE TABLE T1 ( I1 INTEGER PRIMARY KEY, V1 VARCHAR(1024) );
Create success.
iSQL> INSERT INTO T1 VALUES ( 1, 'ABC' );
1 row inserted.
iSQL> ALTER SESSION SET AUTOCOMMIT = FALSE;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_ALLOW_DUPLICATE_HOSTS = 1;
Alter success.
iSQL> EXEC UTL_COPYSWAP.COPY_TABLE_SCHEMA( 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
0    
1 row selected.
iSQL> ALTER TABLE T1_COPY ALTER TABLESPACE SYS_TBS_DISK_DATA;
Alter success.
iSQL> EXEC UTL_COPYSWAP.REPLICATE_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
1    
1 row selected.
iSQL> INSERT INTO T1 VALUES ( 2, 'XYZ' );
1 row inserted.
iSQL> COMMIT;
Commit success.
iSQL> EXEC UTL_COPYSWAP.SWAP_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
2    
1 row selected.
SWAP_TABLE_PARTITION#
Replication을 이용한 동기화를 완료하고 Table partition을 교환하는 프로시저이다. 교환 대상은 아래와 같다.
- Partition
 
구문#
PROCEDURE swap_table_partition(  
  replication_name IN VARCHAR(35),  
  target_user_name IN VARCHAR(128),  
  target_table_name IN VARCHAR(128),  
  source_user_name IN VARCHAR(128),  
  source_table_name IN VARCHAR(128),  
  table_partition_name IN VARCHAR(128) );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| replication_name | IN | VARCHAR2(35) | 이중화 이름 | 
| target_user_name | IN | VARCHAR2(128) | 사본 테이블의 소유자 이름 | 
| target_table_name | IN | VARCHAR2(128) | 사본 테이블 이름 | 
| source_user_name | IN | VARCHAR2(128) | 원본 테이블의 소유자 이름 | 
| source_table_name | IN | VARCHAR2(128) | 원본 테이블 이름 | 
| table_partition_name | IN | VARCHAR2(128) | 교환대상인 테이블 파티션 | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> create table t1 (i1 int, i2 int)
partition by range (i1)
(
    partition p1 values less than (10),
    partition p2 values less than (20),
    partition p3 values default
)tablespace sys_tbs_disk_data;
Create success.
iSQL> alter table t1 add constraint pk_t1 primary key(i1) using index local
(
    partition  pk_p1 on p1 tablespace SYS_TBS_DISK_DATA,
    partition  pk_p2 on p2 tablespace SYS_TBS_DISK_DATA,
    partition  pk_p3 on p3 tablespace SYS_TBS_DISK_DATA
);
Alter success.
iSQL> INSERT INTO T1 VALUES ( 15, 15 );
1 row inserted.
iSQL> ALTER SESSION SET AUTOCOMMIT = FALSE;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_ALLOW_DUPLICATE_HOSTS = 1;
Alter success.
iSQL> EXEC UTL_COPYSWAP.COPY_TABLE_SCHEMA( 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
0    
1 row selected.
iSQL> ALTER TABLE T1_COPY ALTER TABLESPACE SYS_TBS_MEM_DATA;
Alter success.
iSQL> EXEC UTL_COPYSWAP.REPLICATE_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
1    
1 row selected.
iSQL> INSERT INTO T1 VALUES ( 16, 16 );
1 row inserted.
iSQL> commit ;
iSQL> EXEC UTL_COPYSWAP.SWAP_TABLE_PARTITION( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1','P2' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
2    
1 row selected.
FINISH#
COPY_TABLE_SCHEMA, REPLICATE_TABLE에서 생성한 것을 정리하는 프로시저이다.
구문#
UTL_COPYSWAP.FINISH(  
  replication_name IN VARCHAR(35),  
  target_user_name IN VARCHAR(128),  
  target_table_name IN VARCHAR(128),  
  print_all_errors IN BOOLEAN DEFAULT FALSE );
파라미터#
| 이름 | 입출력 | 데이터 타입 | 설명 | 
|---|---|---|---|
| replication_name | IN | VARCHAR2(35) | 이중화 이름 | 
| target_user_name | IN | VARCHAR2(128) | 사본 테이블의 소유자 이름 | 
| target_table_name | IN | VARCHAR2(128) | 사본 테이블 이름 | 
| print_all_errors | IN | BOOLEAN | Replication 관련 에러를 출력하려면, TRUE로 설정한다. | 
결과값#
저장 프로시저이므로 반환되는 결과값은 없다.
예외#
파라미터를 잘못 입력하면, 예외가 발생한다.
예제#
iSQL> CREATE TABLE T1 ( I1 INTEGER PRIMARY KEY, V1 VARCHAR(1024) );
Create success.
iSQL> INSERT INTO T1 VALUES ( 1, 'ABC' );
1 row inserted.
iSQL> ALTER SESSION SET AUTOCOMMIT = FALSE;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1;
Alter success.
iSQL> ALTER SYSTEM SET REPLICATION_ALLOW_DUPLICATE_HOSTS = 1;
Alter success.
iSQL> EXEC UTL_COPYSWAP.COPY_TABLE_SCHEMA( 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
0    
1 row selected.
iSQL> ALTER TABLE T1_COPY ALTER TABLESPACE SYS_TBS_DISK_DATA;
Alter success.
iSQL> EXEC UTL_COPYSWAP.REPLICATE_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
1    
1 row selected.
iSQL> INSERT INTO T1 VALUES ( 2, 'XYZ' );
1 row inserted.
iSQL> COMMIT;
Commit success.
iSQL> EXEC UTL_COPYSWAP.SWAP_TABLE( 'REP_LOCAL', 'SYS', 'T1_COPY', 'SYS', 'T1' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
COUNT
-----------------------
2    
1 row selected.
iSQL> EXEC UTL_COPYSWAP.FINISH( 'REP_LOCAL', 'SYS', 'T1_COPY' );
Execute success.
iSQL> SELECT COUNT(*) FROM T1_COPY;
[ERR-31031 : Table or view was not found :
0001 : SELECT COUNT(*) FROM T1_COPY
^      ^
주의사항#
- 
REPLICATE_TABLE 프로시저를 사용하여 데이터를 복제하려면, 원본 테이블의 크기에 비례하여 Tablespace에 여유 공간이 필요하다. REPLICATE_TABLE 프로시저가 생성한 로그 파일은 REPLICATE_TABLE 프로시저가 종료될 때까지 Checkpoint로 제거되지 않는다.
 - 
UTL_COPYSWAP 패키지를 사용하는 동안 원본 테이블에 적용하는 DML을 Replication이 분석할 수 있어야 한다. 이중화에서 분석할 수 없는 DML은 손실될 수 있다.
- 원본 테이블에 DML을 수행할 때, REPLICATION 세션 프로퍼티가 TRUE이어야 한다.
 - 원본 테이블이 Replication 대상 테이블이면, Replication을 통해 원본 테이블에 데이터를 반영하지 않도록 원본 테이블에 대응하는 원격 서버의 Replication을 정지해야 한다.
 
 - 
FINISH 프로시저를 사용하여 사본 테이블을 제거할 때, RECYCLEBIN_ENABLE 프로퍼티의 값이 1이면 휴지통으로 옮겨진다.