부록 B. 일반적인 DDL 문 수행 절차#
이 절에서는 이중화 대상에 별도의 프로퍼티 설정 없이 DDL 문을 수행하는 방법을 설명한다.
전제 조건#
이 절차는 다음과 같은 조건을 전제로 한다.
- 모든 DDL 문 수행과 관련한 이중화 프로퍼티가 기본값으로 설정되어 있다.
- 이중화가 시작된 상태이다.
주의 사항#
- Active 서버에서 서비스를 중지하는 것이 필수적이다.
- Active 서버에서 서비스를 중지하지 않은 상태에서 DDL 문을 수행하면, DDL 문을 실행과 동시에 Active 서버에서 주 트랜잭션이 발생할 경우 데이터 불일치가 발생할 수 있다.
이 절에서는 이중화 대상 서버에서 서비스의 중지가 가능한 경우와 불가능한 경우에 따라 DDL 문을 수행하는 방법을 설명한다.
서비스 중단이 가능한 환경#
모든 이중화 대상 서버의 운영을 중단할 수 있는 환경에서는 다음 단계로 DDL 문을 수행할 수 있다.
절차 1: 서비스 중지#
-
Active 서버의 서비스를 중지한다.
-
Active 서버의 데이터베이스 세션을 확인하여 서비스가 중지되었는지 확인한다.
SELECT COUNT(*) FROM V$SESSION WHERE ID<>SESSION_ID();
절차 2: 관리자 모드 설정#
Active 서버를 관리자 모드로 변경하여 다른 트랜잭션의 진입을 막는다.
ALTER SYSTEM SET ADMIN_MODE = 1;
절차 3: 이중화 중지#
- Active 서버에서 이중화 갭을 해소한다.
ALTER REPLICATION replication_name FLUSH;
- 이중화 갭이 해소되었는지 확인한다. REP_GAP의 값이 0이어야 한다.
SELECT REP_NAME, REP_GAP FROM V$REPGAP;
- 이중화를 중지한다.
ALTER REPLICATION replication_name STOP;
절차 4: 이중화 대상 제거#
이중화 서버의 모든 이중화 객체에서 DDL 문 수행 대상을 제거한다.
ALTER REPLICATION replication_name
DROP TABLE FROM user_name.table_name TO user_name.table_name;
절차 5: DDL 문 수행#
모든 이중화 서버에서 DDL 문을 수행한다.
절차 6: 이중화 대상 추가#
모든 이중화 서버에서 DDL 문 수행 대상을 이중화 객체에 다시 추가한다.
ALTER REPLICATION replication_name
ADD TABLE FROM user_name.table_name TO `user_name.table_name;
절차 7: 이중화 시작#
Active 서버에서 이중화를 시작한다.
ALTER REPLICATION replication_name START;
절차 8: 관리자 모드 해제#
Active 서버에서 관리자 모드를 해제한다.
ALTER SYSTEM SET ADMIN_MODE = 0;
절차 9: 서비스 시작#
Active 서버에서 다시 서비스를 시작한다.
Active-Standby 환경 수행 절차#
작업 절차 | Active | Standby | |
---|---|---|---|
절차 1. 서비스 중지 | 서비스 중지 | 서비스 중지 | - |
세션 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | ||
절차 2. 관리자 모드 설정 | ALTER SYSTEM SET ADMIN_MODE = 1; | ||
절차 3. 이중화 중지 | 이중화 갭 해소 | ALTER REPLICATION replication_name FLUSH; | |
이중화 갭 해소 확인 | SELECT REP_NAME, REP_GAP FROM V$REPGAP; | ||
이중화 중지 | ALTER REPLICATION replication_name STOP; | ||
절차 4. 이중화 대상 제거 | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | |
절차 5. DDL 문 수행 | DDL 문 수행 | DDL 문 수행 | |
절차 6. 이중화 대상 추가 | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | |
절차 7. 이중화 시작 | ALTER REPLICATION replication_name START; | ||
절차 8. 관리자 모드 해제 | ALTER SYSTEM SET ADMIN_MODE = 0; | ||
절차 9. 서비스 시작 | 서비스 시작 | - |
Active-Active 환경 수행 절차#
작업 절차 | Active1 | Active2 | |
---|---|---|---|
절차 1. 서비스 중지 | 서비스 중지 | 서비스 중지 | 서비스 중지 |
세션 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | |
절차 2. 관리자 모드 설정 | ALTER SYSTEM SET ADMIN_MODE = 1; | ALTER SYSTEM SET ADMIN_MODE = 1; | |
절차 3. 이중화 중지 | 이중화 갭 해소 | ALTER REPLICATION replication_name FLUSH; | ALTER REPLICATION replication_name FLUSH; |
이중화 갭 해소 확인 | SELECT REP_NAME, REP_GAP FROM V$REPGAP; | SELECT REP_NAME, REP_GAP FROM V$REPGAP; | |
이중화 중지 | ALTER REPLICATION replication_name STOP; | ALTER REPLICATION replication_name STOP; | |
절차 4. 이중화 대상 제거 | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | |
절차 5. DDL 문 수행 | DDL 문 수행 | DDL 문 수행 | |
절차 6. 이중화 대상 추가 | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | |
절차 7. 이중화 시작 | ALTER REPLICATION replication_name START; | ALTER REPLICATION replication_name START; | |
절차 8. 관리자 모드 해제 | ALTER SYSTEM SET ADMIN_MODE = 0; | ALTER SYSTEM SET ADMIN_MODE = 0; | |
절차 9. 서비스 시작 | 서비스 시작 | 서비스 시작 |
서비스를 중단할 수 없는 환경#
이중화 서버의 운영을 동시에 중지할 수 없는 환경에서는, 각 서버에서 순차적으로 DDL 문을 수행해야 하며, SQL 반영 모드를 사용해야 한다.
Caution
이 절차에서는 각 이중화 서버가 순간적으로 전송하지 못한 데이터가 존재할 가능성이 있다. 따라서, 트랜잭션이 가장 적은 시간을 선택하여 작업을 수행하고, 서비스 이전 시점에 이중화 갭이 0
이 될 때까지는 서비스를 일시적으로 중지할 것을 권장한다.
절차 1: 서비스 이전#
Active1의 서비스를 Active2로 이전하는 절차이다.
-
Active1에서 이중화 갭을 해소한다.
ALTER REPLICATION replication_name FLUSH;
-
이중화 갭이 해소되었는지 확인한다. REP_GAP의 값이 0이어야 한다.
SELECT REP_NAME, REP_GAP FROM V$REPGAP;
-
Active2로 서비스를 이전한다.
-
데이터베이스 세션을 확인하여 서비스가 Active2로 이전되었는지 확인한다.
SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID();
절차 2: 관리자 모드 설정#
Active1 서버를 관리자 모드로 변경하여 다른 트랜잭션의 진입을 막는다.
ALTER SYSTEM SET ADMIN_MODE = 1;
절차 3: 이중화 중지#
모든 이중화 서버에서 이중화를 중지한다.
ALTER REPLICATION replication_name STOP;
절차 4: 이중화 대상 제거#
Active1 서버에서 DDL 문 수행 대상을 제거한다.
ALTER REPLICATION replication_name
DROP TABLE FROM user_name.table_name TO user_name.table_name;
절차 5: DDL 문 수행#
Active1 서버에서 DDL 문을 수행한다.
절차 6: 이중화 대상 추가#
Active1 서버의 이중화 객체에 DDL 문 수행 대상을 다시 추가한다.
ALTER REPLICATION replication_name
ADD TABLE FROM user_name.table_name TO user_name.table_name;
절차 7: SQL 반영 모드 설정#
모든 이중화 서버에 SQL 반영 모드를 설정한다.
ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1;
절차 8: 이중화 시작#
모든 이중화 서버에서 이중화를 다시 시작한다.
ALTER REPLICATION replication_name START;
절차 9: 관리자 모드 해제#
Active1 서버를 관리자 모드에서 해제한다.
ALTER SYSTEM SET ADMIN_MODE = 0;
절차 10: Active2 서버에 DDL 문 수행#
절차 1부터 절차 9 작업을 Active2 서버에서도 수행한다.
ALTER REPLICATION replication_name START;
절차 11: SQL 반영 모드 동작 여부 확인#
모든 이중화 객체에서 SQL 반영 모드가 동작하는지 확인한다. 이중화 대상 서버에서 DDL 문이 정상적으로 수행되었으면, SQL 반영 모드로 동작 중인 이중화 객체가 없어야 한다.
다음 조회 구문을 실행하여 SQL_APPLY_TABLE_COUNT 값이 0
인지 확인한다.
SELECT REP_NAME, SQL_APPLY_TABLE_COUNT FROM V$REPRECEIVER;
절차 12: SQL 반영 모드 해제#
ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0;
절차 13: 서비스 분배#
Active1, Active2의 서비스를 원래대로 분배한다.
Active-Active 환경 수행 절차#
작업 절차 | Active1 | Active2 | |
---|---|---|---|
Active1의 서비스 이전 | 이중화 갭 해소 | ALTER REPLICATION replication_name FLUSH; | |
이중화 갭 해소 확인 | SELECT REP_NAME, REP_GAP FROM V$REPGAP; | ||
서비스 이전 | Active2로 서비스 이전 | ||
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | |
관리자 모드 설정 | ALTER SYSTEM SET ADMIN_MODE = 1; | ||
이중화 중지 | ALTER REPLICATION replication_name STOP; | ALTER REPLICATION replication_name STOP; | |
이중화 대상 제거 | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | ||
DDL 문 수행 | DDL 문 수행 | ||
이중화 대상 추가 | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | ||
SQL 반영 모드 설정 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1; | |
이중화 시작 | ALTER REPLICATION replication_name START; | ALTER REPLICATION replication_name START; | |
관리자 모드 해제 | ALTER SYSTEM SET ADMIN_MODE = 0; | ||
Active2의 서비스 이전 | 이중화 갭 해소 | ALTER REPLICATION replication_name FLUSH; | |
이중화 갭 해소 확인 | SELECT REP_NAME, REP_GAP FROM V$REPGAP; | ||
서비스 이전 | Active1로 서비스 이전 | ||
서비스 이전 확인 | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | SELECT COUNT(*) FROM V$SESSION WHERE ID <> SESSION_ID(); | |
관리자 모드 설정 | ALTER SYSTEM SET ADMIN_MODE = 1; | ||
이중화 중지 | ALTER REPLICATION replication_name STOP; | ALTER REPLICATION replication_name STOP; | |
이중화 대상 제거 | ALTER REPLICATION replication_name DROP TABLE FROM user_name.table_name TO user_name.table_name; | ||
DDL 문 수행 | DDL 문 수행 | ||
이중화 대상 추가 | ALTER REPLICATION replication_name ADD TABLE FROM user_name.table_name TO user_name.table_name; | ||
이중화 시작 | ALTER REPLICATION replication_name START; | ALTER REPLICATION replication_name START; | |
SQL 반영 모드 동작 여부 확인 | SELECT REP_NAME, SQL_APPLY_TABLE_COUNT FROM V$REPRECEIVER; | SELECT REP_NAME, SQL_APPLY_TABLE_COUNT FROM V$REPRECEIVER; | |
SQL 반영 모드 해제 | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0; | ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0; | |
관리자 모드 해제 | ALTER SYSTEM SET ADMIN_MODE = 0; | ||
서비스 분배 | 서비스를 원래대로 분배 |