注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的值。
在可插入数据库级别设置 Oracle Data Guard
简介
Oracle Data Guard 保护单个可插入数据库 (PDB),而不是整个容器数据库 (CDB)。这意味着每个可插入数据库 (DG PDB) 配置的 Oracle Data Guard 将有两个主 CDB,而不是一个主 CDB 和一个备用 CDB。每个 CDB 将包含打开的 PDB(最终由远程 CDB 上的目标 PDB 保护)和已装载的 PDB,以保护远程 CDB 中的相应 PDB。
我们将学习如何在 PDB 级别从 CDB1 设置为 CDB2 并反过来在两个 CDB 均处于读写模式时设置数据卫士。此外,我们将在 PDB 级别看到切换和故障转移,而不会在容器级别或容器中其余 PDB 中出现任何中断。
本教程介绍如何使用 DG PDB,即适用于 PDB 的 Oracle Data Guard,而不是 CDB。
注:Oracle Base Database Service 上的 Oracle Cloud Infrastructure (OCI) 工具不支持 DG PDB。
传统的基于 CDB 的体系结构
- 一个主 CDB 和一个备用 CDB。
- 只有一个 CDB 可以处于读写模式。
- 灾难恢复 (Disaster Recovery,DR) 仅可在 CDB 级别实现。
- 只能在 CDB 级别进行切换或故障转移。
每个 PDB 的 Oracle Data Guard (DG PDB) 体系结构
- 两个主 CDB。
- 两者都是开放式读写,不同的 Oracle Database ID (DBID)。
- 可以在 PDB 级别进行切换和故障转移。
- 无需切换/故障转移完整的 CDB。
特征和特征
- 在两个主 CDB 之间复制 PDB。
- 使用实时应用在 PDB 级别保护。
- 异步重做传输。
- 如果源 CDB 仍可用,则零数据丢失 PDB 故障转移。
- 从源自动提取间隙。
- 对目标 PDB 进行实时查询。
- 无需故障转移整个容器数据库。
- 使用中介在 PDB 级别转换角色。
用例
-
计划内维护和工作负载重新平衡:
- 通过在同一时间切换一个 PDB 耗尽一个 CDB 进行维护。
- 通过切换单个 PDB 重新平衡工作量。
-
病假 PDB 保护:
- 在不影响整个 CDB 的情况下对处于失败状态的单个 PDB 进行故障转移。
-
单个 PDB 灾难恢复测试:
- 定期执行灾难恢复测试,一次测试一个应用程序。
目标
- 分步 DG PDB 配置、切换和故障转移:在 PDB 级别设置 Oracle Data Guard,同时主数据库和辅助数据库都处于读写模式。
先决条件
-
在阿什本和圣何塞区域创建虚拟云网络 (VCN)。
-
在阿什本和圣何塞 VCN 之间建立远程对等连接 (Remote Peering Connection,RPC)。
-
确保具有其他与 Oracle Data Guard 相关的先决条件。
任务 1:在 PDB 级别设置从 CDB1 到 CDB2 的 Data Guard
主 PDB:CDB1_PDB1 AT CDB1_ASH
备用 PDB:CDB1_PDB1 AT CDB2_SJ
环境:
OCI 区域 | 阿什本 (ASH) | 圣何塞 (SJ) |
---|---|---|
Oracle Base Database | 数据库系统 | 数据库系统 |
Oracle 版本 | 23.3.0.23 | 23.3.0.23 |
主机名 | ashvmdb1 | sjvmdb2 |
数据库的唯一名称 | CDB1_ASH | CDB2_SJ |
CDB 名称 | CDB1 | CDB2 |
主 PDB | CDB1_PDB1, CDB1_PDB2 | CDB2_PDB3, CDB2_PDB4 |
备用 PDB | CDB2_PDB3 | CDB1_PDB1 |
VCN/子网 (DEFAULT) | VCN_ASH/公共子网 -VCN_ASH | VCN_SJ/公共子网 -VCN_SJ |
专用 IP | 10.0.0.192 | 192.168.0.202 |
任务 1.1:准备数据库
-
通过 OCI 控制台创建两个 CDB 和两个 PDB,两者都是加密的 Oracle Database 23ai 数据库。
-
在两个数据库上启用闪存日志记录并强制登录。
-
将日志归档目标配置到快速恢复区 (FRA)。
-
启用 Oracle Data Guard 中介。
预配 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) 连接
-
验证两个数据库节点之间的连接。
curl -sv telnet://10.0.0.192:1521 curl -sv telnet://192.168.0.202:1521
-
在每台主机上配置网络配置文件,以便于连接到源数据库和目标数据库。
$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:使用 Wallet 建立无密码连接
-
在每个主机上,创建一个目录以包含 wallet,并通过在目录上设置适当的保护来保护 wallet。
$ mkdir -p $ORACLE_HOME/dbs/wallets $ chmod -R 700 $ORACLE_HOME/dbs/wallets
-
创建包含创建和管理 DG PDB 配置所需的身份证明的 wallet。
$ 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
-
验证两个数据库上的无密码连接。在本教程中,我们在数据库预配期间使用了相同的密码。
-
配置
sqlnet.ora
以使用 wallet。 -
现在,我们必须在 Oracle 将使用的
sqlnet.ora
配置上添加 wallet。
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 中介配置
使用 wallet 连接到源容器数据库和目标容器数据库,并使用 Oracle Data Guard 命令行界面 (Command-Line Interface,DGMGRL) 创建配置。这与普通 Oracle Data Guard 配置相同。唯一的区别是,我们必须对两个 CDB 执行此操作,因为两个 CDB 都属于主数据库。
-
主站点:
[oracle@ashCDB1 ~]$ dgmgrl /@CDB1_ash** DGMGRL> CREATE CONFIGURATION "CDB1_ash" AS PRIMARY DATABASE IS "CDB1_ash**" CONNECT IDENTIFIER IS "CDB1_ash"; DGMGRL> show configuration verbose;**
-
辅助站点:
[oracle@sjCDB2 admin]$ dgmgrl /@CDB2_sj DGMGRL> CREATE CONFIGURATION "CDB2_sj" AS PRIMARY DATABASE IS "CDB2_sj" CONNECT IDENTIFIER IS "CDB2_sj"; DGMGRL> show configuration verbose;
任务 1.5:在配置之间建立连接
此任务与普通 Oracle Data Guard 配置不同。通常,添加主数据库后,会添加备用数据库,但现在我们将使用不同的语法。使用 DGMGRL 连接到源容器数据库并与目标数据库建立连接。
[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 准备数据库
-
连接到每个容器数据库,如果 PDB 尚未打开,则将其打开。
-
Oracle Data Guard 中介
EDIT CONFIGURATION PREPARE DGPDB
命令假定源容器数据库和目标容器数据库配置已配置并已启用。 -
命令提示符将打开,为每个容器数据库输入
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 保护
-
通过在容器数据库中配置目标 PDB,为源 PDB 配置 Oracle Data Guard PDB 级别保护。
-
运行
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。
-
确定源 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
-
在目标容器上复制 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
-
检查目标 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
-
重命名数据文件。可以从 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 的 wallet 密钥。将源 CDB 密钥复制到要为其设置 Data Guard 的目标 CDB 和源 PDB 密钥中。
-
在源容器或 PDB 上检查 wallet。
SET LINESIZE 200 COLUMN wrl_parameter FORMAT A39 select * from v$encryption_wallet;
-
从源数据库导出加密密钥(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#";
-
在目标服务器上复制加密密钥并将其导入目标数据库(分别为 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;
-
验证导入的密钥。
select * from v$encryption_keys order by creation_time;
任务 1.10:将备用重做日志 (Standby Redo Logs,SRL) 添加到 PDB 并验证
从备用 PDB 创建 SRL 以接收外部源重做。此操作对于整个 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:将备用数据库的状态更改为 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:(可选)在 PDB 级别设置 Oracle Data Guard,从 CDB2 到 CDB1
如果希望将 Oracle Data Guard 从 CDB2 配置为 CDB1 以及双向配置,则这是一个可选任务。
主 PDB:CDB2_PDB3 AT CDB2_SJ
备用 PDB:CDB2_PDB3 AT CDB1_ASH
注:我们只需更改源和目标 CDB 或 PDB,然后重复任务 1.7 至 1.11。
-
为源 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#"';
-
将数据文件复制到目标。
[oracle@sjCDB2 ~\]$ rman target sys/WelC0me_123#@CDB2_sj auxiliary sys/WelC0me_123#@CDB1_ash
-
带上 TDE 密钥。
Export / Import CDB/PDB key from CDB2 to CDB1
-
为 DG PDB 添加备用重做日志并进行验证。
-
将备用数据库的状态更改为
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 中介 DGMGRL 反转源 PDB 及其指定目标 PDB 的角色。在容器级别没有影响。
-
执行切换。
[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>
-
打开新 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
-
将加密密钥(仅限 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.
-
新的备用重做日志。
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)
相关链接
确认
- 作者 - Dharmesh Patel(Oracle 北美云服务首席云架构师 - NACIE)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Set up an Oracle Data Guard at the Pluggable Database Level
F99055-02
June 2024