I. 개요

1. 사용 Software

제품명버전아키텍쳐배포 사이트
VirtualBox5.2.x호스트 환경에 따름https://www.virtualbox.org
Oracle Enterprise Linux7 (Update 3 이상 권장)x86 64bit

https://edelivery.oracle.com/linux

Database18.3x86 64bithttp://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

Oracle Database 18.3은 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 에서 받을 수 있습니다.

2. 구성 계획

A) 서버

VMHost NameMemoryNet Adapter구성 방법비고
Primaryora-act2GB브리지 어댑터리눅스 설치DB 엔진 설치 및 DB 생성 완료
Standbyora-stb2GB브리지 어댑터Primary 복제DB 엔진만 설치 (또는 Primary에 엔진 설치 후 복제하여 사용)

리눅스 기반의 Active-Standby 환경으로 구성합니다.

B) 스토리지

파일 이름용량타입용도비고
ora-act.vdi50GBDynamic / NormalPrimary 노드 스토리지디스크 사용량을 최소화하기 위해 Dynamic으로 생성합니다.
ora-stb.vdi50GBDynamic / NormalStandby 노드 스토리지vboxmanage clonemedium을 이용하여 primary 노드의 파일을 복제합니다.

Primary 노드에 DB 소프트웨어 설치까지 완료한 후 VDI를 복제하여 standby로 사용하면 구축 시간을 절약할 수 있습니다.

복제가 완료된 후에 Primary에만 데이터베이스를 생성하기 바랍니다.

C) 네트워크

VMPublic IPNetmaskGatewayDNS Server
Primary10.10.50.11255.255.255.010.10.50.1127.0.0.1
Standby10.10.50.21255.255.255.010.10.50.1127.0.0.1

인터넷 공유기 또는 Gateway의 IP에 맞춰 설정하기 바랍니다.

3. 호스트 환경

A) 시스템

12c부터는 64비트의 운영체제만을 지원하므로, 호스트 장비 또한 64비트 운영체제를 사용하여 구축해야 합니다.

메모리는 오라클의 권고에 따라 VM 노드당 2GB 이상이 필요하므로, 가능하면 8GB 이상의 메모리가 장착된 환경에서 작업하는 것을 권합니다.

B) 스토리지

디스크 I/O에 의한 지연을 최소화하기 위해 호스트의 OS가 설치되지 않은 별도의 내장 디스크를 사용하거나 SSD의 사용을 권합니다.

ESATA 또는 USB 3.0 이상의 빠른 속도를 보장하는 외장 디스크를 사용하는 것도 방법일 수 있습니다만 지속적인 연결이 보장되어야 합니다.

4. 서버 및 오라클 구축

18c 데이터베이스 설치 가이드(http://dataforum.kr/x/bh3CAw)를 참고하여 서버 및 데이터베이스를 구축하기 바랍니다.

II. Network 설정

1. 서버 Network 설정

A) 서버 정보 hosts 파일 저장

vi /etc/hosts
10.10.50.11     ora_act
10.10.50.21     ora_stb

hosts 파일에 primary 서버의 정보와 standby 서버의 정보를 입력합니다.

IP를 사용하지 않고 등록된 서버 정보로 접속을 하기 위한 작업입니다.

2. Listener 설정

A) Net manager로 primary listener 수정

Primary 노드에서 oracle 유저로 수행
netmgr

Net Manager를 실행하여 static listener를 설정합니다.

직접 listener.ora 파일을 수정해도 됩니다.

Net Manger 화면에서 Oracle Net 구성의 로컬 부분을 클릭하여 확장합니다.

Primary는 데이터베이스 생성시에 listener가 이미 설정되어 있을 수 있습니다.

중앙 상단의 '수신 위치'를 '데이터베이스 서비스'로 변경해줍니다.

아래 버튼에서 <데이터베이스 추가> 버튼을 클릭합니다.

데이터베이스1 항목에 다음과 같이 정보를 입력합니다.

  • 전역 데이터베이스 이름 : ORCL (서비스 명)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

<데이터베이스 추가> 버튼을 클릭하여 데이터베이스2를 추가한 후 다음과 같이 입력합니다.

  • 전역 데이터베이스 이름 : ORCL_DGB (서비스 명_DGB)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

<데이터베이스 추가> 버튼을 클릭하여 데이터베이스3를 추가한 후 다음과 같이 입력합니다.

  • 전역 데이터베이스 이름 : ORCL_DGMGRL (서비스 명_DGMGRL)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

Listener 설정이 모두 완료되었으면, 좌측 상단에 '파일' > '네트워크 구성 저장'을 클릭하여 작업한 내용을 저장합니다.

저장을 하게 되면 listener.ora 파일에 변경된 내용이 반영됩니다. 

B) Primary의 listener.ora 파일

vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora-act)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_DGB)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

Primary 노드의 listener.ora 파일의 내용은 다음과 같이 변경됩니다.

Net Manager를 사용하지 않고 직접 listener.ora 파일을 수정해도 static listener를 추가할 수 있습니다.

C) Net Manager로 standby listener 생성

Standby 노드에서 oracle 유저로 수행
netmgr

Standby는 listener가 생성되어 있지 않을 수 있습니다. Net Manager로 listener 생성과 static listener 등록을 동시에 하게 됩니다.

Network Manger 화면에서 Oracle Net 구성의 로컬 부분을 클릭하여 확장합니다.

'리스너'를 선택하고 좌측 상단에 + 모양의 생성 버튼을 클릭합니다.

리스너 이름에 "LISTENER"를 입력하고 <확인>을 클릭합니다.

