주:

플러그인할 수 있는 데이터베이스 레벨에서 Oracle Data Guard 설정

소개

Oracle Data Guard는 전체 CDB(컨테이너 데이터베이스)가 아닌 개별 PDB(플러거블 데이터베이스)를 보호합니다. 즉, DG PDB(플러그인할 수 있는 데이터베이스당 Oracle Data Guard) 구성에는 기본 CDB 하나와 대기 CDB 하나가 아닌 기본 CDB 두 개가 포함됩니다. 각 CDB에는 PDB가 읽기/쓰기로 열려 있고(원격 CDB의 대상 PDB에 의해 최종적으로 보호됨) 원격 CDB의 해당 PDB를 보호하는 PDB가 마운트되어 있습니다.

두 CDB가 모두 읽기/쓰기 모드인 동안 PDB 레벨에서 CDB1에서 CDB2로, 반대로 Data Guard를 설정하는 방법을 배웁니다. 또한 컨테이너 레벨이나 컨테이너의 나머지 PDB에서 중단 없이 PDB 레벨에서 스위치오버 및 페일오버를 확인할 수 있습니다.

이 사용지침서에서는 CDB 대신 Oracle Data Guard for PDB인 DG PDB를 사용하는 방법에 대해 설명합니다.

주: DG PDB는 Oracle Base Database Service의 OCI(Oracle Cloud Infrastructure) 툴에서 지원되지 않습니다.

기존의 CDB별 아키텍처

이미지

DG PDB(Oracle Data Guard per PDB) 구조

이미지

특징 및 특성

사용 사례

목표

필요 조건

작업 1: CDB1에서 CDB2로 PDB 레벨에서 Data Guard 설정

기본 PDB: CDB1_PDB1 AT CDB1_ASH

대기 PDB: CDB1_PDB1 AT CDB2_SJ

환경:

OCI 지역 애슈번(ASH) 산호세(SJ)
Oracle 기준 데이터베이스 DB 시스템 DB 시스템
Oracle 버전 23.3.0.23 23.3.0.23
호스트 이름 ashvmdb1 sjvmdb2
DB 고유 이름 CDB1_ASH CDB2_SJ
CDB 이름 CDB1 CDB2
기본 PDB CDB1_PDB1, CDB1_PDB2 CDB2_PDB3, CDB2_PDB4
대기 PDB CDB2_PDB3 CDB1_PDB1
VCN/서브넷(기본값) VCN_ASH/공용 서브넷-VCN_ASH VCN_SJ/공용 서브넷-VCN_SJ
프라이빗 IP 10.0.0.192 192.168.0.202

작업 1.1: 데이터베이스 준비

  1. OCI 콘솔을 통해 두 개의 CDB와 두 개의 PDB를 생성합니다. 둘 다 TDE(투명한 데이터 암호화)로 암호화된 Oracle Database 23ai 데이터베이스입니다.

  2. 플래시 로깅을 사용으로 설정하고 두 데이터베이스에서 강제 로깅을 수행합니다.

  3. 로그 아카이브 대상을 FRA(Fast Recovery Area)로 구성합니다.

  4. Oracle Data Guard broker를 활성화합니다.

CDB1 프로비전:

col FORCE_LOGGING for a5
set lines 300 pages 100
select name,open_mode,LOG_MODE,FORCE_LOGGING,FLASHBACK_ON,DB_UNIQUE_NAME from gv$database;

NAME OPEN_MODE LOG_MODE FORCE FLASHBACK_ON DB_UNIQUE_NAME
--------- -------------------- ------------ ----- ------------------ ------------------------------
CDB1 READ WRITE ARCHIVELOG YES NO CDB1_ASH

SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 CDB1_PDB1 READ WRITE NO
4 CDB1_PDB2 READ WRITE NO

SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER DATABASE FLASHBACK ON;
SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both sid='\*';
SQL> ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='+DATA/CDB1_ash/PARAMETERFILE/dr1CDB1.dat' scope=both sid='\*';
SQL> ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='+DATA/CDB1_ash/PARAMETERFILE/dr2CDB1.dat' scope=both sid='\*';
SQL> alter system set standby_file_management = AUTO scope = both;
SQL> ALTER SYSTEM SET dg_broker_start=TRUE scope=both sid='\*';

