데이터베이스 CLI와 함께 Oracle Data Guard 사용

이 문서에서는 데이터베이스 CLI를 사용하여 Oracle Cloud Infrastructure에서 FSFO(Fast-Start Failover)로 Data Guard를 설정하는 방법에 대해 설명합니다. 이 문서의 항목에서는 기본 및 대기 데이터베이스를 준비한 다음 기본 데이터베이스에서 리두 데이터를 전송하여 대기 데이터베이스에 적용하도록 Data Guard를 구성하는 방법에 대해 설명합니다.

Oracle은 데이터베이스 CLI 대신 콘솔을 사용하여 Oracle Cloud Infrastructure에서 Data Guard를 설정하고 작업할 것을 권장합니다.

주: 이 문서에서는 사용자가 Data Guard 및 FSFO를 잘 알고 있다고 가정합니다. 자세한 내용은 DB 시스템에서 Oracle Data Guard 사용을 참조하십시오.

선행 조건

이 항목의 절차를 수행하려면 primary database 및 standby database에 대해 다음 정보가 필요합니다.

데이터베이스 정보 찾기

이 항목의 뒷부분에 설명된 대로 기본 및 대기 DB 시스템을 시작하고 데이터베이스를 생성한 후에는 해당 시스템에서 CLI를 사용하여 필요한 데이터베이스 정보를 찾을 수 있습니다.

  1. DB 시스템에서 SSH로 접속합니다.

    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. opc로 로그인한 다음 sudo을 root 사용자에게 로그인합니다. sudo su -를 하이픈과 함께 사용하여 루트 사용자의 프로파일을 호출합니다. 그러면 PATH가 dbcli 디렉토리(/opt/oracle/dcs/bin)로 설정됩니다.

    sudo su -
  3. db_name(또는 oracle_sid) 및 db_uniqueName을 찾으려면 dbcli list-databases -j 명령을 실행합니다.

    dbcli list-databases -j

    출력:

    [ {
      "id" : "80ad855a-5145-4f8f-a08f-406c5e4684ff",
      "name" : "dbtst",
      "dbName" : "dbtst",
      "databaseUniqueName" : "dbtst_phx1cs",
      "dbVersion" : "12.1.0.2",
      "dbHomeId" : "2efe7af7-0b70-4e9b-ba8b-71f11c6fe287",
      "instanceOnly" : false,
       .
       .
       .
  4. Oracle 홈 디렉토리 또는 데이터베이스 홈을 찾으려면 dbcli list-dbhomes 명령을 실행합니다. DB 시스템에 데이터베이스 홈이 여러 개 있는 경우 위에 표시된 dbcli list-databases -j 명령 출력에서 "dbHomeId"와 일치하는 홈을 사용합니다.

    dbcli list-dbhomes

    출력:

    ID                                       Name                 DB Version                               Home Location                                 Status
    ---------------------------------------- -------------------- ---------------------------------------- --------------------------------------------- ----------
    2efe7af7-0b70-4e9b-ba8b-71f11c6fe287     OraDB12102_home1     12.1.0.2.160719 (23739960, 23144544)     /u01/app/oracle/product/12.1.0.2/dbhome_1     Configured
    
    33ae99fe-5413-4392-88da-997f3cd24c0f     OraDB11204_home1     11.2.0.4.160719 (23054319, 23054359)     /u01/app/oracle/product/11.2.0.4/dbhome_1     Configured

기본 DB 시스템 생성

기본 DB 시스템이 아직 없는 경우 Overview of Creating a DB System에 설명된 대로 시스템을 만듭니다. DB 시스템에는 초기 데이터베이스가 포함됩니다. DB 시스템에서 사용 가능한 데이터베이스 명령을 사용하여 추가 데이터베이스를 생성할 수 있습니다.

대기 DB 시스템 생성

주: 대기 데이터베이스는 기본 데이터베이스와 동일한 db_name을 가져야 하지만 다른 db_unique_name을 가져야 합니다. 대기 및 기본에 대해 동일한 데이터베이스 이름을 사용하는 경우 아래에 설명된 dbcli create-database 명령을 실행하려면 먼저 dbcli delete-database 명령을 사용하여 대기 DB 시스템에서 데이터베이스를 삭제해야 합니다. 데이터베이스 삭제 및 생성을 완료하는 데 몇 분 정도 걸립니다. dbcli 명령은 root 사용자로 실행해야 합니다.

  1. Overview of Creating a DB System에 설명된 대로 대기 DB 시스템을 만들고 DB 시스템이 프로비저닝을 완료하고 사용할 수 있게 될 때까지 기다립니다.

    가용성 및 재해 복구를 위해 기본 DB 시스템과 다른 가용성 도메인에 대기 DB 시스템을 생성할 수 있습니다(권장 사항). 기본 DB 시스템의 클라우드 네트워크에서 대기 DB 시스템을 생성하여 두 시스템이 경로 지정 가능한 단일 네트워크에 있도록 할 수 있습니다.

  2. DB 시스템에서 SSH로 접속합니다.

    ssh -i <private_key_path> opc@<db_system_ip_address>
  3. opc로 로그인한 다음 sudo을 root 사용자에게 로그인합니다. sudo su -를 하이픈과 함께 사용하여 루트 사용자의 프로파일을 호출합니다. 그러면 PATH가 dbcli 디렉토리(/opt/oracle/dcs/bin)로 설정됩니다.

    sudo su -
  4. DB 시스템에는 초기 데이터베이스가 포함되지만 dbcli create-database 명령을 --instanceonly 매개변수와 함께 사용하여 대기 데이터베이스를 생성해야 합니다. 이 파라미터는 데이터베이스 저장 영역 구조만 생성하고 다른 데이터베이스 파일은 생성되지 않으므로 nomount 모드로 데이터베이스를 시작합니다.

    --instanceonly를 사용할 때는 혼동을 피하기 위해 --dbname 및 --adminpassword 매개변수가 모두 필요하며 기본 데이터베이스의 dbname 및 관리자 비밀번호와 일치해야 합니다.

    다음 샘플 명령은 admin 암호를 묻는 메시지를 표시한 다음 dbname이라는 데이터베이스에 대한 저장소 구조를 만듭니다.

    dbcli create-database --dbname <same as primary dbname>;--databaseUniqueName <different from primary uniquename>;--instanceonly --adminpassword

    플러거블 데이터베이스를 사용하는 경우 --cdb 매개변수도 지정합니다.

    전체 명령 구문은 Database Commands을 참조하십시오.

  5. dbcli create-database 명령이 대기 데이터베이스를 생성할 때까지 몇 분 정도 기다립니다.

    dbcli list-jobs 명령을 사용하여 생성 작업이 성공적으로 실행되었는지 확인한 다음 dbcli list-databases 명령을 사용하여 데이터베이스가 구성되었는지 확인할 수 있습니다.

기본 DB 시스템 준비

기본 DB 시스템을 준비하려면 정적 리스너를 구성하고, tnsnames.ora를 업데이트하고, 일부 데이터베이스 설정 및 매개변수를 구성해야 합니다.

정적 리스너 구성

RMAN 및 Data Guard Broker에서 사용할 정적 리스너를 생성합니다.

  1. 기본 DB 시스템에 SSH로 접속하여 opc 또는 root 사용자로 로그인하고 sudo를 Grid OS 사용자에게 로그인합니다.

    sudo su - grid
  2. /u01/app/<version>/grid/network/admin/listener.ora를 편집하고 여기에 다음 콘텐츠를 추가합니다. 여기에 표시된 첫번째 정적 리스너는 선택 사항입니다. 두번째 DGMGRL 정적 리스너는 버전 12.1 이상 데이터베이스의 경우 선택 사항이지만 버전 11.2 데이터베이스의 경우 필요합니다.

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>_DGMGRL.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
      )
  3. 변경 사항을 저장한 다음 리스너를 재시작합니다.

    srvctl stop listener
    srvctl start listener

tnsnames.ora에 네트 서비스 이름입니다.

oracle 유저로 $ORACLE_HOME/network/admin/tnsnames.ora를 편집하고 standby database net 서비스 이름을 추가합니다.

<standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<standby db_domain>)
    )
  )