'수신 위치' 항목에서 <주소 추가>를 클릭하고 아래와 같이 선택  또는 입력합니다.

  • 프로토콜 : TCP/IP
  • 호스트 : ora-stb (standby 노드의 hostname)
  • 포트 : 1521 (listener에서 사용할 포트번호)

<주소 추가> 버튼을 클릭하고 주소2 항목에 로컬 연결을 위한 내용을 추가로 선택 또는 입력합니다.

  • 프로토콜 : IPC
  • 키 : EXTPROC1521

중앙 상단의 '수신 위치'를 '데이터베이스 서비스'로 변경해줍니다.

아래 버튼에서 <데이터베이스 추가> 버튼을 클릭합니다.

데이터베이스1 항목에 다음과 같이 정보를 입력합니다.

  • 전역 데이터베이스 이름 : ORCL_STB (서비스 명)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

<데이터베이스 추가> 버튼을 클릭하여 데이터베이스2를 추가한 후 다음과 같이 입력합니다.

  • 전역 데이터베이스 이름 : ORCL_STB_DGB (서비스 명_DGB)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

<데이터베이스 추가> 버튼을 클릭하여 데이터베이스3를 추가한 후 다음과 같이 입력합니다.

  • 전역 데이터베이스 이름 : ORCL_STB_DGMGRL (서비스 명_DGMGRL)
  • Oracle 홈 디렉토리 : (ORACLE_HOME으로 지정된 경로)
  • SID : orcl (데이터베이스의 SID)

Listener 설정이 모두 완료되었으면, 좌측 상단에 '파일' > '네트워크 구성 저장'을 클릭하여 작업한 내용을 저장합니다.

저장을 하게 되면 listener.ora 파일에 변경된 내용이 반영됩니다. 

D) Standby의 listener.ora 파일

vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora-stb)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_STB)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_STB_DGB)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_STB_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/18.3.0/db_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

Standby 노드의 listener.ora 파일의 내용은 다음과 같이 변경됩니다.

Net Manager를 사용하지 않고 직접 listener.ora 파일을 생성해도 됩니다.

다만 static listener를 추가하지 않을 경우, Data Guard Broker를 통한 switchover 또는 failover 작업 시에 서비스 전환이 정상적으로 완료되지 않습니다.

E) 리스너 기동

oracle 유저로 실행
lsnrctl start
lsnrctl status
[oracle@orcl ~]$ lsnrctl start

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:16:19

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/18.3.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 18.0.0.0.0 - Production
System parameter file is /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/ora-act/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-act)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora-act)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date                10-SEP-2018 15:16:19
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora-act/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-act)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_DGB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_DGMGRL" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

[oracle@orcl ~]$ lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:17:30

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora-act)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date                10-SEP-2018 15:16:19
Uptime                    0 days 0 hr. 1 min. 10 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora-act/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-act)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "64a52f53a7683286e053cda9e80aed76" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "755d92b0acb235ebe0534701000a49b5" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "ORCL" has 2 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "ORCL_DGB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_DGMGRL" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "pdb" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@orcl ~]$ lsnrctl start

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:17:59

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/18.3.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 18.0.0.0.0 - Production
System parameter file is /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/ora-stb/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-stb)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora-stb)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date                10-SEP-2018 15:17:59
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora-stb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-stb)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "ORCL_STB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_STB_DGB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_STB_DGMGRL" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

[oracle@orcl ~]$ lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:18:25

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora-stb)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date                10-SEP-2018 15:17:59
Uptime                    0 days 0 hr. 0 min. 26 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/18.3.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora-stb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora-stb)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "ORCL_STB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_STB_DGB" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL_STB_DGMGRL" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

listener.ora 파일을 모두 변경 또는 생성하였으면 listener를 기동해줍니다.

이미 기동 중인 listener가 있다면 정지한 후 재기동합니다.

3. Local Net Service Name 구성

A) Net Configuration Assistant 실행

oracle 유저로 수행
netca

Net Configuration Assistant로 접속 정보를 변경 또는 생성합니다.

편집기를 이용해 직접 tnsnames.ora 파일을 생성하거나 수정할 수도 있습니다.

B) Primary 데이터베이스의 접속 정보 등록

'로컬 네트 서비스 이름 구성'을 선택하고 <다음>을 클릭합니다.

수행할 작업 선택에서 '추가'를 선택하고 <다음>을 클릭합니다.

Primary 노드의 경우 접속 정보가 저장된 tnsnames.ora 파일이 존재하면 다른 옵션들이 활성화되어 있을 수 있습니다.

Primary 데이터베이스의 접속 정보를 추가하기 위해 서비스 이름에 "ORCL"을 입력하고 <다음>을 클릭합니다.

Primary 노드의 경우 primary 데이터베이스의 접속 정보를 갖고 있을 수 있으므로, 그럴 때에는 standby 데이터베이스의 접속 정보만 추가하면 됩니다.

프로토콜은 'TCP'를 선택하고 <다음>을 클릭합니다.

호스트 이름에 primary 노드의 hostname인 "ora-act"를 입력합니다.

기본 포트 번호를 사용하려면 '표준 포트 번호 1521사용'을 선택하고 <다음>을 클릭합니다.

Primary의 데이터베이스와 listener가 open되어 있으면 테스트를 수행할 수 있습니다.

'예, 테스트를 수행합니다.'를 선택하고 <다음>을 클릭합니다.

초기에 입력된 접속 정보(계정, 암호)로는 접속이 되지 않을 수 있습니다.