CDB2 프로비전:

col FORCE_LOGGING for a5
set lines 300 pages 100
select name,open_mode,LOG_MODE,FORCE_LOGGING,FLASHBACK_ON,DB_UNIQUE_NAME from gv$database;

NAME OPEN_MODE LOG_MODE FORCE FLASHBACK_ON DB_UNIQUE_NAME
--------- -------------------- ------------ ----- ------------------ ------------------------------
CDB2 READ WRITE ARCHIVELOG YES NO CDB2_SJ

SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 CDB2_PDB3 READ WRITE NO
5 CDB2_PDB4 READ WRITE NO

SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER DATABASE FLASHBACK ON;
SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both sid='\*';
SQL> ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='+DATA/CDB2_sj/PARAMETERFILE/dr1CDB2.dat' scope=both sid='\*';
SQL> ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='+DATA/CDB2_sj/PARAMETERFILE/dr2CDB2.dat' scope=both sid='\*';
SQL> ALTER SYSTEM SET dg_broker_start=TRUE scope=both sid='\*';
SQL> alter system set standby_file_management = AUTO scope = both;

작업 1.2: 두 CDB 간에 TNS(투명한 네트워크 기판) 연결 설정

  1. 두 데이터베이스 노드 간의 연결을 검증합니다.

    curl -sv telnet://10.0.0.192:1521
    curl -sv telnet://192.168.0.202:1521
    
  2. 소스 및 대상 데이터베이스에 쉽게 연결할 수 있도록 각 호스트에서 네트워크 구성 파일을 구성합니다.

    $vi $ORACLE_HOME/network/admin/tnsnames.ora
    
    CDB1_ASH =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.192)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = CDB1_ASH.sub02090909270.vcnash.oraclevcn.com)
    )
    )
    
    CDB2_SJ =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.202)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = CDB2_SJ.sub02090543360.vcnsj.oraclevcn.com)
    )
    )
    

작업 1.3: 전자 지갑을 사용하여 암호 없는 연결 설정

  1. 각 호스트에서 전자 지갑(wallet)을 포함할 디렉토리를 생성하고 디렉토리에 대해 적절한 보호를 설정하여 전자 지갑의 보안을 설정합니다.

    $ mkdir -p $ORACLE_HOME/dbs/wallets
    $ chmod -R 700 $ORACLE_HOME/dbs/wallets
    
  2. DG PDB 구성을 생성하고 관리하는 데 필요한 인증서가 포함된 전자 지갑을 생성합니다.

    $ mkstore -wrl $ORACLE_HOME/dbs/wallets/dgpdb -create
    Oracle Secret Store Tool Release 23.0.0.0.0 - Production
    Version 23.0.0.0.0
    Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
    
    Enter password:
    Enter password again:
    
    
    [oracle@ashCDB1 ~]$ mkstore -wrl $ORACLE_HOME/dbs/wallets/dgpdb -createCredential CDB1_ash 'sys'
    Oracle Secret Store Tool Release 23.0.0.0.0 - Production
    Version 23.0.0.0.0
    Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
    
    Your secret/Password is missing in the command line
    Enter your secret/Password:
    Re-enter your secret/Password:
    Enter wallet password:
    [oracle@ashCDB1 ~]$ mkstore -wrl $ORACLE_HOME/dbs/wallets/dgpdb -createCredential CDB2_sj 'sys'
    Oracle Secret Store Tool Release 23.0.0.0.0 - Production
    Version 23.0.0.0.0
    Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
    
    Your secret/Password is missing in the command line
    Enter your secret/Password:
    Re-enter your secret/Password:
    Enter wallet password:
    [oracle@ashCDB1 ~]$ mkstore -wrl $ORACLE_HOME/dbs/wallets/dgpdb -listCredential
    Oracle Secret Store Tool Release 23.0.0.0.0 - Production
    Version 23.0.0.0.0
    Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
    
    Enter wallet password:
    List credential (index: connect_string username)
    2: CDB2_sj sys
    1: CDB1_ash sys
    
  3. 두 데이터베이스에서 암호 없는 연결을 검증합니다. 이 자습서에서는 데이터베이스 프로비전 중 동일한 비밀번호를 사용했습니다.

    • 전자 지갑을 사용하도록 sqlnet.ora를 구성합니다.

    • 이제 Oracle이 사용할 sqlnet.ora 구성에 전자 지갑을 추가해야 합니다.

    vi $ORACLE_HOME/network/admin/sqlnet.ora
    
    NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
    WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
            (DIRECTORY = /u01/app/oracle/product/23.0.0.0/dbhome_1/dbs/wallets/dgpdb)
        )
    )
    SQLNET.WALLET_OVERRIDE = TRUE
    
    Stop and restart each database and Listener to configure redo transport to use the wallet. Because there are no static services configured, use OS authentication on each host to do this.
    
    Validate that client connections to the source and target container databases are now possible using the wallets by issuing the following commands on each host:
    
    sqlplus /@CDB1_ash as sysdba
    sqlplus /@CDB2_sj as sysdba
    
    

