[Oracle 11gR2] Oracle DataGuard 아키텍처와 프로세스의 이해
이번 글에서는 다이어그램을 통해 Oracle DataGuard 아키텍처와 프로세스를 이해해 보겠습니다. 어느 정도 이해가 되신다면, “Data Guard 기반의 백업 오프로딩(Backup Offloading) 구조 구현하기” 글을 참고하세요.
- LGWR(Log Writer) 프로세스
- 메모리(SGA)에 있는 Redo Log Buffer의 내용을 디스크의 Online Redo Log File로 기록
-- Online Redo Log와 Standby Redo Log 다중화 경로 확인 SELECT NAME, VALUE FROM V$PARAMETER WHERE UPPER(NAME) LIKE 'DB_CREATE_ONLINE_LOG_DEST%' AND VALUE IS NOT NULL; -- Online Redo Log File의 경로 확인 SELECT A.GROUP#, A.STATUS, SEQUENCE#, B.TYPE, B.MEMBER AS "FILE_PATH", A.BYTES / 1024 / 1024 AS "SIZE_MB" FROM V$LOG A, V$LOGFILE B WHERE A.GROUP# = B.GROUP# ORDER BY A.GROUP#;
- 메모리(SGA)에 있는 Redo Log Buffer의 내용을 디스크의 Online Redo Log File로 기록
- LNS(Log Network Server) 프로세스
- Primary 데이터베이스의 LNS 프로세스는 Redo Log Buffer에서 Redo 데이터를 캡처합니다.
- 이 캡처된 Redo 데이터는 Oracle Net을 통해 Standby 데이터베이스의 RFS 프로세스로 전송됩니다.
- LNS 프로세스가 Online Redo Log File에 Redo 데이터가 기록되기 전에 캡처할 만큼 충분히 빠르지 않거나, Redo 데이터가 Online Redo Log File에 매우 빠르게 기록되는 경우, LNS 프로세스는 Online Redo Log File에서 Redo를 읽어 Oracle Net을 통해 RFS 프로세스로 전송합니다.
- RFS(Remote File System) 프로세스
- RFS 프로세스는 전송받은 Redo 데이터를 Standby Redo Log(SRL) File에 기록합니다.
-- Online Redo Log와 Standby Redo Log 다중화 경로 확인 SELECT NAME, VALUE FROM V$PARAMETER WHERE UPPER(NAME) LIKE 'DB_CREATE_ONLINE_LOG_DEST%' OR UPPER(NAME) = 'STANDBY_FILE_MANAGEMENT' AND VALUE IS NOT NULL; -- Standby Redo Log File의 경로 확인 SELECT A.GROUP#, A.STATUS, SEQUENCE#, B.TYPE, B.MEMBER AS "FILE_PATH", A.BYTES / 1024 / 1024 AS "SIZE_MB" FROM V$STANDBY_LOG A, V$LOGFILE B WHERE A.GROUP# = B.GROUP# ORDER BY A.GROUP#; - 네트워크 장애가 발생하여 Online Redo Log가 Log Switch되고 데이터가 Standby Redo Log File에 기록되기 전에 Archived Log File로 이동하는 경우, RFS 프로세스는 ARCn 프로세스와 직접 통신하여 Archive Log Gap 해결 작업을 수행합니다.
-- Archive Log Gap 확인 SELECT * FROM V$ARCHIVE_GAP;
- standby_file_management = AUTO라면, Primary DB에서 데이터파일을 추가하거나 삭제하면, Standby DB의 RFS 프로세스가 이 Redo를 읽고 Standby 서버의 디스크에도 자동으로 파일을 생성/삭제합니다.
show parameter standby_file_management;
- RFS 프로세스는 전송받은 Redo 데이터를 Standby Redo Log(SRL) File에 기록합니다.
- ARCn 프로세스
- LGWR가 쓰던 Online Redo Log File이 꽉 차서 Log Switch가 발생하면, ARCn 프로세스가 해당 파일을 읽어 Archive Log File로 복사합니다.
-- Achive Log 저장 경로 확인 SELECT A.NAME, A.VALUE, B.DEST_ID, B.STATUS, B.DESTINATION, B.TARGET, B.ARCHIVER FROM V$PARAMETER A, V$ARCHIVE_DEST B WHERE UPPER(A.NAME) IN ('LOG_ARCHIVE_DEST_1', 'LOG_ARCHIVE_DEST_2', 'DB_RECOVERY_FILE_DEST') AND (CASE WHEN REGEXP_LIKE(A.NAME, '[0-9]+$') THEN TO_NUMBER(SUBSTR(A.NAME, -1)) ELSE NULL END) = B.DEST_ID(+); -- Archive Log File의 경로 확인 SELECT DEST_ID, RECID, SEQUENCE#, NAME AS "FILE_PATH", -- 실제 물리적 경로와 파일명 BLOCKS * BLOCK_SIZE / 1024 / 1024 AS "SIZE_MB", FIRST_TIME, COMPLETION_TIME FROM V$ARCHIVED_LOG WHERE NAME IS NOT NULL ORDER BY DEST_ID, RECID DESC; - SYNC모드:
①LNS는 Standby의 RFS로부터 “데이터 잘 받아서 기록했다”는 확인(ACK)을 받을 때까지 기다립니다.
②LGWR은 다시 LNS로부터 그 확인을 전달받을 때까지 기다립니다.
③이 모든 확인이 끝나야만 비로소 Primary DB에서 COMMIT이 완료됩니다. - ASYNC모드:
LGWR 프로세스와 LNS 프로세스는 서로 완전히 독립적으로 움직이며, Primary DB는 Standby DB로부터 확인(ACK)을 전혀 기다리지 않고 자기 할 일을 계속합니다.
- LGWR가 쓰던 Online Redo Log File이 꽉 차서 Log Switch가 발생하면, ARCn 프로세스가 해당 파일을 읽어 Archive Log File로 복사합니다.
- MRP(Managed Recovery Process) 프로세스
- Standby DB는 MOUNT로, 아래 명령어를 실행하여 MRP 프로세스를 기동합니다.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION PARALLEL 4;
- RFS가 Standby Redo Log(SRL)에 받아놓은 변경 이력(Redo 또는 SQL)을 읽어서, Standby DB의 데이터 파일에 실제로 반영합니다.
-- Standby DB에서 MRP 프로세스 확인 SELECT PROCESS, STATUS, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';
- Standby DB를 OPEN하려면, 아래 명령어를 먼저 실행하여 MRP 프로세스를 중지시켜야 합니다.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
- Standby DB는 MOUNT로, 아래 명령어를 실행하여 MRP 프로세스를 기동합니다.