<로그인 변경> 버튼을 클릭하여 데이터베이스에 접속할 계정과 암호를 바꿔줘야 합니다.

편의상 system 계정으로 테스트를 한다고 가정하고, 다음과 같이 입력한 후 <확인>을 클릭합니다.

  • 사용자 이름 : system
  • 암호 : (system 계정의 암호)

테스트가 성공되었으면 <다음>을 클릭합니다.

만약 실패하였다면, 반드시 문제를 해결해야 Data Guard를 정상적으로 사용할 수 있습니다.

네트 서비스 이름에 "ORCL"을 입력하고 <다음>을 클릭합니다.

C) Standby 데이터베이스의 접속 정보 등록

Standby 데이터베이스의 접속 정보를 추가합니다.

이 작업은 모든 노드에서 진행해야 할 것 입니다.

Standby 데이터베이스의 접속 정보를 추가하기 위해 서비스 이름에 "ORCL_STB"을 입력하고 <다음>을 클릭합니다.

프로토콜은 'TCP'를 선택하고 <다음>을 클릭합니다.

호스트 이름에 standby 노드의 hostname인 "ora-stb"를 입력합니다.

기본 포트 번호를 사용하려면 '표준 포트 번호 1521사용'을 선택하고 <다음>을 클릭합니다.

Standby 데이터베이스가 아직 생성되어 있지 않았으므로 테스트를 진행할 수 없습니다.

'아니오, 테스트를 수행하지 않겠습니다.'를 선택한 후 <다음>을 클릭합니다.

네트 서비스 이름에 "ORCL_STB"를 입력하고 <다음>을 클릭합니다.

모든 작업이 완료되었으므로, '아니오'를 선택한 후 <다음>을 클릭합니다.

완료 메시지를 확인하였으면 <다음> 버튼을 클릭합니다.

Net Configuration Assistant를 종료하기 위해 <완료> 버튼을 클릭합니다.

D) tnsnames.ora 파일

vi $ORACLE_HOME/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora-act)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL)
    )
  )

ORCL_STB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora-stb)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL_STB)
    )
  )
[oracle@orcl ~]$ tnsping ORCL

TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:18:45

Copyright (c) 1997, 2018, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/18.3.0/db_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ora-act)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
OK (0 msec)

[oracle@orcl ~]$ tnsping ORCL_STB

TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 10-SEP-2018 15:19:00

Copyright (c) 1997, 2018, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/18.3.0/db_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ora-stb)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORCL_STB)))
OK (0 msec)

tnsnames.ora 파일은 다음과 같이 생성됩니다.

직접 편집기를 사용해서 tnsnames.ora 파일을 생성 또는 변경할 수도 있습니다.

III. Data Guard 환경 구성

1. 파라미터 설정

A) db name 파라미터 조회

DB name 파라미터 값 조회
show parameter db_name
show parameter db_unique_name
SELECT db_unique_name FROM v$database;
SQL> show parameter db_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl

SQL> show parameter db_unique_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      ORCL
 
SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL

※ 만약 db_unique_name을 변경해야 한다면, 다음과 같이 spfile을 변경한 후에 데이터베이스를 재기동해야 합니다. (온라인 변경 불가능)

db_unique_name 변경
ALTER SYSTEM SET db_unique_name = ORCL scope=spfile;
SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
orcl

SQL> ALTER SYSTEM SET db_unique_name = ORCL scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area  838857584 bytes
Fixed Size                  8901488 bytes
Variable Size             650117120 bytes
Database Buffers          176160768 bytes
Redo Buffers                3678208 bytes
Database mounted.
Database opened.

SQL> alter pluggable database all open;

Pluggable database altered.

SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL

db_name 파라미터 값은 모두 동일하지만, db_unique_name은 Primary와 Standby가 달라야 합니다.

구분
db_name
db_unique_name
PrimaryorclORCL
StandbyorclORCL_STB

2. 아카이브 환경 설정

A) 아카이브 로그 파라미터 설정

sys 유저로 primary에서 수행
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL,ORCL_STB)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORCL_STB NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL_STB';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
-- ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL,ORCL_STB)';

System altered.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORCL_STB NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL_STB';

System altered.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;

System altered.

Data Guard 운영에 필요한 아카이브 관련 파라미터를 설정합니다.

  • LOG_ARCHIVE_CONFIG : 리두 로그를 원격 대상으로 보내고 원격 리두 로그를 수신하며, Data Guard 구성에서 각 데이터베이스의 DB_UNIQUE_NAME을 지정합니다.
  • LOG_ARCHIVE_DEST_2 : 아카이브 리두 로그를 보낼 원격 대상의 정보와 전송할 데이터와 방식에 대하여 지정합니다.
  • LOG_ARCHIVE_DEST_STATE_2 : LOG_ARCHIVE_DEST_2에서 지정한 경로의 활성화/비활성화 등의 상태를 지정합니다.
  • LOG_ARCHIVE_FORMAT : 아카이브 로그 파일명의 포맷을 지정합니다.

B) 아카이브 로그 모드 활성화

sys 유저로 primary에서 수행
SELECT log_mode FROM v$database;
SQL> SELECT log_mode FROM v$database;

LOG_MODE
------------
ARCHIVELOG

※ No Archive 모드인 경우, 데이터베이스를 중지하고 mount 모드에서 archive 모드로 변경해야 합니다.

Noarchive에서 Archive 모드로 변경
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

Data Guard를 사용하기 위해서는 반드시 Archive log 모드로 구성이 되어 있어야 합니다.