작업 1.4: 소스 및 대상 데이터베이스 Oracle Data Guard Broker 구성 생성

전자 지갑(wallet)을 사용하여 소스 및 대상 컨테이너 데이터베이스에 연결하고 DGMGRL(Oracle Data Guard Command-Line Interface)을 사용하여 구성을 생성합니다. 이는 일반적인 Oracle Data Guard 구성과 동일합니다. 둘 다 기본 데이터베이스이므로 두 CDB에 대해 이 작업을 수행해야 한다는 점만 다릅니다.

작업 1.5: 구성 간 연결 설정

이 작업은 일반적인 Oracle Data Guard 구성과 다릅니다. 일반적으로 primary database를 추가한 후에 standby database를 추가하지만 이제는 다른 구문을 사용합니다. DGMGRL을 사용하여 소스 컨테이너 데이터베이스에 연결하고 Target Database와 연결을 설정합니다.

[oracle@ashCDB1 ~]$ dgmgrl /@CDB1_ash

DGMGRL> add configuration CDB2_sj connect identifier is CDB2_sj;
DGMGRL> show configuration verbose;
DGMGRL> show configuration verbose CDB2_sj;
DGMGRL> enable configuration all;

작업 1.6: DG PDB에 대한 데이터베이스 준비

  1. 각 컨테이너 데이터베이스에 연결하고 PDB가 아직 열려 있지 않은 경우 PDB를 엽니다.

  2. Oracle Data Guard Broker EDIT CONFIGURATION PREPARE DGPDB 명령은 소스 컨테이너 데이터베이스 및 대상 컨테이너 데이터베이스 구성이 구성되고 활성화되었다고 가정합니다.

  3. 명령 프롬프트가 열리고 각 컨테이너 데이터베이스의 DGPDB_INT 계정에 대한 비밀번호를 입력한 다음 Oracle Data Guard 보호를 제공하거나 PDB의 롤을 변경하는 데 필요한 내부 구조를 구성합니다.

    SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
    SQL> show pdbs
    
    dgmgrl /@CDB1_ash
    DGMGRL> EDIT CONFIGURATION PREPARE DGPDB;
    Enter password for DGPDB_INT account at CDB1_ASH:
    Enter password for DGPDB_INT account at CDB2_SJ:
    Prepared Data Guard for Pluggable Database at CDB2_SJ.
    Prepared Data Guard for Pluggable Database at CDB1_ASH.
    DGMGRL>
    

    주: 단순성을 위해 DB 또는 TDE 비밀번호와 동일한 비밀번호를 사용했지만 비밀번호는 다를 수 있습니다.