위의 샘플에서는 이름 분석이 작동하고 있으며 기본 데이터베이스에서 <standby_server>.<domain>를 분석할 수 있다고 가정합니다. 단일 클라우드 네트워크(VCN) 내에서 IP 주소의 라우팅이 가능한 경우 대기 서버의 전용 IP 주소를 사용할 수도 있습니다.

Primary Database 파라미터 구성

참고: 기본 호스트와 대기 호스트의 디렉토리 구조가 서로 다른 경우 여기서 설명되지 않은 추가 매개변수(예: log_file_name_convert 매개변수)를 설정해야 할 수 있습니다. 디렉토리 구조가 다른 호스트에 대해 standby database를 생성하는 방법에 대한 자세한 내용은 RMAN 설명서를 참조하십시오.

  1. oracle 유저로 자동 standby 파일 관리를 활성화합니다.

    alter system set standby_file_management=AUTO;
  2. Broker 구성 파일 이름 및 위치를 식별합니다. 이에 사용되는 명령은 데이터베이스 저장 영역 유형에 따라 다릅니다. 데이터베이스 스토리지 유형을 모르는 경우 DB 시스템에서 데이터베이스 명령을 사용합니다.

    ACFS 데이터베이스 스토리지의 경우 다음 명령을 사용하여 Broker 구성 파일을 설정합니다.

    alter system set dg_broker_config_file1='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr1<Primary db_unique_name>.dat';
    alter system set dg_broker_config_file2='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr2<Primary db_unique_name>.dat';

    ASM 데이터베이스 저장 영역의 경우 다음 명령을 사용하여 Broker 구성 파일을 설정합니다.

    alter system set dg_broker_config_file1='+DATA/<Primary db_unique_name>/dr1<db_unique_name>.dat';
    alter system set dg_broker_config_file2='+DATA/<Primary db_unique_name>/dr2<db_unique_name>.dat';
  3. 데이터베이스에 대해 중계자 DMON 프로세스를 활성화합니다.

    alter system set dg_broker_start=true;
  4. 모든 데이터베이스 트랜잭션에 대해 데이터베이스 로깅을 강제 적용합니다.

    alter database force logging ;
  5. 온라인 리두 로그(ORL)를 기반으로 SRL(대기 리두 로그)을 추가합니다. 새로 실행된 DB 시스템에는 크기가 1073741824인 세 개의 ORL이 있으므로 크기가 동일한 네 개의 SRL을 생성합니다.

    아래 질의를 사용하여 ORL의 개수 및 크기(바이트)를 확인할 수 있습니다.

    select group#, bytes from v$log;

    출력:

        GROUP# BYTES
    ---------- ----------
             1 1073741824
             2 1073741824
             3 1073741824

    모든 ORL의 크기는 동일해야 합니다.

    SRL은 ORL과 크기가 같아야 하지만 ORL보다 SRL이 하나 이상 있어야 합니다. 위 예제에는 세 개의 ORL이 있으므로 네 개의 SRL이 필요합니다. 따라서 현재 리두 로그에 1을 더한 값을 지정하고 리두 로그와 동일한 크기를 사용하십시오.

    alter database add standby logfile thread 1 size <size>;

    SRL 그룹에는 멤버가 하나만 있어야 합니다. 기본적으로 SRL 그룹당 멤버가 하나만 있는 DB 시스템이 생성됩니다. 이를 위해 다음 구문을 사용하여 파일 이름을 지정할 수 있습니다.

    alter database add standby logfile thread 1 group 4 (<logfile name with full path>) size 1073741824, group 5(<logfile name with full path>) size 1073741824 ...

    ASM/OMF 구성의 경우 위 명령은 \<logfile name with full path> 대신 디스크 그룹을 사용합니다.

    alter database add standby logfile thread 1 group 4 (+RECO) size 1073741824, group 5(+RECO) size 1073741824 ...

    참고: 로그 스위치가 10분 간격보다 자주 발생하지 않도록 ORL 및 SRL 크기를 조정해야 합니다. 이를 위해서는 응용 프로그램에 대한 지식이 필요하며 배치 후 조정해야 할 수도 있습니다. 자세한 내용은 Use Standby Redo Logs and Configure Size Appropriately를 참조하십시오.

  6. 올바른 수의 SRL이 생성되었는지 확인합니다.

    select group#, bytes from v$standby_log;
  7. 데이터베이스가 ARCHIVELOG 모드에 있는지 확인하십시오.

    archive log list
  8. FLASHBACK 데이터베이스를 활성화합니다. db_flashback_retention_target에 권장되는 최소값은 120분입니다.

    alter database flashback on ;
    alter system set db_flashback_retention_target=120;
  9. 데이터베이스가 새로 생성된 경우 단일 스위치 리두 로그를 수행하여 아카이브를 활성화합니다. (RMAN 복제(duplicate)를 실행하기 전에 적어도 하나의 로그를 아카이브해야 합니다.)

    alter system switch logfile;