로그 모드를 조회한 후 noarchive 상태이면 반드시 archive 상태로 변경합니다.

C) 강제 로그 적용 모드 활성화

sys 유저로 primary에서 수행
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT force_logging FROM v$database;

FORCE_LOGGING
---------------------------------------
NO

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

SQL> SELECT force_logging FROM v$database;

FORCE_LOGGING
---------------------------------------
YES

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

추가적으로 force logging 모드로 전환하여, 모든 작업이 강제적으로 로그로 기록될 수 있도록 합니다.

3. Data Guard 환경 설정

A) Data Guard 관련 파라미터 설정

sys 유저로 primary에서 수행
ALTER SYSTEM SET FAL_CLIENT=ORCL;
ALTER SYSTEM SET FAL_SERVER=ORCL_STB;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
SQL> ALTER SYSTEM SET FAL_CLIENT=ORCL;

System altered.

SQL> ALTER SYSTEM SET FAL_SERVER=ORCL_STB;

System altered.

SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;

System altered.

Data Guard 환경 구성을 위한 파라미터를 설정합니다.

  • FAL_CLIENT : FAL(fetch archive log) 클라이언트를 참조하기 위해 FAL_SERVER 초기화 매개 변수를 통해 구성된 FAL 클라이언트 이름을 지정합니다.
  • FAL_SERVER : Standby 데이터베이스에 대한 FAL(fetch archive log) 서버를 지정합니다.
  • STANDBY_FILE_MANAGEMENT : Physical Standby에 automatic standby file management를 활성화 또는 비활성화합니다. 자동 대기 파일 관리를 사용하면 primary 데이터베이스의 파일 추가 및 삭제 작업이 standby 데이터베이스에도 적용됩니다.

B) Standby Log File 생성

sys 유저로 primary에서 수행
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo03.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo01.log') SIZE 200M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo02.log') SIZE 200M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo03.log') SIZE 200M;

Database altered.

SQL> SELECT group#, member, type FROM v$logfile;

    GROUP# MEMBER                                             TYPE
---------- -------------------------------------------------- -------
         3 /u01/app/oracle/oradata/ORCL/redo03.log            ONLINE
         2 /u01/app/oracle/oradata/ORCL/redo02.log            ONLINE
         1 /u01/app/oracle/oradata/ORCL/redo01.log            ONLINE
         4 /u01/app/oracle/oradata/ORCL/standby_redo01.log    STANDBY
         5 /u01/app/oracle/oradata/ORCL/standby_redo02.log    STANDBY
         6 /u01/app/oracle/oradata/ORCL/standby_redo03.log    STANDBY

6 rows selected.

Standby Redo Log를 primary에 생성합니다. primary와 동일한 갯수와 사이즈로 생성하도록 합니다.

C) 플래시백 활성화 (옵션)

sys 유저로 primary에서 수행
ALTER DATABASE FLASHBACK ON;
SQL> SELECT db_unique_name, flashback_on FROM v$database;

DB_UNIQUE_NAME                 FLASHBACK_ON
------------------------------ ------------------
ORCL                           NO

SQL> ALTER DATABASE FLASHBACK ON;

Database altered.

SQL> SELECT db_unique_name, flashback_on FROM v$database;

DB_UNIQUE_NAME                 FLASHBACK_ON
------------------------------ ------------------
ORCL                           YES

Failover가 발생할 경우, primary를 standby로 사용할 수 있도록 하기 위해 설정합니다.

4. Standby 서버 환경 설정

A) 디렉토리 생성

oracle 유저로 standby 서버에서 수행
mkdir -p /u01/app/oracle/oradata/ORCL/pdb
mkdir -p /u01/app/oracle/oradata/ORCL/pdbseed
mkdir -p /u01/app/oracle/fast_recovery_area/ORCL
mkdir -p /u01/app/oracle/admin/orcl/adump
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/pdb
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/pdbseed
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/fast_recovery_area/ORCL
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/admin/orcl/adump

Standby 노드에 필요한 디렉토리를 생성합니다.

B) 패스워드 파일 생성

oracle 유저로 standby 서버에서 수행
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10 format=12
[oracle@orcl ~]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10 format=12

Standby 노드에 password 파일을 생성해줍니다.

암호 복잡도 설정을 무시하고자 한다면 format=12 옵션을 추가하도록 합니다.

C) 임시 파라미터 파일 생성

vi /home/oracle/orcl_stb.ora
*.db_name='orcl'
[oracle@orcl ~]$ cat orcl_stb.ora
*.db_name='orcl'

Standby 데이터베이스에서 임시로 사용할 파라미터 파일을 생성합니다.

간단하게 db_name만 지정해도 충분합니다.

IV. Standby DB 복제

1. Standby DB Instance 구동

A) SQL*Plus 접속

sysdba 권한으로 standby 접속
sqlplus / as sysdba
[oracle@orcl ~]$ sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Mon Sep 10 15:29:24 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Connected to an idle instance.

Standby 데이터베이스 복제를 위해 sys 권한으로 접속을 합니다.

 

B) nomount 모드로 Database 시작

Standby 인스턴스 기동
startup nomount pfile='/home/oracle/orcl_stb.ora';
SQL> startup nomount pfile='/home/oracle/orcl_stb.ora';
ORACLE instance started.

Total System Global Area  243266936 bytes
Fixed Size                  8656248 bytes
Variable Size             180355072 bytes
Database Buffers           50331648 bytes
Redo Buffers                3923968 bytes

Standby 인스턴스를 임시로 생성한 파라미터 파일로 기동합니다.

2. RMAN을 이용한 DB 복제