작업 1.7: 소스 PDB에 대한 Oracle Data Guard 보호 구성

  1. 컨테이너 데이터베이스에서 대상 PDB를 구성하여 소스 PDB에 대한 Oracle Data Guard PDB 레벨 보호를 구성합니다.

  2. ADD PLUGGABLE DATABASE 명령을 실행하여 대상 컨테이너 데이터베이스에 대상 PDB를 생성합니다.

    기본 PDB: CDB1_PDB1 AT CDB1_ASH

    대기 PDB: CDB1_PDB1 AT CDB2_SJ

    대상 컨테이너:

    SQL> show pdbs
    
    CON_ID CON_NAME OPEN MODE RESTRICTED
    ---------- ------------------------------ ---------- ----------
    2 PDB$SEED READ ONLY NO
    4 CDB2_PDB3 READ WRITE NO
    5 CDB2_PDB4 READ WRITE NO
    
    
    dgmgrl /@CDB1_ash
    DGMGRL> ADD PLUGGABLE DATABASE CDB1_PDB1 AT CDB2_sj SOURCE IS CDB1_PDB1 AT CDB1_ash PDBFILENAMECONVERT IS "'+DATA/CDB1_ash','+DATA/CDB2_sj'" 'keystore IDENTIFIED BY "WelC0me_123#"';
    Pluggable Database "CDB1_PDB1" added
    DGMGRL>
    
    SQL> show pdbs
    CON_ID CON_NAME OPEN MODE RESTRICTED
    ---------- ------------------------------ ---------- ----------
    2 PDB$SEED READ ONLY NO
    3 CDB1_PDB1 MOUNTED
    4 CDB2_PDB3 READ WRITE NO
    5 CDB2_PDB4 READ WRITE NO
    

작업 1.8: 대상에 데이터 파일 복사

소스 PDB와 연관된 모든 파일을 대상 PDB 위치로 복사하여 대상 PDB를 인스턴스화합니다.

  1. 소스 PDB에서 파일 목록을 식별합니다.

    SQL> select FILE#,NAME from v$datafile where con_id=3;
    
    FILE# NAME                                                                                                     CON_ID
    ---------- ---------------------------------------------------------------------------------------------------- ----------
    8 +DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/system.273.1160475741                          3
    9 +DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/sysaux.270.1160475747                          3
    10 +DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/undotbs1.271.1160475753                        3
    12 +DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/users.274.1160475857                           3
    
  2. 대상 컨테이너에 PDB 데이터 파일을 복사합니다.

    [oracle@sjCDB2 ~]$ rman target sys/WelC0me_123#@CDB1_ash auxiliary sys/WelC0me_123#@CDB2_sj
    
    Recovery Manager: Release 23.0.0.0.0 - Production on Fri Feb 9 12:41:14 2024
    Version 23.3.0.23.09
    
    Copyright (c) 1982, 2023, Oracle and/or its affiliates.  All rights reserved.
    
    connected to target database: CDB1 (DBID=3764657260)
    connected to auxiliary database: CDB2 (DBID=3648579145)
    
    RMAN> run {
    allocate channel ch1 type disk;
    backup as copy reuse datafile 8,9,10,12 auxiliary format NEW;
    }
    run {
    2> allocate channel ch1 type disk;
    3> backup as copy reuse datafile 8,9,10,12 auxiliary format NEW;
    4> }
    using target database control file instead of recovery catalog
    allocated channel: ch1
    channel ch1: SID=38 device type=DISK
    
    Starting backup at 09-FEB-24
    channel ch1: starting datafile copy
    input datafile file number=00009 name=+DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/sysaux.270.1160475747
    output file name=+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/sysaux.271.1160484127 tag=TAG20240209T124201
    channel ch1: datafile copy complete, elapsed time: 00:00:08
    channel ch1: starting datafile copy
    input datafile file number=00008 name=+DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/system.273.1160475741
    output file name=+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/system.272.1160484135 tag=TAG20240209T124201
    channel ch1: datafile copy complete, elapsed time: 00:00:08
    channel ch1: starting datafile copy
    input datafile file number=00010 name=+DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/undotbs1.271.1160475753
    output file name=+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/undotbs1.274.1160484145 tag=TAG20240209T124201
    channel ch1: datafile copy complete, elapsed time: 00:00:04
    channel ch1: starting datafile copy
    input datafile file number=00012 name=+DATA/CDB1_ASH/10F14C2387F73F42E063C000000A77F3/DATAFILE/users.274.1160475857
    output file name=+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/users.275.1160484149 tag=TAG20240209T124201
    channel ch1: datafile copy complete, elapsed time: 00:00:04
    Finished backup at 09-FEB-24
    released channel: ch1
    
  3. 대상 PDB에서 데이터 파일을 확인하십시오.

    SQL> show pdbs
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
            2 PDB$SEED                      READ ONLY  NO
            3 CDB1_PDB1                     MOUNTED
            4 CDB2_PDB3                     READ WRITE NO
            5 CDB2_PDB4                     READ WRITE NO
    SQL> alter session set container=CDB1_PDB1;
    Session altered.
    
    SQL>  select name from v$datafile;
    
    NAME
    --------------------------------------------------------------------------------
    +DATA/MUST_RENAME_THIS_DATAFILE_8.4294967295.4294967295
    +DATA/MUST_RENAME_THIS_DATAFILE_9.4294967295.4294967295
    +DATA/MUST_RENAME_THIS_DATAFILE_10.4294967295.4294967295
    +DATA/MUST_RENAME_THIS_DATAFILE_12.4294967295.4294967295
    
  4. 데이터 파일 이름 바꾸기. 대상 파일 이름은 RMAN 출력 로그에서 가져올 수 있습니다.

    alter database rename file '+DATA/MUST_RENAME_THIS_DATAFILE_8.4294967295.4294967295' to '+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/system.272.1160484135';
    alter database rename file '+DATA/MUST_RENAME_THIS_DATAFILE_9.4294967295.4294967295' to '+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/sysaux.271.1160484127';
    alter database rename file '+DATA/MUST_RENAME_THIS_DATAFILE_10.4294967295.4294967295' to '+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/undotbs1.274.1160484145';
    alter database rename file '+DATA/MUST_RENAME_THIS_DATAFILE_12.4294967295.4294967295' to '+DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/users.275.1160484149';
    
    SQL>  select name from v$datafile;
    
    NAME
    ---------------------------------------------------------------------------------------
    +DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/system.272.1160484135
    +DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/sysaux.271.1160484127
    +DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/undotbs1.274.1160484145
    +DATA/CDB2_SJ/10F14C2387F73F42E063C000000A77F3/DATAFILE/users.275.1160484149
    

