DBAtlas · 데이터베이스 운영 아틀라스

Oracle Data Guard(physical standby) 구성

증상

목표: physical standby(Data Guard)로 Oracle의 재해 복구와 고가용성을 구성하고, primary 장애 시 standby로 전환할 수 있게 한다.

1. primary를 FORCE LOGGING 및 ARCHIVELOG 모드로 설정한다

standby가 primary와 일관성을 유지하려면 모든 변경이 redo에 기록되어야 한다. FORCE LOGGING은 NOLOGGING 작업도 로깅한다. ARCHIVELOG 모드를 위해 데이터베이스를 MOUNT 상태로 올린다.

Oracle

ALTER DATABASE FORCE LOGGING;
-- For ARCHIVELOG:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

2. standby redo log 파일을 추가한다

standby redo log(SRL)는 online redo log보다 그룹이 하나 더 많고 크기가 같아야 한다. primary와 standby 양쪽에 생성하며, real-time apply에 필요하다. 예시에서 online redo가 200M이면 SRL도 200M이다.

Oracle

ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl04.log') SIZE 200M;

3. log_archive_dest 및 관련 파라미터를 설정한다

primary에서 redo를 standby로 전송하도록 dest_2를 정의한다. DB_UNIQUE_NAME, LOG_ARCHIVE_CONFIG(양쪽의 db_unique_name), FAL_SERVER, STANDBY_FILE_MANAGEMENT=AUTO를 설정한다. 이렇게 하면 standby에서 파일이 자동으로 생성된다.

Oracle

ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_prim,orcl_stby)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby';
ALTER SYSTEM SET FAL_SERVER='orcl_stby';  -- for role changes; on the standby FAL_SERVER='orcl_prim'
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;

4. RMAN DUPLICATE FOR STANDBY로 standby를 생성한다

standby 서버에 password file과 static listener/tnsnames를 구성한 후 RMAN이 primary와 standby(AUXILIARY)에 연결한다. FROM ACTIVE DATABASE는 백업 없이 네트워크로 복사하며, DORECOVER는 redo를 적용한다.

Oracle

rman TARGET sys/password@orcl_prim AUXILIARY sys/password@orcl_stby
RUN {
  DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
  DORECOVER
  NOFILENAMECHECK;
}

5. redo apply(MRP)를 시작하고 확인한다

standby가 MOUNT 상태일 때 managed recovery를 시작한다. real-time apply에는 USING CURRENT LOGFILE을 사용한다. v$managed_standby로 apply 프로세스(MRP0)가 실행 중인지 확인한다.

Oracle

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
SELECT process, status, sequence# FROM v$managed_standby WHERE process LIKE 'MRP%';

6. Data Guard Broker를 활성화한다

broker는 구성을 중앙화하고 failover/switchover를 단일 명령으로 줄인다. 두 인스턴스 모두에 DG_BROKER_START=TRUE를 설정한 후 dgmgrl로 구성을 생성하고 활성화한다. 12c+에서는 broker가 redo 전송을 관리한다: LOG_ARCHIVE_DEST_2를 수동으로 설정했다면 ADD DATABASE가 ORA-16698로 실패하므로 먼저 ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=''로 지운다.

Oracle

ALTER SYSTEM SET DG_BROKER_START=TRUE;
-- In dgmgrl:
CREATE CONFIGURATION dgconf AS PRIMARY DATABASE IS orcl_prim CONNECT IDENTIFIER IS orcl_prim;
ADD DATABASE orcl_stby AS CONNECT IDENTIFIER IS orcl_stby;
ENABLE CONFIGURATION;

7. 동기화 차이를 모니터링하고 테스트를 완료한다

primary와 standby 간 sequence 차이를 지속적으로 모니터링해야 한다. 차이가 커지면 네트워크/적용 병목을 의미한다. dgmgrl SHOW CONFIGURATION이 'SUCCESS'를 보여야 한다. 선택적으로 switchover로 역할 전환을 테스트한다.

Oracle

-- dgmgrl (SHOW DATABASE shows the Transport Lag / Apply Lag values):
SHOW CONFIGURATION;
SHOW DATABASE orcl_stby;
-- SQL (standby): SELECT name, value FROM v$dataguard_stats WHERE name LIKE '%lag';
DBAtlas에서 열기 →