A) RMAN 접속

RMAN 원격 접속
rman TARGET sys/oracle@ORCL AUXILIARY sys/oracle@ORCL_STB
[oracle@orcl ~]$ rman TARGET sys/oracle@ORCL AUXILIARY sys/oracle@ORCL_STB

Recovery Manager: Release 18.0.0.0.0 - Production on Mon Sep 10 15:30:07 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1514118152)
connected to auxiliary database: ORCL (not mounted)

RMAM으로 primary 데이터베이스와 standby 인스턴스를 접속합니다.

Primary는 target으로, standby는 auxiliary로 접속합니다.

Primary나 standby 어느 곳에서 접속해도 됩니다.

B) Duplicate 명령으로 복제

RMAN으로 DB 복제
DUPLICATE TARGET DATABASE
   FOR STANDBY
   FROM ACTIVE DATABASE
   DORECOVER
   SPFILE
     SET db_unique_name='ORCL_STB' COMMENT 'Is standby'
     SET LOG_ARCHIVE_DEST_2='SERVICE=ORCL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'
     SET FAL_SERVER='ORCL' COMMENT 'Is primary'
   NOFILENAMECHECK;
RMAN> DUPLICATE TARGET DATABASE
2>    FOR STANDBY
3>    FROM ACTIVE DATABASE
4>    DORECOVER
5>    SPFILE
6>      SET db_unique_name='ORCL_STB' COMMENT 'Is standby'
7>      SET LOG_ARCHIVE_DEST_2='SERVICE=ORCL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'
8>      SET FAL_SERVER='ORCL' COMMENT 'Is primary'
9>    NOFILENAMECHECK;

Starting Duplicate Db at 18/09/10
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=39 device type=DISK
current log archived

contents of Memory Script:
{
   backup as copy reuse
   passwordfile auxiliary format  '/u01/app/oracle/product/18.3.0/db_1/dbs/orapworcl'   ;
   restore clone from service  'ORCL' spfile to
 '/u01/app/oracle/product/18.3.0/db_1/dbs/spfileorcl.ora';
   sql clone "alter system set spfile= ''/u01/app/oracle/product/18.3.0/db_1/dbs/spfileorcl.ora''";
}
executing Memory Script

Starting backup at 18/09/10
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=84 device type=DISK
Finished backup at 18/09/10

Starting restore at 18/09/10
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: restoring SPFILE
output file name=/u01/app/oracle/product/18.3.0/db_1/dbs/spfileorcl.ora
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 18/09/10

sql statement: alter system set spfile= ''/u01/app/oracle/product/18.3.0/db_1/dbs/spfileorcl.ora''