작업 1.9: TDE 키 가져오기

CDB와 PDB 모두에 대한 전자 지갑 키를 복사해야 합니다. 소스 CDB 키를 대상 CDB에 복사하고 소스 PDB 키를 Data Guard를 설정하는 대상 PDB로 복사합니다.

  1. 소스 컨테이너 또는 PDB에서 전자 지갑을 확인하십시오.

    SET LINESIZE 200
    COLUMN wrl_parameter FORMAT A39
    select * from v$encryption_wallet;
    
  2. 소스 데이터베이스에서 암호화 키(CDB 및 PDB)를 익스포트합니다.

    SQL> ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET "export_secret" TO '/tmp/CDB1_key' FORCE KEYSTORE IDENTIFIED BY "WelC0me_123#";
    SQL> alter session set container=CDB1_PDB1;
    SQL> ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET "export_secret" TO '/tmp/CDB1_PDB1_key' FORCE KEYSTORE IDENTIFIED BY "WelC0me_123#";
    
  3. 대상 서버에서 암호화 키를 복사하여 대상 데이터베이스(각각 CDB 및 PDB)로 임포트합니다.

    [opc@sjCDB2 tmp]$ chmod 777 CDB1_key CDB1_PDB1_key
    SQL> ADMINISTER KEY MANAGEMENT IMPORT KEYS WITH SECRET "export_secret" FROM '/tmp/CDB1_key' force keystore IDENTIFIED BY "WelC0me_123#" WITH BACKUP;
    SQL> alter session set container=CDB1_PDB1;
    SQL> ADMINISTER KEY MANAGEMENT IMPORT KEYS WITH SECRET "export_secret" FROM '/tmp/CDB1_PDB1_key' force keystore IDENTIFIED BY "WelC0me_123#" WITH BACKUP;
    
  4. 임포트된 키를 검증합니다.

    select * from v$encryption_keys order by creation_time;
    

작업 1.10: PDB에 SRL(대기 리두 로그) 추가 및 검증

외부 소스 리두를 수신할 SRL을 대기 PDB에서 생성합니다. 이 작업은 전체 CDB에 대해 한 번만 필요하며 PDB당 다른 SRL 세트가 필요하지 않습니다.

sqlplus /@CDB2_sj as sysdba

SQL> alter session set container=CDB1_PDB1;
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
--------- ------------------------------ ---------- ----------
4 CDB1_PDB1 MOUNTED