Standby Database 준비

대기 데이터베이스를 준비하기 전에 대기 데이터베이스의 데이터베이스 홈이 기본 데이터베이스의 데이터베이스 홈과 동일한 버전인지 확인하십시오. (기본 데이터베이스와 대기 데이터베이스가 모두 동일한 데이터베이스 버전으로 새로 생성된 경우 데이터베이스 홈은 동일합니다.) 그렇지 않은 경우 동일한 버전의 데이터베이스 홈을 생성합니다. Dbhome 명령을 사용하여 버전을 확인하고 필요에 따라 새 데이터베이스 홈을 생성할 수 있습니다.

대기 DB 시스템을 준비하려면 정적 리스너를 구성하고, tnsnames.ora를 업데이트하고, TDE 전자 지갑을 구성하고, 임시 암호 파일을 생성하고, 연결을 확인하고, RMAN DUPLICATE를 실행하고, FLASHBACK을 활성화한 다음 데이터베이스 서비스를 생성해야 합니다.

정적 리스너 구성

RMAN 및 Data Guard Broker에서 사용할 정적 리스너를 생성합니다.

  1. standby DB 시스템에 SSH로 접속하여 opc 또는 root 유저로 로그인하고 sudo를 Grid OS 유저로 로그인합니다.

    sudo su - grid
  2. 다음 내용을 /u01/app/<db_version>/grid/network/admin/listener.ora.에 추가합니다.

    다음은 첫번째 정적 리스너가 RMAN DUPLICATE에 필요합니다. 두번째 DGMGRL 정적 리스너는 데이터베이스 버전 12.2.0.1 및 12.1.0.2에 대해 선택 사항이지만 데이터베이스 버전 11.2.0.4에 필요합니다.

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>_DGMGRL.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
      )
  3. 리스너를 재시작합니다.

    srvctl stop listener
    srvctl start listener
  4. 정적 리스너를 사용할 수 있는지 확인합니다. 아래의 샘플 출력은 데이터베이스 버전 12.1.0.2에 대한 것입니다. 이 시점에서는 ...status UNKNOWN 메시지가 필요합니다.

    lsnrctl status

    출력:

    LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 29-SEP-2016 21:09:25
    
    Copyright (c) 1991, 2014, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
    Start Date                29-SEP-2016 21:09:19
    Uptime                    0 days 0 hr. 0 min. 5 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/12.1.0.2/grid/network/admin/listener.ora
    Listener Log File         /u01/app/grid/diag/tnslsnr/dg2/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.1.24)(PORT=1521)))
    Services Summary...
    Service "dg2_phx2hx.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    Service "dg2_phx2hx_DGMGRL.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