contents of Memory Script:
{
   sql clone "alter system set  db_unique_name =
 ''ORCL_STB'' comment=
 ''Is standby'' scope=spfile";
   sql clone "alter system set  LOG_ARCHIVE_DEST_2 =
 ''SERVICE=ORCL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'' comment=
 '''' scope=spfile";
   sql clone "alter system set  FAL_SERVER =
 ''ORCL'' comment=
 ''Is primary'' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

sql statement: alter system set  db_unique_name =  ''ORCL_STB'' comment= ''Is standby'' scope=spfile

sql statement: alter system set  LOG_ARCHIVE_DEST_2 =  ''SERVICE=ORCL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'' comment= '''' scope=spfile

sql statement: alter system set  FAL_SERVER =  ''ORCL'' comment= ''Is primary'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area     838857584 bytes

Fixed Size                     8901488 bytes
Variable Size                637534208 bytes
Database Buffers             188743680 bytes
Redo Buffers                   3678208 bytes

contents of Memory Script:
{
   restore clone from service  'ORCL' standby controlfile;
}
executing Memory Script

Starting restore at 18/09/10
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=35 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
Finished restore at 18/09/10

contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database
RMAN-05538: warning: implicitly using DB_FILE_NAME_CONVERT

contents of Memory Script:
{
   set newname for tempfile  1 to
 "/u01/app/oracle/oradata/ORCL/temp01.dbf";
   set newname for tempfile  2 to
 "/u01/app/oracle/oradata/ORCL/pdbseed/temp012018-09-08_22-45-25-164-PM.dbf";
   set newname for tempfile  3 to
 "/u01/app/oracle/oradata/ORCL/pdb/temp01.dbf";
   switch clone tempfile all;
   set newname for datafile  1 to
 "/u01/app/oracle/oradata/ORCL/system01.dbf";
   set newname for datafile  3 to
 "/u01/app/oracle/oradata/ORCL/sysaux01.dbf";
   set newname for datafile  4 to
 "/u01/app/oracle/oradata/ORCL/undotbs01.dbf";
   set newname for datafile  5 to
 "/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf";
   set newname for datafile  6 to
 "/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf";
   set newname for datafile  7 to
 "/u01/app/oracle/oradata/ORCL/users01.dbf";
   set newname for datafile  8 to
 "/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf";
   set newname for datafile  9 to
 "/u01/app/oracle/oradata/ORCL/pdb/system01.dbf";
   set newname for datafile  10 to
 "/u01/app/oracle/oradata/ORCL/pdb/sysaux01.dbf";
   set newname for datafile  11 to
 "/u01/app/oracle/oradata/ORCL/pdb/undotbs01.dbf";
   set newname for datafile  12 to
 "/u01/app/oracle/oradata/ORCL/pdb/users01.dbf";
   restore
   from  nonsparse   from service
 'ORCL'   clone database
   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/ORCL/temp01.dbf in control file
renamed tempfile 2 to /u01/app/oracle/oradata/ORCL/pdbseed/temp012018-09-08_22-45-25-164-PM.dbf in control file
renamed tempfile 3 to /u01/app/oracle/oradata/ORCL/pdb/temp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 18/09/10
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/ORCL/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/ORCL/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCL/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:04
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/ORCL/users01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00008 to /u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00009 to /u01/app/oracle/oradata/ORCL/pdb/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00010 to /u01/app/oracle/oradata/ORCL/pdb/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00011 to /u01/app/oracle/oradata/ORCL/pdb/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00012 to /u01/app/oracle/oradata/ORCL/pdb/users01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 18/09/10

sql statement: alter system archive log current
current log archived

contents of Memory Script:
{
   restore clone force from service  'ORCL'
           archivelog from scn  1557092;
   switch clone datafile all;
}
executing Memory Script

Starting restore at 18/09/10
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=8
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service ORCL
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=9
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 18/09/10

datafile 1 switched to datafile copy
input datafile copy RECID=4 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/system01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=5 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=6 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/undotbs01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=7 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=8 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=9 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/users01.dbf
datafile 8 switched to datafile copy
input datafile copy RECID=10 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf
datafile 9 switched to datafile copy
input datafile copy RECID=11 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdb/system01.dbf
datafile 10 switched to datafile copy
input datafile copy RECID=12 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdb/sysaux01.dbf
datafile 11 switched to datafile copy
input datafile copy RECID=13 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdb/undotbs01.dbf
datafile 12 switched to datafile copy
input datafile copy RECID=14 STAMP=986484870 file name=/u01/app/oracle/oradata/ORCL/pdb/users01.dbf

contents of Memory Script:
{
   set until scn  1557458;
   recover
   standby
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 18/09/10
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 8 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_8_fsd43mkg_.arc
archived log for thread 1 with sequence 9 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_9_fsd43nq5_.arc
archived log file name=/u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_8_fsd43mkg_.arc thread=1 sequence=8
archived log file name=/u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_9_fsd43nq5_.arc thread=1 sequence=9
media recovery complete, elapsed time: 00:00:01
Finished recover at 18/09/10

contents of Memory Script:
{
   delete clone force archivelog all;
}
executing Memory Script

released channel: ORA_DISK_1
released channel: ORA_AUX_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=84 device type=DISK
deleted archived log
archived log file name=/u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_8_fsd43mkg_.arc RECID=1 STAMP=986484867
deleted archived log
archived log file name=/u01/app/oracle/fast_recovery_area/ORCL/ORCL_STB/archivelog/2018_09_10/o1_mf_1_9_fsd43nq5_.arc RECID=2 STAMP=986484868
Deleted 2 objects

Finished Duplicate Db at 18/09/10
SQL> select instance_name, status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
orcl             MOUNTED

SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL_STB

Duplicate target database 명령을 이용해 primary 데이터베이스를 standby로 복제합니다.

V. Data Guard Broker 설정

1. Data Guard Broker 활성화

A) dg_broker_start 파라미터 설정

sys 유저로 primary와 standby에서 모두 수행
ALTER SYSTEM SET dg_broker_start=true;
[oracle@orcl ~]$ sqlplus sys/oracle@ORCL as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Sep 10 15:37:07 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0

SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL
 
SQL> ALTER SYSTEM SET dg_broker_start=true;

System altered.

SQL> exit
Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
[oracle@orcl ~]$ sqlplus sys/oracle@ORCL_STB as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Sep 10 15:37:57 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0

SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL_STB
 
SQL> ALTER SYSTEM SET dg_broker_start=true;

System altered.

SQL> exit
Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0

Primary와 Standby 데이터베이스의 Data Guard Broker를 기동합니다.

반드시 양쪽 모두에서 수행해야 합니다.

2. Data Guard Broker 환경 구성

A) DGMGRL 접속

sys 유저로 접속
dgmgrl sys/oracle@ORCL
[oracle@orcl ~]$ dgmgrl sys/oracle@ORCL
DGMGRL for Linux: Release 18.0.0.0.0 - Production on Mon Sep 10 15:38:04 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL"
Connected as SYSDBA.

원격 접속이 구성된 환경에서 DGMGRL을 통해 데이터베이스에 접속할 수 있습니다.

원격 접속에서 password file 파일을 사용할 수 있도록 암호를 입력하는 방식으로 접속합니다.

B) 데이터베이스 등록

Data Guard 대상 데이터베이스 등록
CREATE CONFIGURATION dg_orcl AS PRIMARY DATABASE IS orcl CONNECT IDENTIFIER IS orcl;
ADD DATABASE orcl_stb AS CONNECT IDENTIFIER IS orcl_stb MAINTAINED AS PHYSICAL;
DGMGRL> CREATE CONFIGURATION dg_orcl AS PRIMARY DATABASE IS orcl CONNECT IDENTIFIER IS orcl;
Configuration "dg_orcl" created with primary database "orcl"

DGMGRL> ADD DATABASE orcl_stb AS CONNECT IDENTIFIER IS orcl_stb MAINTAINED AS PHYSICAL;
Database "orcl_stb" added

Primary 데이터베이스와 standby 데이터베이스를 Broker에 등록합니다.

C) Data Guard Broker 설정 활성화

설정 활성화
ENABLE CONFIGURATION;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
DISABLED
 
DGMGRL> ENABLE CONFIGURATION;
Enabled.

등록된 설정값을 갖고 Data Guard Broker를 활성화합니다.

D) Data Guard Broker 등록 정보 조회

