콘텐츠로 이동

부록 B. 일반적인 DDL 문 수행 절차#

이 절에서는 이중화 대상에 별도의 프로퍼티 설정 없이 DDL 문을 수행하는 방법을 설명한다.

전제 조건#

이 절차는 다음과 같은 조건을 전제로 한다.

  • 모든 DDL 문 수행과 관련한 이중화 프로퍼티가 기본값으로 설정되어 있다.
  • 이중화가 시작된 상태이다.


주의 사항#

  • Active 서버에서 서비스를 중지하는 것이 필수적이다.
  • Active 서버에서 서비스를 중지하지 않은 상태에서 DDL 문을 수행하면, DDL 문을 실행과 동시에 Active 서버에서 주 트랜잭션이 발생할 경우 데이터 불일치가 발생할 수 있다.

이 절에서는 이중화 대상 서버에서 서비스의 중지가 가능한 경우불가능한 경우에 따라 DDL 문을 수행하는 방법을 설명한다.


서비스 중단이 가능한 환경#

모든 이중화 대상 서버의 운영을 중단할 수 있는 환경에서는 다음 단계로 DDL 문을 수행할 수 있다.

절차 1: 서비스 중지#

  1. Active 서버의 서비스를 중지한다.

  2. Active 서버의 데이터베이스 세션을 확인하여 서비스가 중지되었는지 확인한다.

    SELECT COUNT(*) FROM V$SESSION WHERE ID<>SESSION_ID();
    

절차 2: 관리자 모드 설정#

Active 서버를 관리자 모드로 변경하여 다른 트랜잭션의 진입을 막는다.

ALTER SYSTEM SET ADMIN_MODE = 1;

절차 3: 이중화 중지#

  1. Active 서버에서 이중화 갭을 해소한다.
ALTER REPLICATION replication_name FLUSH;
  1. 이중화 갭이 해소되었는지 확인한다. REP_GAP의 값이 0이어야 한다.
SELECT REP_NAME, REP_GAP FROM V$REPGAP;
  1. 이중화를 중지한다.
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로 이전하는 절차이다.

  1. Active1에서 이중화 갭을 해소한다.

    ALTER REPLICATION replication_name FLUSH;
    
  2. 이중화 갭이 해소되었는지 확인한다. REP_GAP의 값이 0이어야 한다.

    SELECT REP_NAME, REP_GAP FROM V$REPGAP;
    
  3. Active2로 서비스를 이전한다.

  4. 데이터베이스 세션을 확인하여 서비스가 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;
서비스 분배 서비스를 원래대로 분배