콘텐츠로 이동

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이면 휴지통으로 옮겨진다.