Broker에 등록된 정보 조회
SHOW CONFIGURATION;
SHOW DATABASE orcl;
SHOW DATABASE orcl_stb;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 14 seconds ago)

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL> SHOW DATABASE orcl_stb;

Database - orcl_stb

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 0 seconds ago)
  Apply Lag:          0 seconds (computed 0 seconds ago)
  Average Apply Rate: 2.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
SUCCESS

Data Guard Broker에 등록된 내용을 SHOW 명령어로 조회할 수 있습니다.

E) 문제 발생시 Standby 데이터베이스 재기동(옵션)

sys 유저로 standby에서 수행
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

SHOW CONFIGURATION에서 오류 확인

DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database
      Warning: ORA-16854: apply lag could not be determined

Fast-Start Failover: DISABLED

Configuration Status:
WARNING   (status updated 53 seconds ago)

Standby 데이터베이스 재기동

[oracle@orcl ~]$ sqlplus sys/oracle@ORCL_STB as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Mon Sep 10 15:40:33 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0

SQL> SELECT db_unique_name FROM v$database;

DB_UNIQUE_NAME
------------------------------
ORCL_STB

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  838857584 bytes
Fixed Size                  8901488 bytes
Variable Size             637534208 bytes
Database Buffers          188743680 bytes
Redo Buffers                3678208 bytes
Database mounted.

정상 확인

DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 14 seconds ago)

초기에 불안전한 상태로 기동이 되는 경우가 있습니다.

Standby 데이터베이스를 mount 모드로 재기동하면 문제를 자동으로 해결할 수 있습니다.

F) 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status, dataguard_broker FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status, dataguard_broker FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DATAGUAR
------------------------------ -------------------- ---------------- -------------------- --------
ORCL                           READ WRITE           PRIMARY          TO STANDBY           ENABLED
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status, dataguard_broker FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DATAGUAR
------------------------------ -------------------- ---------------- -------------------- --------
ORCL_STB                       MOUNTED              PHYSICAL STANDBY NOT ALLOWED          ENABLED

각 데이터베이스에서 Data Guard Broker에 등록된 정보를 확인할 수 있습니다.

VI. Switchover

1. Standby로 switchover

A) Primary에 DGMGRL로 접속

DGMGRL로 primary DB에 접속
dgmgrl sys/oracle@ORCL
[oracle@orcl ~]$ dgmgrl sys/oracle@ORCL
DGMGRL for Linux: Release 18.0.0.0.0 - Production on Mon Sep 10 15:41:25 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL"
Connected as SYSDBA.

Primary에서 standby로 switchover하기 위해 DGMGRL로 paimary에 접속합니다.

B) Standby로 switchover

Standby로 switchover 수행
SWITCHOVER TO orcl_stb;
DGMGRL> SWITCHOVER TO orcl_stb;
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl_stb"
Connecting ...
Connected to "ORCL_STB"
Connected as SYSDBA.
New primary database "orcl_stb" is opening...
Operation requires start up of instance "orcl" on database "orcl"
Starting instance "orcl"...
Connected to an idle instance.
ORACLE instance started.
Database mounted.
Connected to "ORCL"
Switchover succeeded, new primary is "orcl_stb"

Switchover 명령어를 사용하여 standby로 데이터베이스를 switchover 합니다.

C) Switchover 결과 확인

Switchover 결과 확인
SHOW CONFIGURATION;
SHOW DATABASE orcl;
SHOW DATABASE orcl_stb;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl_stb - Primary database
    orcl     - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 77 seconds ago)

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 1 second ago)
  Apply Lag:          0 seconds (computed 1 second ago)
  Average Apply Rate: 210.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL> SHOW DATABASE orcl_stb;

Database - orcl_stb

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    orcl

Database Status:
SUCCESS

Show 명령을 통해 DGMGRL에서 switchover 상태를 확인할 수 있습니다.

D) Switchover 후 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL                           MOUNTED              PHYSICAL STANDBY NOT ALLOWED
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL_STB                       READ WRITE           PRIMARY          TO STANDBY

Primary와 standby 데이터베이스의 상태도 변경된 것을 v$database 뷰에서 확인할 수 있습니다.

2. Primary로 복원

A) Standby에 DGMGRL로 접속

DGMGRL로 standby DB에 접속
dgmgrl sys/oracle@ORCL_STB
[oracle@orcl ~]$ dgmgrl sys/oracle@ORCL_STB
DGMGRL for Linux: Release 18.0.0.0.0 - Production on Mon Sep 10 15:54:25 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL_STB"
Connected as SYSDBA.

Standby에서 primary로 복원하기 위해 DGMGRL로 standby에 접속합니다.

B) Primary로 switchover

Primary로 switchover 수행
SWITCHOVER TO orcl;
DGMGRL> SWITCHOVER TO orcl;
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl"
Connecting ...
Connected to "ORCL"
Connected as SYSDBA.
New primary database "orcl" is opening...
Operation requires start up of instance "orcl" on database "orcl_stb"
Starting instance "orcl"...
Connected to an idle instance.
ORACLE instance started.
Database mounted.
Connected to "ORCL_STB"
Switchover succeeded, new primary is "orcl"

Switchover 명령어를 사용하여 primary로 데이터베이스를 switchover 합니다.

C) 복원 결과 확인

복원 결과 확인
SHOW CONFIGURATION;
SHOW DATABASE orcl;
SHOW DATABASE orcl_stb;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 71 seconds ago)

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL> SHOW DATABASE orcl_stb;

