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