tnsnames.ora에 네트 서비스 이름입니다.

oracle 유저로 standby database net 서비스 이름을 $ORACLE_HOME/network/admin/tnsnames.ora에 추가합니다. $ORACLE_HOME은 standby database가 실행 중인 데이터베이스 홈입니다.

<Primary db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <primary_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <primary db_unique_name).<primary db_domain>)
    )
  )

<Standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<db_domain>)
    )
  )

TDE 전자 지갑(Wallet)을 대기 시스템으로 복사

SCP를 사용하여 기본 DB 시스템의 TDE 전자 지갑 파일을 대기 DB 시스템으로 복사합니다. 다음 샘플 명령은 SCP 명령이 oracle OS 사용자에 의해 실행되고 있으며 oracle에 대한 개인 키가 만들어졌으며 SCP가 실행 중인 호스트에 존재한다고 가정합니다.

scp -i <private key> primary_server:/opt/oracle/dcs/commonstore/wallets/tde/<primary db_unique_name>/* standby_server:/opt/oracle/dcs/commonstore/wallets/tde/<standby db_unique_name>

대기 시스템 구성 설정

oracle 유저로 데이터베이스 버전 11.2.0.4에 대해 다음 디렉토리를 생성합니다. 이 단계는 버전 12.2.0.1 및 버전 12.1.0.2에 대해 선택 사항입니다.

mkdir  -pv /u03/app/oracle/redo/<standby db_unique_name uppercase>/controlfile

감사 파일 대상 생성

oracle 유저로 감사 파일 대상으로 사용할 다음 디렉토리를 생성합니다.

mkdir -p /u01/app/oracle/admin/<db_name>/adump

그렇지 않으면 나중에 사용된 RMAN 복제(duplicate) 명령이 실패합니다.

임시 암호 파일 생성

oracle 유저로 임시 Password file을 생성합니다.

orapwd file=$ORACLE_HOME/dbs/orapw<standby oracle_sid>    password=<admin password for primary> entries=5

비밀번호는 기본 데이터베이스에 대한 관리 비밀번호와동일해야 합니다. 그렇지 않으면 아래의 RMAN 중복 단계가 RMAN-05614: Passwords for target and auxiliary connections must be the same when using active duplicate.와 함께 실패합니다.

Standby Database를 사용할 수 있는지 확인

  1. oracle 유저로 환경 변수를 설정합니다.

    . oraenv
  2. $ORACLE_HOME/dbs/init<standby sid_name>.ora를 다음 콘텐츠로 바꿉니다.

    db_name=<Primary db_name>
    db_unique_name=<standby db_unique_name>
    db_domain=<standby db_domain>
  3. standby에서 spfile을 제거합니다.

    /u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile$ORACLE_SID.ora

    데이터베이스를 지정된 spfile 없이 nomount 모드로 시작해야 하지만 원래 init 파일에 RMAN 중복 단계가 작동하지 않도록 하는 spfile 매개변수가 포함되어 있습니다.

  4. DB_UNIQUE_NAME를 가리키도록 ORACLE_UNQNAME 환경 변수를 설정합니다.

    export ORACLE_UNQNAME =db_unique_name

    주: 이 단계를 수행하지 않으면 전자 지갑이 열리지 않고 후속 단계에서 RMAN DUPLICATE 명령 실행이 실패합니다.

  5. 앞에서 사용한 dbcli create-database --instanceonly 명령은 대기 데이터베이스를 읽기/쓰기 모드에서 기본 데이터베이스로 열므로 아래의 nomount 단계로 진행하기 전에 데이터베이스를 종료해야 합니다.

    sqlplus / as sysdba
    
    shutdown immediate
  6. nomount 모드로 데이터베이스를 시작합니다.

    startup nomount

데이터베이스 연결 확인

primary database와 standby database 간의 연결을 확인합니다.

  1. 리스너 포트 1521이 기본 및 대기 DB 시스템에 사용되는 보안 목록에서 열려 있는지 확인합니다. 자세한 내용은 DB 시스템에 대한 보안 목록 업데이트를 참조하십시오.
  2. primary database에서 standby database에 연결합니다.

    sqlplus sys/<password>@<standby net service name> as sysdba
  3. standby database에서 primary database에 연결합니다.

    sqlplus sys/<password>@<primary net service name> as sysdba

RMAN DUPLICATE 명령 실행

standby DB 시스템에서 oracle 유저로 RMAN DUPLICATE 명령을 실행합니다.

기본 데이터베이스가 크면 추가 채널을 할당하여 성능을 향상시킬 수 있습니다. 새로 설치된 데이터베이스의 경우 일반적으로 한 채널이 몇 분 안에 데이터베이스 복제를 실행합니다.

RMAN DUPLICATE 명령으로 생성된 오류가 없는지 확인합니다. 오류가 발생하면 RMAN DUPLICATE의 일부로 $ORACLE_HOME/dbs 아래에 생성된 경우 init.ora 파일(spfile 아님)을 사용하여 데이터베이스를 재시작하십시오.

다음 예에서는 달리 지정되지 않은 경우 <Standby db_unique_name>에 소문자를 사용합니다.

ACFS 저장소 레이아웃의 경우 다음 명령을 실행합니다.

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run { allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase >/'
    set db_unique_name='<Standby db_unique_name>'
    set db_create_file_dest='/u02/app/oracle/oradata/<Standby db_unique_name>'
    set dg_broker_config_file1='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

ASM 저장 영역 레이아웃의 경우 다음 명령을 실행합니다.

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run {
    allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase>/'
    set db_unique_name='<Standby db_unique_name>'
    set dg_broker_config_file1='+DATA/<Standby db_unique_name>/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='+DATA/<Standby db_unique_name>/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

데이터베이스 FLASHBACK 활성화

  1. Data Guard의 최적의 사용법으로 Flashback을 활성화하고 primary database와 standby database에서 db_flashback_retention_target를 최소한 120분으로 설정합니다.

    alter database flashback on;
    alter system set db_flashback_retention_target=120;
  2. standby database가 제대로 생성되었는지 확인합니다.

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE,SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database ;

데이터베이스 서비스 생성

Oracle은 srvctl을 사용하여 대기 데이터베이스에 대한 데이터베이스 서비스를 생성할 것을 권장합니다.

ACFS 스토리지 레이아웃용입니다.

  1. 공유 디렉토리를 생성하고 spfile 파일을 복사합니다.

    mkdir -pv /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
    cp $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
  2. 기존 데이터베이스 서비스를 정지하고 제거합니다.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. 데이터베이스 서비스를 생성합니다.

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. 데이터베이스 서비스를 시작합니다.

    srvctl start database
        -d <standby db_unique_name>
  5. $ORACLE_HOME/dbs에서 파일을 정리합니다.

    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
  6. spfile 파일의 새 위치를 참조하는 $ORACLE_HOME/dbs/init<standby oracle_sid>.ora 파일을 생성합니다.

    SPFILE='/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
  7. standby database를 정지한 다음 srvctl를 사용하여 시작합니다.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl start database
        -d <standby db_unique_name>

ASM 저장 영역 레이아웃의 경우

  1. +DATA 아래에 spfile 파일을 생성하는 것이 좋습니다.

    create pfile='init<standby oracle_sid>.ora' from spfile ;
    create spfile='+DATA' from pfile='init<standby oracle_sid>.ora' ;
  2. 기존 데이터베이스 서비스를 정지하고 제거합니다.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. 데이터베이스 서비스를 생성합니다.

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. 데이터베이스 서비스를 시작합니다.

    srvctl start database
        -d <standby db_unique_name>
  5. $ORACLE_HOME/dbs에서 파일을 정리합니다.

    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
  6. spfile 파일의 새 위치를 참조하는 $ORACLE_HOME/dbs/init<standby oracle_sid>.ora 파일을 생성합니다.

    SPFILE='+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
  7. 데이터베이스를 정지하고 srvctl을 사용하여 standby database를 시작합니다.

    srvctl start database -d <standby db_unique_name>

Data Guard 구성

다음 단계를 수행하여 Data Guard 구성을 완료하고 primary database에서 리두 전송을 활성화하고 standby database에서 리두 적용을 활성화합니다.

  1. 기본 또는 대기 DB 시스템에서 dgmgrl 명령행 유틸리티를 실행하고 sys 인증서를 사용하여 기본 데이터베이스에 접속합니다.

    connect sys/<sys password>@<primary tns alias>
  2. dgmgrl 명령행 유틸리티에서 Data Guard 구성을 생성하고 primary 및 standby database를 식별합니다.

    create configuration mystby as primary database is <primary db_unique_name> connect identifier is <primary tns alias>;
    add database  <standby db_unique_name> as connect identifier is <standby tns alias>  maintained as physical;
  3. dgmgrl 명령행 유틸리티에서 Data Guard 구성을 사용으로 설정합니다.

    enable configuration;
  4. Data Guard 설정이 제대로 수행되었는지 확인합니다. SQL 프롬프트에서 기본 및 대기 데이터베이스 모두에서 다음 SQL을 실행합니다.

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database;
  5. Data Guard 프로세스가 standby database에서 시작되었는지 확인합니다.

    select PROCESS,PID,DELAY_MINS from V$MANAGED_STANDBY;
  6. primary 및 standby에서 파라미터 구성을 확인합니다.

    show parameter log_archive_dest_
    show parameter log_archive_config
    show parameter fal_server
    show parameter log_archive_format
  7. dgmgrl 명령행 유틸리티에서 Data Guard 구성이 작동 중인지 확인합니다. 특히 리두 전달 및 리두 적용이 제대로 작동하고 있으며 standby database가 primary database 뒤에서 비합리적으로 지연되지 않는지 확인합니다.

    show configuration verbose
    show database verbose <standby db_unique_name>
    show database verbose <primary db_unique_name>

    불일치, 오류 또는 경고를 해결해야 합니다. 또한 기본 데이터베이스에서 트랜잭션을 실행하고 대기 데이터베이스에서 트랜잭션을 볼 수 있는지 확인할 수 있습니다.

  8. 양방향으로 전환 및 복구를 수행하여 Data Guard 구성이 예상대로 작동하는지 확인합니다. 각 작업 후에 show configuration를 실행하고 dgmgrl 명령행 유틸리티에 오류나 경고가 없는지 확인합니다.

    주의: 이 단계는 사용자의 재량에 따라 선택 사항입니다. 어떤 이유로 구성이 유효하지 않은 경우 스위치오버 및/또는 페일오버가 실패하고 기본 데이터베이스를 시작하기가 어렵거나 불가능할 수 있습니다. 가용성에 영향을 주는 기본 복구가 필요할 수 있습니다.

    switchover to <standby db_unique_name>
    switchover to <primary db_unique_name>
    #connect to standby before failover:
    
    connect sys/<sys password>@<standby db_unique_name>
    failover to <standby db_unique_name>
    reinstate database <primary db_unique_name>
    #connect to primary before failover:
    
    connect sys/<sys password>@<primary db_unique_name>
    failover to <primary db_unique_name>
    reinstate database <standby db_unique_name>

관찰자 구성(선택사항)

고가용성 및 내구성을 위한 모범 사례는 기본, 대기 및 관찰자를 별도의 가용성 도메인에서 실행하는 것입니다. Observer는 특정 대상 standby database로 failover할지 여부를 결정합니다. Observer에 사용되는 서버에는 Oracle SQL NET 및 Broker가 포함된 Oracle Client Administrator 소프트웨어가 필요합니다. dgmgrl 명령행 유틸리티에서 다음 명령을 실행합니다.

  1. 앞에서 설명한 대로 primary database와 standby database에 대해 모두 TNS alias 이름을 구성하고 두 데이터베이스에 대한 연결을 확인합니다.
  2. 보호 모드를 최대 가용성 또는 최대 성능으로 변경합니다(FSFO의 경우 최대 보호가 지원되지 않음).

    최대 가용성을 사용으로 설정하려면 다음을 수행합니다.

    edit database <standby db_unique_name> set property 'logXptMode'='SYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='SYNC';
    edit configuration set protection mode as maxavailability;

    최대 성능을 사용으로 설정하려면 다음과 같이 하십시오.

    edit configuration set protection mode as maxperformance;
    edit database <standby db_unique_name> set property 'logXptMode'='ASYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='ASYNC';

    최대 성능을 위해 FastStartFailoverLaglimit 등록 정보는 허용되는 최대 데이터 손실 양을 기본적으로 30초로 제한합니다.

  3. 다음 속성도 고려해야 합니다. show configuration verbose를 실행하여 현재 값을 확인합니다.

    • FastStart FailoverPmyShutdown
    • FastStartFailover 임계값
    • FastStart Failover 대상
    • FastStartFailover자동 복구

    (show configuration를 실행하면 Observer가 시작될 때까지 Warning : ORA-16819: fast-start failover observer not started 오류가 발생합니다.)

  4. Broker에서 Fast-Start Failover 활성화:

    Enable fast_start failover
  5. Fast-Start Failover 및 연관된 설정을 확인합니다.

    show fast_start failover
  6. Broker에서 Observer를 시작합니다(전경에서 실행되지만 백그라운드에서 실행될 수도 있음).

    start observer
  7. Fast-Start Failover가 활성화되어 있고 오류나 경고가 없는지 확인합니다.

    show configuration verbose
  8. 항상 양방향으로 페일오버를 테스트하여 모든 작업이 예상대로 작동하는지 확인합니다. primary database의 shutdown abort를 수행하여 FSFO가 제대로 실행 중인지 확인합니다.

    Observer가 standby database로 failover를 시작해야 합니다. 보호 모드가 maxprotection으로 설정된 경우 FastStartFailoverLaglimit 값에 따라 일부 데이터 손실이 발생할 수 있습니다.