Database - orcl_stb

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 0 seconds ago)
  Apply Lag:          0 seconds (computed 0 seconds ago)
  Average Apply Rate: 386.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL에서 Show 명령어로 복원된 결과를 확인할 수 있습니다.

D) 복원 후 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL                           READ WRITE           PRIMARY          TO STANDBY
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL_STB                       MOUNTED              PHYSICAL STANDBY NOT ALLOWED

데이터베이스의 상태도 다시 원래대로 복원된 것을 v$database 뷰로 확인할 수 있습니다.

VII. Failover

1. Failover 수행

A) DGMGRL로 Standby DB 접속

DGMGRL로 standby DB에 접속
dgmgrl sys/oracle@orcl_stb
[oracle@orcl ~]$ dgmgrl sys/oracle@orcl_stb
DGMGRL for Linux: Release 18.0.0.0.0 - Production on Mon Sep 10 15:58:34 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL_STB"
Connected as SYSDBA.

Primary에서 standby로 switchover하기 위해 DGMGRL로 standby에 접속합니다.

B) Standby로 failover 수행

Standby로 failover 수행
FAILOVER TO orcl_stb;
DGMGRL> FAILOVER TO orcl_stb;
Performing failover NOW, please wait...
Failover succeeded, new primary is "orcl_stb"

Failover 명령으로 작업을 수행합니다.

C) Failover 결과 확인

Failover 후 상태 확인
SHOW CONFIGURATION;
SHOW DATABASE orcl_stb;
SHOW DATABASE orcl;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl_stb - Primary database
    orcl     - Physical standby database (disabled)
      ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 102 seconds ago)

DGMGRL> SHOW DATABASE orcl_stb;

Database - orcl_stb

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      (unknown)
  Apply Lag:          (unknown)
  Average Apply Rate: (unknown)
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
ORA-16661: the standby database needs to be reinstated

Failover가 정상적으로 완료되었는지 확인합니다.

기존의 Primary는 disabled로 복구가 필요한 상태입니다.

D) Failover 직후 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL                           READ WRITE           PRIMARY          NOT ALLOWED
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL_STB                       READ WRITE           PRIMARY          NOT ALLOWED

각 데이터베이스의 상태를 살펴보면 모두 primary로 되어 있는 것을 확인할 수 있습니다.

Primary는 현재 비정상적이므로 standby에서의 switchover는 now allowed 상태로 되어 있습니다.

2. Primary 데이터베이스 reinstate하기

A) Reinstate 수행

Primary DB의 Reinstate 수행
REINSTATE DATABASE orcl;
DGMGRL> REINSTATE DATABASE orcl;
Reinstating database "orcl", please wait...
Operation requires shut down of instance "orcl" on database "orcl"
Shutting down instance "orcl"...
Connected to "ORCL"
ORACLE instance shut down.
Operation requires start up of instance "orcl" on database "orcl"
Starting instance "orcl"...
Connected to an idle instance.
ORACLE instance started.
Database mounted.
Connected to "ORCL"
Continuing to reinstate database "orcl" ...
Reinstatement of database "orcl" succeeded

Flashback Database가 활성화 되어 있었다면, reinstate 명령어로 간단하게 복구할 수 있습니다.

B) Reinstate 결과 확인

Reinstate 후 상태 확인
SHOW CONFIGURATION;
SHOW DATABASE orcl;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl_stb - Primary database
    orcl     - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 17 seconds ago)

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 24 seconds ago)
  Apply Lag:          0 seconds (computed 24 seconds ago)
  Average Apply Rate: 482.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
SUCCESS

정상적으로 reinstate가 되었는지 확인합니다.

C) Reinstate 후 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL                           MOUNTED              PHYSICAL STANDBY NOT ALLOWED
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL_STB                       READ WRITE           PRIMARY          TO STANDBY

데이터베이스의 상태를 살펴보면 primary와 standby의 역할이 정상으로 되어 있는 것을 확인할 수 있습니다.

3. Primary로 복원

A) Primary로 switchover

Primary로 switchover 수행
SWITCHOVER TO orcl;
DGMGRL> SWITCHOVER TO orcl;
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl"
Connecting ...
Connected to "ORCL"
Connected as SYSDBA.
New primary database "orcl" is opening...
Operation requires start up of instance "orcl" on database "orcl_stb"
Starting instance "orcl"...
Connected to an idle instance.
ORACLE instance started.
Database mounted.
Connected to "ORCL_STB"
Switchover succeeded, new primary is "orcl"

복구가 된 primary로 switchover를 수행할 수 있습니다.

B) Switchover 결과 확인

Switchover 결과 확인
SHOW CONFIGURATION;
SHOW DATABASE orcl;
SHOW DATABASE orcl_stb;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl     - Primary database
    orcl_stb - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS   (status updated 71 seconds ago)

DGMGRL> SHOW DATABASE orcl;

Database - orcl

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    orcl

Database Status:
SUCCESS

DGMGRL> SHOW DATABASE orcl_stb;

Database - orcl_stb

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 1 second ago)
  Apply Lag:          0 seconds (computed 1 second ago)
  Average Apply Rate: 561.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    orcl

Database Status:
SUCCESS

정상적으로 switchover 되었는지 확인할 수 있습니다.

C) 복원 후 데이터베이스 상태 확인

Primary DB와 Standby DB에서 수행
SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL                           READ WRITE           PRIMARY          TO STANDBY
SQL> SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;

DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
------------------------------ -------------------- ---------------- --------------------
ORCL_STB                       MOUNTED              PHYSICAL STANDBY NOT ALLOWED

데이터베이스의 상태가 모두 정상화 되었습니다.

  • 레이블 없음