5. DDL 문 복제#
개요#
DDL 문 복제는 지역 서버에서 이중화 대상에 수행된 DDL 문을 원격 서버로도 동일하게 복제하는 기능이다.
DDL 문 복제를 수행하면 트랜잭션은 동기식으로 동작하여, 주 트랜잭션 또는 복제 트랜잭션 중 하나에서 DDL 문이 실패할 경우 해당 DDL 문은 실패한다. 또한, 지역 서버와 원격 서버의 이중화 대상 테이블이 잠금 상태가 되어 트랜잭션 접근이 제한된다.
DDL 문 복제 프로퍼티#
DDL 문 복제는 관련 프로퍼티를 활성화하여 사용할 수 있다.
프로퍼티 | 설명 | 기본값 |
---|---|---|
REPLICATION_DDL_SYNC | DDL 문 복제 기능을 활성화 한다. | 0 |
수행 조건#
DDL 문 복제 기능을 사용하려면 다음 조건을 만족해야 한다.
- 지역 서버와 원격 서버에서 이중화가 모두 시작된 상태여야 한다.
- 지역 서버와 원격 서버의 이중화 프로토콜 버전이 같아야 한다.
- 지역 서버와 원격 서버에서 DDL 문을 수행할 이중화 대상의 이름과 소유자가 같아야 한다.
제약 사항#
다음과 같은 이중화 객체 또는 대상에는 DDL 문 복제를 수행할 수 없다.
- EAGER 모드 이중화 객체
- 글로벌 논파티션드 인덱스가 있는 파티션드 테이블
- PROPAGATION 롤이 지정된 이중화 객체
- 복구 옵션을 설정한 이중화 객체
다음의 구문은 DDL 문 복제를 수행할 수 없다.
- 인덱스 파티션 재구축
- 권한 부여/회수
- 트리거 생성/삭제
DDL 문 복제 수행 방법#
이 절에서는 DDL 문 복제를 수행하는 방법에 대하여 설명한다. 보다 자세한 절차는 DDL 문 복제 예제를 참고한다.
아래 수행 방법에서는 DDL 문을 수행할 서버를 지역 서버, DDL 문 복제가 수행되는 서버를 원격 서버로 가정한다. 또한, 이중화는 두 서버에서 모두 시작한 상태라고 가정한다.
절차 1. 서비스 이전#
-
서비스를 DDL 문을 수행하는 지역 서버로 이전한다.
-
서비스가 정상적으로 이전되었는지 확인한다.
원격 서버에서 아래 조회 구문을 실행하여 결과가 0인지 확인한다.
SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID();
절차 2. 프로퍼티 설정#
지역 서버와 원격 서버에서 DDL 문 수행에 필요한 프로퍼티를 설정한다.
REPLICATION_DDL_SYNC
설정 시 지역 서버에서는 ALTER SESSION
, 원격 서버에서는 ALTER SYSTEM
을 사용해야 한다는 점에 주의한다.
-
지역 서버에서 변경해야 할 프로퍼티
ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; ALTER SESSION SET REPLICATION_DDL_SYNC = 1;
-
원격 서버에서 변경해야 할 프로퍼티
ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; ALTER SYSTEM SET REPLICATION_DDL_SYNC=1; ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1;
절차 3. 세션의 이중화 모드 설정#
지역 서버에서 세션의 이중화 모드1를 DEFAULT
로 설정하여 이중화 객체의 설정을 따르도록 한다.
ALTER SESSION SET REPLICATION = DEFAULT;
절차 4. DDL 문 수행#
-
DDL 문을 수행하기 전, 지역 서버와 원격 서버에서 다음 구문을 실행하여 남아있는 이중화 갭을 모두 반영한다.
ALTER REPLICATION replication_name FLUSH;
-
지역 서버에서 DDL 문을 수행한다.
절차 5. 프로퍼티 설정 원복#
DDL 문 복제에 사용된 프로퍼티들은 DDL 문 복제가 끝나는 즉시 기본값으로 변경해야 한다.
-
지역 서버에서 기본값으로 원복
ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; ALTER SESSION SET REPLICATION_DDL_SYNC = 0;
-
원격 서버에서 기본값으로 원복
ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0;
절차 6. 서비스 분배#
서비스를 원래대로 분배한다.
작업 절차 표#
작업 절차 | 지역 서버 | 원격 서버 | |
---|---|---|---|
절차 1. 서비스 이전 | 서비스 이전 | 지역 서버로 서비스 이전 | |
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | ||
절차 2. 프로퍼티 설정 | DDL 문 수행 활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; |
DDL 문 수행 레벨 설정 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | |
SQL 반영 모드 활성화 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | ||
DDL 문 복제 활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 1; | |
절차 3. 세션의 이중화 모드 설정 | ALTER SESSION SET REPLICATION = DEFAULT; | ||
절차 4. DDL 문 수행 | 이중화 갭 해소(원격서버) | ALTER REPLICATION rep1 FLUSH; | |
이중화 갭 해소(지역서버) | ALTER REPLICATION rep1 FLUSH; | ||
DDL 문 수행 | DDL 문 수행 | ||
이중화 갭 해소(지역서버) | ALTER REPLICATION rep1 FLUSH; | ||
절차 5. 프로퍼티 설정 원복 | DDL 문 수행 비활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; |
DDL 문 수행 레벨 비활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | |
SQL 반영 모드 비활성화 | ALTER SESSION SET REPLICATION_SQL_APPLY_ENABLE = 0; | ||
DDL 문 복제 비활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 0; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; | |
절차 6. 서비스 분배 | 원격 서버로 서비스 분배 |
DDL 문 복제 예제#
이 절에서는 DDL 문 복제 기능을 사용하여 이중화 대상에 DDL 문을 수행하는 세 가지 예제를 소개한다.
모든 예제에서 다음과 같은 용어를 사용한다.
- 지역 서버: DDL 문을 수행하는 서버
- 원격 서버: DDL 문 복제가 수행되는 서버
또한, 모든 예제는 두 서버에서 이중화가 이미 시작된 상태를 전제로 한다.
예제 1 : TRUNCATE 문 복제#
이 예제는 지역 서버에서 t1
테이블에 대해 TRUNCATION
문을 수행하면, 해당 문이 원격 서버로 복제되는 과정을 보여준다.
여기서 t1
테이블은 이중화 객체 rep1
에 포함된 이중화 대상 테이블이라고 가정한다.
작업 절차 | 지역 서버 | 원격 서버 | |
---|---|---|---|
절차 1. 서비스 이전 | 서비스 이전 | 지역 서버로 서비스 이전 | |
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | ||
절차 2. 프로퍼티 설정 | DDL 문 수행 활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; |
DDL 문 복제 활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 1; | |
절차 3. 세션의 이중화 모드 설정 | ALTER SESSION SET REPLICATION = DEFAULT; | ||
절차 4. DDL 문 수행 | 이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | |
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | ||
DDL 문 수행 | TRUNCATE TABLE t1; | ||
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | ||
절차 5. 프로퍼티 설정 원복 | DDL 문 수행 비활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; |
DDL 문 복제 비활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 0; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; | |
절차 6. 서비스 분배 | 원격 서버로 서비스 분배 |
예제 2 : NOT NULL 제약조건 추가 문 복제#
이 예제는 지역 서버에서 t1
테이블의 컬럼 c1
에 NOT NULL
제약조건을 추가하면, 해당 문이 원격 서버로 복제되는 과정을 보여준다.
여기서 t1
테이블은 이중화 객체 rep1
에 포함된 이중화 대상 테이블이라고 가정한다.
작업 절차 | 지역 서버 | 원격 서버 | |
---|---|---|---|
절차 1. 서비스 이전 | 서비스 이전 | 지역 서버로 서비스 이전 | |
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | ||
절차 2. 프로퍼티 설정 | DDL 문 수행 활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; |
DDL 문 수행 레벨 설정 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | |
SQL 반영 모드 활성화 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | ||
DDL 문 복제 활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 1; | |
절차 3. 세션의 이중화 모드 설정 | ALTER SESSION SET REPLICATION = DEFAULT; | ||
절차 4. DDL 문 수행 | 이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | |
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | ||
DDL 문 수행 | ALTER TABLE t1 ALTER COLUMN ( c1 NOT NULL ); | ||
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; | ||
절차 5. 프로퍼티 설정 원복 | DDL 문 수행 비활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; |
DDL 문 수행 레벨 설정 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | |
SQL 반영 모드 비활성화 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0; | ||
DDL 문 복제 비활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 0; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; | |
절차 6. 서비스 분배 | 원격 서버로 서비스 분배 |
예제 3 : 삼중화 환경에서 DDL 문 복제 수행#
다음은 삼중화 환경에서 이중화 대상 테이블에 NOT NULL 제약조건을 가진 칼럼을 추가하는 예제이다.
이 예제에서 쓰인 이중화와 관련된 관련 정보는 다음과 같다.
-
삼중화에 참여하는 각 서버의 명칭:
- 지역 서버: DDL 문을 수행하는 서버
- 원격 서버 1: DDL 동기화가 수행되는 서버
- 원격 서버 2: DDL 동기화가 수행되는 서버
-
이중화 객체 이름:
- rep1: 지역 서버와 원격 서버 1 간의 이중화 객체
- rep2: 지역 서버와 원격 서버 2 간의 이중화 객체
- rep3: 원격 서버 1과 원격 서버 2 간의 이중화 객체
- 이중화 대상 테이블: T1
작업 절차 | 지역 서버 | 원격 서버 1 | 원격 서버 2 | |
---|---|---|---|---|
절차 1. 서비스 이전 | 서비스 이전 | 지역 서버로 서비스 이전 | 지역 서버로 서비스 이전 | |
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | ||
절차 2. 프로퍼티 설정 | DDL 문 수행 활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 1; |
DDL 문 수행 레벨 설정 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 1; | |
SQL 반영 모드 활성화 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | ||
DDL 문 복제 활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | ALTER SESSION SET REPLICATION_DDL_SYNC = 1; | |
절차 3. 세션의 이중화 모드 설정 | ALTER SESSION SET REPLICATION = DEFAULT; | |||
절차 4. DDL 문 수행 | 이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; ALTER REPLICATION rep3 FLUSH; |
ALTER REPLICATION rep2 FLUSH; ALTER REPLICATION rep3 FLUSH; |
|
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; ALTER REPLICATION rep2 FLUSH; |
|||
DDL 문 수행 | ALTER TABLE t1 ALTER COLUMN ( c1 NOT NULL ); | |||
이중화 갭 해소 | ALTER REPLICATION rep1 FLUSH; ALTER REPLICATION rep2 FLUSH; |
|||
절차 5. 프로퍼티 설정 원복 | DDL 문 수행 비활성화 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE = 0; |
DDL 문 수행 레벨 설정 | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | ALTER SYSTEM SET REPLICATION_DDL_ENABLE_LEVEL = 0; | |
SQL 반영 모드 비활성화 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0; | ||
DDL 문 복제 비활성화 | ALTER SESSION SET REPLICATION_DDL_SYNC = 0; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; | ALTER SYSTEM SET REPLICATION_DDL_SYNC = 0; | |
절차 6. 서비스 분배 | 원격 서버 1과 원격 서버 2로 서비스 분배 |
-
세션의 이중화 모드를
DEFAULT
로 설정하면, 이중화 객체에 설정된 모드(LAZY
또는EAGER
)에 따라 이중화가 수행된다. 반면,NONE
으로 설정하면 모든 이중화가 비활성화된다. ↩