SQL> select group#,thread#,bytes from v$standby_log;
no rows selected

SQL> ALTER DATABASE ADD STANDBY LOGFILE;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE;
Database altered.

SQL> select group#,thread#,bytes from v$standby_log;
GROUP# THREAD# BYTES
--------- ---------- ----------
1 0 104857600
2 0 104857600
3 0 104857600

작업 1.11: Standby 상태를 APPLY-ON로 변경

모든 데이터베이스에서 DGMGRL에 연결하고 소스 PDB에서 대상 PDB로 리두 전송을 시작합니다.

DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB2_sj SET STATE='APPLY-OFF';
DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB2_sj SET STATE='APPLY-ON';
DGMGRL> enable configuration all;

Perform Log switch on source database:
--------------------------------------
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

DGMGRL> show pluggable database CDB1_PDB1 at CDB2_sj;
Pluggable database - CDB1_PDB1 at CDB2_sj
Data Guard Role: Physical Standby
Con_ID: 3
Source: con_id 3 at CDB1_ASH
Transport Lag: 32 seconds (computed 21 seconds ago)
Apply Lag: 32 seconds (computed 21 seconds ago)
Intended State: APPLY-ON
Apply State: Running
Apply Instance: CDB2
Average Apply Rate: 1592 KByte/s
Real Time Query: OFF
Pluggable Database Status:
SUCCESS


DGMGRL> SHOW ALL PLUGGABLE DATABASE AT CDB1_ASH;
PDB Name PDB ID Data Guard Role Data Guard Partner
CDB1_PDB1 3 Primary CDB1_PDB1 (con_id 3) at CDB2_sj
CDB1_PDB2 4 None None

DGMGRL> SHOW ALL PLUGGABLE DATABASE AT CDB2_sj;
PDB Name PDB ID Data Guard Role Data Guard Partner
CDB1_PDB1 3 Physical Standby CDB1_PDB1 (con_id 3) at CDB1_ash
CDB2_PDB3 4 None None
CDB2_PDB4 5 None None

DGMGRL> VALIDATE PLUGGABLE DATABASE CDB1_PDB1 at CDB2_sj;
Ready for Switchover: NO
Data Guard Role: Physical Standby
Apply State: Waiting for Redo Data
Standby Redo Log Files: 3
Source: CDB1_PDB1 (con_id 3) at CDB1_ASH


sqlplus /@CDB2_sj as sysdba

SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
--------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 CDB1_PDB1 MOUNTED
4 CDB2_PDB3 READ WRITE NO
5 CDB2_PDB4 READ WRITE NO

작업 2: (선택사항) CDB2에서 CDB1로 PDB 레벨에서 Oracle Data Guard 설정

Oracle Data Guard를 CDB2에서 CDB1(양방향)으로 구성하려는 경우 이 작업은 선택사항입니다.

기본 PDB: CDB2_PDB3 AT CDB2_SJ

대기 PDB: CDB2_PDB3 AT CDB1_ASH

주: 소스 및 대상 CDB 또는 PDB를 변경하고 작업 1.7을 1.11로 반복하기만 하면 됩니다.

  1. 소스 PDB에 대한 Oracle Data Guard 보호를 구성합니다.

    dgmgrl /@CDB2_SJ
    DGMGRL> ADD PLUGGABLE DATABASE CDB2_PDB3 AT CDB1_ASH SOURCE IS CDB2_PDB3 AT CDB2_sj PDBFILENAMECONVERT IS "'+DATA/CDB2_sj','+DATA/CDB1_ash'" 'keystore IDENTIFIED BY "WelC0me_123#"';
    
  2. 대상에 데이터 파일을 복사합니다.

    [oracle@sjCDB2 ~\]$ rman target sys/WelC0me_123#@CDB2_sj auxiliary sys/WelC0me_123#@CDB1_ash
    
  3. TDE 키를 가져옵니다.

    Export / Import CDB/PDB key from CDB2 to CDB1
    
  4. DG PDB에 대한 대기 리두 로그를 추가하고 검증합니다.

  5. standby 상태를 APPLY-ON로 변경합니다.

    DGMGRL> SHOW ALL PLUGGABLE DATABASE AT CDB1_ash;
    PDB Name PDB ID Data Guard Role Data Guard Partner
    CDB1_PDB1 3 Primary CDB1_PDB1 (con_id 3) at CDB2_sj
    VMDB1_PDB2 4 None None
    VMDB2_PDB3 6 Physical Standby VMDB2_PDB3 (con_id 4) at CDB2_sj
    
    DGMGRL> SHOW ALL PLUGGABLE DATABASE AT CDB2_sj;
    PDB Name PDB ID Data Guard Role Data Guard Partner
    CDB1_PDB1 3 Physical Standby CDB1_PDB1 (con_id 3) at CDB1_ash
    VMDB2_PDB3 4 Primary VMDB2_PDB3 (con_id 6) at CDB1_ash
    VMDB2_PDB4 5 None None
    DGMGRL>
    

작업 3: 플러그인할 수 있는 데이터베이스 스위치오버

Oracle Data Guard Broker DGMGRL을 사용하여 소스 PDB 및 지정된 대상 PDB의 롤을 취소합니다. 컨테이너 레벨에 영향을 주지 않습니다.

  1. 전환을 수행합니다.

    [oracle@ashCDB1 ~]$ dgmgrl /@CDB1_ash
    DGMGRL> VALIDATE PLUGGABLE DATABASE CDB1_PDB1 at CDB2_sj;
    
    Ready for Switchover:    NO
    
    Data Guard Role:         Physical Standby
    Apply State:             Not Running
    Standby Redo Log Files:  3
    Source:                  CDB1_PDB1 (con_id 3) at CDB1_ASH
    
    DGMGRL> SWITCHOVER TO PLUGGABLE DATABASE CDB1_PDB1 at CDB2_sj;
    Performing switchover NOW, please wait...
    Switchover succeeded, new primary is "CDB1_pdb1"
    DGMGRL>
    
  2. 새 PDB를 열어 모드를 엽니다.

    sqlplus /@CDB2_sj
    SQL> alter pluggable database CDB1_PDB1 open;
    Pluggable database altered.
    
    SQL> show pdbs
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
            2 PDB$SEED                      READ ONLY  NO
            3 CDB1_PDB1                     READ WRITE NO
            4 CDB2_PDB3                     READ WRITE NO
            5 CDB2_PDB4                     READ WRITE NO
    
    DGMGRL>  show pluggable database CDB1_PDB1 at CDB2_SJ;
    Pluggable database - CDB1_PDB1 at CDB2_sj
    
    Data Guard Role:     Primary
    Con_ID:              3
    Active Target:       con_id 3 at CDB1_ASH
    
    Pluggable Database Status:
    SUCCESS
    
    DGMGRL> show pluggable database CDB1_PDB1 at CDB1_ASH;
    
    Pluggable database - CDB1_PDB1 at CDB1_ash
    
    Data Guard Role:     Physical Standby
    Con_ID:              3
    Source:              con_id 3 at CDB2_SJ
    Transport Lag:       1 minute (computed 59 seconds ago)
    Apply Lag:           1 minute 35 seconds (computed 59 seconds ago)
    Intended State:      APPLY-ON
    Apply State:         Not Running
    
    Pluggable Database Status:
    ORA-16766: Redo Apply is stopped.
    ORA-28374: typed master key not found in wallet
    
  3. 암호화 키(CDB만 해당)를 새 소스에서 새 대상으로 익스포트합니다.

    SQL> ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET "export_secret" TO '/tmp/CDB2_CDB_key' FORCE KEYSTORE IDENTIFIED BY "WelC0me_123#";
    keystore altered.
    
    Import them into the target database
    [opc@sjCDB2 tmp]$ chmod 777 mydbkey mydbkeypdb1
    
    SQL> ADMINISTER KEY MANAGEMENT IMPORT KEYS WITH SECRET "export_secret" FROM '/tmp/CDB2_CDB_key' force keystore IDENTIFIED BY "WelC0me_123#" WITH BACKUP;
    keystore altered.
    
  4. 새 standby 리두로그

    DGMGRL> EDIT PLUGGABLE DATABASE CDB2_PDB2 AT CDB2_sj SET STATE='APPLY-OFF';
    Succeeded.
    
    sqlplus /@CDB1_ash
    
    SQL> show pdbs
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    
            2 PDB$SEED                      READ ONLY  NO
            3 CDB1_PDB1                     MOUNT NO
            4 CDB1_PDB2                     READ WRITE NO
    
    SQL> alter session set container=CDB1_PDB1;
    Session altered.
    
    SQL> select group#,thread#,bytes from v$standby_log;
    no rows selected
    
    SQL> ALTER DATABASE ADD STANDBY LOGFILE;
    Database altered.
    SQL> /
    Database altered.
    SQL> /
    Database altered.
    
    SQL> select group#,thread#,bytes from v$standby_log;
    GROUP# THREAD# BYTES
    
            1          0  104857600
            2          0  104857600
            3          0  104857600
    
    DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB1_ash SET STATE='APPLY-OFF';
    Succeeded.
    DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB1_ash SET STATE='APPLY-ON';
    Succeeded.
    DGMGRL>
    

작업 4: 플러그인할 수 있는 데이터베이스 복구

페일오버 중 지정된 대상 PDB가 소스 롤로 변경됩니다. 원본 소스 컨테이너 데이터베이스와 다른 PDB가 모두 올바르게 작동하는 경우 새 소스 PDB의 리두를 적용하려면 먼저 PDB를 대상 PDB로 복원해야 합니다.

$dgmgrl /@CDB1_ash

DGMGRL> show all pluggable database at CDB1_ash;
PDB Name PDB ID Data Guard Role Data Guard Partner
CDB1_PDB1 3 Primary CDB1_PDB1 (con_id 3) at CDB2_sj
VMDB1_PDB2 4 None None
VMDB2_PDB3 6 Physical Standby VMDB2_PDB3 (con_id 4) at CDB2_sj

DGMGRL> FAILOVER TO PLUGGABLE DATABASE CDB1_PDB1 at CDB2_sj;
Performing failover NOW, please wait...
Failover succeeded, new primary is "CDB1_PDB1".
DGMGRL>

DGMGRL> show pluggable database CDB1_PDB1 at CDB2_sj
Pluggable database - CDB1_PDB1 at CDB2_sj
Data Guard Role: Primary
Con_ID: 3
Active Target: con_id 3 at CDB1_ASH needs to be reinstated
Pluggable Database Status:

DGM-17450: not protected

DGMGRL> show pluggable database CDB1_PDB1 at CDB1_ash;
Pluggable database - CDB1_PDB1 at CDB1_ash
Data Guard Role: Physical Standby
Con_ID: 3
Source: (unknown)
Pluggable Database Status:

ORA-16661: The standby database must be reinstated.

DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB1_ash SET STATE='APPLY-OFF';
Succeeded.
DGMGRL> EDIT PLUGGABLE DATABASE CDB1_PDB1 AT CDB1_ash SET STATE='APPLY-ON';
Succeeded.

DGMGRL> show pluggable database CDB1_PDB1 at CDB1_ash;
Pluggable database - CDB1_PDB1 at CDB1_ash
Data Guard Role: Physical Standby
Con_ID: 3
Source: con_id 3 at CDB2_SJ
Transport Lag: 5 minutes 48 seconds (computed 21 seconds ago)
Apply Lag: (unknown)
Intended State: APPLY-ON
Apply State: Running
Apply Instance: VMDB1
Average Apply Rate: (unknown)
Real Time Query: OFF
Pluggable Database Status:
SUCCESS

작업 5: DG PDB 구성 제거

다음 명령을 실행하여 구성을 제거합니다.

[oracle@ashCDB1 ~\]$ dgmgrl /@CDB1_ash

DGMGRL> REMOVE PLUGGABLE DATABASE CDB2_PDB3 AT CDB1_ASH REMOVE DATAFILES;
Pluggable Database 'CDB1_PDB1' removed.

DGMGRL> SHOW PLUGGABLE DATABASE CDB2_PDB3 AT CDB1_ASH;
No pluggable databases at database 'CDB2_SJ'

DGMGRL> REMOVE CONFIGURATION CDB1_ASH;
Succeeded.

DGMGRL> SHOW CONFIGURATION;
Configuration - Boston
Protection Mode: MaxPerformance
Members:
CDB1_ASH - Primary database
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 25 seconds ago)

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.