Introduction

One of the long requested features in case of Multitenant was the possibility to create and manage a data guard configuration on pdb level. Now with the Release Update 21.6 this was finaly implemented and the name of the new feature ist called DGPDB. If you want to know more about the data guard on pdb level and how it works, i recommend you the follwing pages:

https://blogs.oracle.com/maa/post/dgpdb-available-today
https://docs.oracle.com/en/database/oracle/oracle-database/21/dgbkr/managing-oracle-data-guard-broker-dgpdb-configuration-members.html#GUID-FC91CF75-0EF8-43C2-80C4-55B12C029E30

With the current long term support release 19c it’s only possible to create data guard configurations on cdb level and one cdb acts as primary database and the other as standby database. This has some disadvantages if you have a high consolidation level with a lot of pdb’s in one cdb:

  1. Switchovers / Failovers can take a long time
  2. Ressource allocation of the nodes is not very flexible because all active pdb’s must be on the same site

If you want to use DGPDB you have to be aware, that are currently a lot of restrictions in case of data guard functionality as you can see on this picture.

Setup Data Guard on PDB Level

So now lets start with the technical part and how to setup a data guard on pdb level. The main difference is, that now we would not have a primary and a standby cdb for the configuration, but instead two primary cdb’s. That sounds logical, because both containers will host primary and standby pdbs’s. Additionaly i created one pdb in cdbs1 and one pdb in cdbs2.

Prerequisites
As prerequisites for the setup i deployed 2 vm’s and every vm has one cdb in Version 21.8. It is already available with 21.6 but i decided to go to the newest RU

Site 1Site 2
Hostnameora01ora02
CDB Name cdbs1cdbs2
Oracle VersionOracle 21.8Oracle 21.8
Storage local File Systemlocal File System
OMF YES YES
PDBpdbs1pdbs2

Connection between both sides
Like in a normal Data Guard Setup we need a TNS Setup, that we can reach both cdb from both sides. My Here is my tnsnames.ora on both sides

-- tnsnames.ora on ora01 / ora02
cdbs1.world =
 (DESCRIPTION =
   (ADDRESS= (PROTOCOL = TCP)(HOST = ora01 )(PORT = 1521))
   (CONNECT_DATA =
     (SERVICE_NAME = cdbs1)
   )
 )

cdbs2.world =
 (DESCRIPTION =
   (ADDRESS= (PROTOCOL = TCP)(HOST = ora02 )(PORT = 1521))
   (CONNECT_DATA =
     (SERVICE_NAME = cdbs2)
   )
 )

-- Connect Verfification from ora01
[email protected]:/home/oracle/ [cdbs1] tnsping cdbs1.world

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 07-NOV-2022 01:10:58

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

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


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS= (PROTOCOL = TCP)(HOST = ora01)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = cdbs1)))
OK (0 msec)
[email protected]:/home/oracle/ [cdbs1] tnsping cdbs2.world

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 07-NOV-2022 01:11:04

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

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


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS= (PROTOCOL = TCP)(HOST = ora02)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = cdbs2)))
OK (10 msec)

-- Connect Verfification from ora02

[email protected]:/home/oracle/ [cdbs2] tnsping cdbs1.world

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 07-NOV-2022 01:11:25

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

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


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS= (PROTOCOL = TCP)(HOST = ora01)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = cdbs1)))
OK (10 msec)
[email protected]:/home/oracle/ [cdbs2] tnsping cdbs2.world

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 07-NOV-2022 01:11:29

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

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


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS= (PROTOCOL = TCP)(HOST = ora02)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = cdbs2)))
OK (0 msec)

Data Guard Configurations
We need some minimal configuration to prepare the databases for the broker configuration like:
– dg_broker_start=TRUE (activate the broker)
– dg_broker_config_file (location of the broker config file)
– standby_file_management=AUTO (automatic file transfer from one side to other)
– Standby Redo Logs on both sides

Configurations applied on ORA01

[[email protected] ~]$ sqlplus / as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production on Sun Nov 02 14:31:44 2022
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
SQL>
SQL> alter system set dg_broker_config_file1 = 'u01/app/oracle/admin/cdbs1/pfile/dr1cdbs1.dat'  scope = both;
System altered.
SQL> alter system set dg_broker_config_file1 = 'u01/app/oracle/admin/cdbs1/pfile/dr2cdbs1.dat'  scope = both;
System altered.
SQL> alter system set dg_broker_start=TRUE  scope = both;
System altered.
SQL>
SQL> show parameter standby_file_management
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
standby_file_management              string      MANUAL
SQL> alter system set standby_file_management = AUTO scope = both;
System altered.
SQL>
SQL> select group#,thread#,bytes from v$standby_log;
no rows selected
SQL> select group#,thread#,bytes from v$log;
    GROUP#    THREAD#      BYTES
---------- ---------- ----------
         1          1  209715200
         2          1  209715200
         3          2  209715200
         4          2  209715200
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.

Configurations applied on ORA02

SQL> alter system set dg_broker_config_file1 = 'u01/app/oracle/admin/cdbs2/pfile/dr1cdbs2.dat'  scope = both;
System altered.
SQL> alter system set dg_broker_config_file1 = 'u01/app/oracle/admin/cdbs2/pfile/dr2cdbs2.dat'  scope = both;
System altered.
SQL> alter system set dg_broker_start=TRUE  scope = both;
System altered.
SQL>
SQL> show parameter standby_file_management
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
standby_file_management              string      MANUAL
SQL> alter system set standby_file_management = AUTO scope = both;
System altered.
SQL>
SQL> select group#,thread#,bytes from v$standby_log;
no rows selected
SQL> select group#,thread#,bytes from v$log;
    GROUP#    THREAD#      BYTES
---------- ---------- ----------
         1          1  209715200
         2          1  209715200
         3          2  209715200
         4          2  209715200
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE size 209715200;
Database altered.

Setup Remote Connection
To register the databases to the broker configuration you need password less login as sysdba /sysdg from one side to the other. Here i get some trouble because the normal setup over the oracle password file did not work on my side. I always get “invalid username / password ” message if i tried add the database to the broker. So currently i don’t now if that is a bug or if that don’t work for dgpdb. In my case i configured a wallet that holds the connection information and this works in that case. Please be aware, that the credential inside the walltet must be exactly like the name of your tns connection entry! I configure the wallte on ORA01 and afterwards copy the wallet to ORA02

[[email protected] ~]$ mkdir -p /u01/app/oracle/admin/cdbs1/dg_wallet_cdbs1
[[email protected] ~]$ mkstore -wrl /u01/app/oracle/dbs/dg_wallet_cdbs1 -createALO
Oracle Secret Store Tool Release 21.0.0.0.0 - Production
Version 21.0.0.0.0
Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
[[email protected] ~]$ mkstore -wrl /u01/app/oracle/dbs/dg_wallet_cdbs1 -createCredential cdbs1.world sys Welcome_01
Oracle Secret Store Tool Release 21.0.0.0.0 - Production
Version 21.0.0.0.0
Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
[[email protected] ~]$ mkstore -wrl /u01/app/oracle/dbs/dg_wallet_cdbs1 -createCredential cdbs2.world sys Welcome_01
Oracle Secret Store Tool Release 21.0.0.0.0 - Production
Version 21.0.0.0.0
Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
[[email protected] ~]$ mkstore -wrl /u01/app/oracle/dbs/dg_wallet_cdbs1 -listCredential
Oracle Secret Store Tool Release 21.0.0.0.0 - Production
Version 21.0.0.0.0
Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.

List credential (index: connect_string username)
2: cdbs2.world sys
1: cdbs1.world sys

Configure SQLNET.ora to use the wallet
Now we have to add the wallet on the sqlnet.ora configuration that oracle will use it

[email protected]:/u01/app/oracle/network/admin/ [cdbs1] cat sqlnet.ora
NAMES.DIRECTORY_PATH=(tnsnames,ezconnect)

SQLNET.WALLET_OVERRIDE = true
WALLET_LOCATION =
(
   SOURCE =
      (METHOD = FILE)
      (METHOD_DATA =
         (DIRECTORY = /u01/app/oracle/admin/cdbs1/dg_wallet_cdbs1)
      )
)

Test Wallet
now we can check if the connection over the wallet is working

[email protected]:/u01/app/oracle/network/admin/ [cdbs1] sqlplus /@cdbs1 as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
SQL>exit

-- Same to Side 2
[email protected]:/u01/app/oracle/network/admin/ [cdbs1] sqlplus /@cdbs2 as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
SQL>exit

Copy wallet / sqlnet to ORA02
now we can copy the wallet and sqlnet.ora to ora02 side and also test the connection from this side

[email protected]:/u01/app/oracle/admin/cdbs1/[cdbs1] scp dg_wallet_cdbs1 [email protected]:$PWD
cwallet.sso                                                                                                            
cwallet.sso.lck  
[email protected]:/u01/app/oracle/admin/cdbs1/[cdbs1] scp $TNS_ADMIN/sqlnet.ora [email protected]:$TNS_ADMIN/sqlnet.ora
sqlnet.ora

-- Test Connection on Side 2 
[email protected]:/u01/app/oracle/network/admin/ [cdbs1] sqlplus /@cdbs1 as sysdba
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
SQL>exit

[email protected]:/u01/app/oracle/network/admin/ [cdbs1] sqlplus /@cdbs2 as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.8.0.0.0
SQL>exit

Create Broker Configuration
So the first step is to create the broker configuration for the primary database. This is the same as for a normal dg configuration. The difference is, that you do this for both cdb, because both are primary databases

--SITE 1
[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs1"
Connected as SYSDBA.
DGMGRL>
DGMGRL> create configuration site1 primary database is cdbs1 connect identifier is cdbs1.world;
Connected to "cdbs1"
Configuration "site1" created with primary database "cdbs1"
DGMGRL>
DGMGRL> show configuration verbose;
Configuration - 
  Protection Mode: MaxPerformance
  Members:
  cdbs1 - Primary database
  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    ObserverPingInterval            = '0'
    ObserverPingRetry               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'cdbs1_CFG'
    ConfigurationSimpleName         = 'site1'
    DrainTimeout                    = '0'
Fast-Start Failover:  Disabled
Configuration Status:
DISABLED
DGMGRL>

-- Site 2
[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs2"
Connected as SYSDBA.
DGMGRL>
DGMGRL> create configuration site2 primary database is cdbs2 connect identifier is cdbs2.world;
Connected to "cdbs2"
Configuration "site2" created with primary database "cdbs2"
DGMGRL>
DGMGRL> show configuration verbose;
Configuration - 
  Protection Mode: MaxPerformance
  Members:
  cdbs2 - Primary database
  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    ObserverPingInterval            = '0'
    ObserverPingRetry               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'cdbs2_CFG'
    ConfigurationSimpleName         = 'site2'
    DrainTimeout                    = '0'
Fast-Start Failover:  Disabled
Configuration Status:
DISABLED
DGMGRL>

the next step is different to a normal dg configuration. Normally after adding the primary database you would add the standby database but now we use the new syntax that allows us to add the configuration of one side to the other one

--Add Site 2 configuration to Side 1 Configuration
[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs1"
Connected as SYSDBA.
DGMGRL>
DGMGRL> add configuration site2 connect identifier is cdbs2.world;
Configuration site2 added.
DGMGRL>
DGMGRL> show configuration verbose;

Configuration - site1

  Protection Mode: MaxPerformance
  Members:
  cdbs1 - Primary database
    cdbs2 - Primary database in site2 configuration

  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    ObserverPingInterval            = '0'
    ObserverPingRetry               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'cdbs1_CFG'
    ConfigurationSimpleName         = 'site1'
    DrainTimeout                    = '0'

Data Guard for PDB:   Enabled in SOURCE role

Fast-Start Failover:  Disabled

Configuration Status:
DISABLED

DGMGRL> show configuration verbose site2;

Configuration - site2

Primary Database: cdbs2

  Properties:
    DGConnectIdentifier             = ''
    LogShipping                     = 'ON'
    LogXptMode                      = 'ASYNC'
    DelayMins                       = '0'
    Binding                         = 'optional'
    MaxFailure                      = '0'
    ReopenSecs                      = '300'
    NetTimeout                      = '30'
    RedoCompression                 = 'DISABLE'

Configuration site2 Status:
SUCCESS

-- Now we can enable the configuration ob both sides with the keyword "ALL"
DGMGRL> enable configuration all;
Succeeded.
DGMGRL>

Add PDB to Broker
The next step is to add the pluggable database to the broker configuration

[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs1"
Connected as SYSDBA.
DGMGRL> ADD PLUGGABLE DATABASE pdbs2 AT cdbs1 SOURCE IS pdbs2 AT cdbs2 PDBFILENAMECONVERT IS "'cdbs2','cdbs1'";
Connected to "cdbs2"
Connected to "cdbs1"
Pluggable Database "pdbs2" added
DGMGRL>
-- Now we can verify the new configuration for pdbs2

DGMGRL> show pluggable database pdbs2 at cdbs1;
Pluggable database 'pdbs2' at database 'cdbs1'
  Data Guard Role:     Physical Standby
  Con_ID:              4
  Source:              con_id 3 at cdbs2
  Transport Lag:       0 seconds (computed 43 seconds ago)
  Intended State:      APPLY-ON
  Apply State:         Not Running
Pluggable Database Status:
DGM-5103: one or more data files were not found
ORA-16766: Redo Apply is stopped

DGMGRL> show pluggable database pdbs2 at cdbs2;
Connected to "cdbs2"
Pluggable database 'pdbs2' at database 'cdbs2'
  Data Guard Role:     Primary
  Con_ID:              3
  Active Target:       con_id 4 at cdbs1
Pluggable Database Status:
SUCCESS
DGMGRL>


copy PDB Files
As you can see we have some Warning messages on the standby side for pdbs2 that some datafiles are not found. That is one of the disadvantages that we have with dgpd. If you add a standby pdb to the broker, the files will not automaticly copied to the standby side. We have to do that in that case 🙁 I will show you how to do it with rman.
1. First you need the file ID for the pdb from the primary side. in my case that was 13,14,15
2. Connect with RMAN as target to the Primary Site of the pdbs2 and with the auxiliary to the standby side
3. Copy the datafiles to the standby server

[orac[email protected] ~]$ rman target sys/[email protected] auxiliary sys/[email protected]
Recovery Manager: Release 21.0.0.0.0 - Production on Mon Nov 7 03:05:56 2022
Version 21.8.0.0.0

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

connected to target database: CDBS2 (DBID=4113202005)
connected to auxiliary database: CDBS1 (DBID=4052505709)

RMAN> run {
2> allocate channel ch1 type disk ;
3> backup as copy reuse  datafile 13,14,15 auxiliary format to new;
4> }

using target database control file instead of recovery catalog
allocated channel: ch1
channel ch1: SID=69 instance=oradbdc22 device type=DISK
Starting backup at 04-NOV-22
channel ch1: starting datafile copy
input datafile file number=00013
name=/u02/oradata/cdbs2/E55CEF3F4ECA51D8E0535ABDRB0AA403/DATAFILE/sysaux.300.1111789169
output file name=/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/sysaux.316.1111792861 
channel ch1: datafile copy complete, elapsed time: 00:00:18
channel ch1: starting datafile copy
input datafile file number=00014
name=/u02/oradata/cdbs2/E55CEF3F4ECA51D8E0535ABDRB0AA403/DATAFILE/system.300.1111789169
output file name=/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/system.316.1111792861 
channel ch1: datafile copy complete, elapsed time: 00:00:23
channel ch1: starting datafile copy
input datafile file number=00015
name=/u02/oradata/cdbs2/E55CEF3F4ECA51D8E0535ABDRB0AA403/DATAFILE/undots.300.1111789169
output file name=/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/undots.316.1111792861 
channel ch1: datafile copy complete, elapsed time: 00:00:19
Finished backup at 04-NOV-22
released channel: ch1

Now the datafiles for the pdbs2 are copied to the standby side on cdbs1 but we still have to do some changes. As we have added the standby database in the broker, oracle automaticly add some wrong datafile names in the dictionary. So now we have to do a rename to the right names that we get from the rman “output file name”

SQL> alter database rename file '/u02/oradata/CDBS2/EC7F3B8B56133B1DE0530B01A8C0B4DC/datafile/o1_mf_undotbs1_kp5220rq_.dbf' to '/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/undots.316.1111792861';
Database altered.
SQL> alter database rename file '/u02/oradata/CDBS2/EC7F3B8B56133B1DE0530B01A8C0B4DC/datafile/o1_mf_sysaux_kp5220rp_.dbf' to '/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/sysaux.316.1111792861';
Database altered.
SQL> alter database rename file '/u02/oradata/CDBS2/EC7F3B8B56133B1DE0530B01A8C0B4DC/datafile/o1_mf_system_kp5220r9_.dbf' to '/u02/oradata/cdbs1/E78CEF3F4ECA5941D8E0535A73A00AA405/DATAFILE/system.316.1111792861';
Database altered.

Enable configuration and check settings
Now we can enable the configuration again and the pdb should start with the recovery

[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs1"
Connected as SYSDBA.
DGMGRL> enable configuration all;
Succeeded.
DGMGRL> show pluggable database pdbs2 at cdbs1;
Connected to "cdbs1"

Pluggable database 'pdbs2' at database 'cdbs1'

  Data Guard Role:     Physical Standby
  Con_ID:              3
  Source:              con_id 5 at cdbs2
  Transport Lag:       0 seconds (computed 7 seconds ago)
  Intended State:      APPLY-ON
  Apply State:         Running
  Apply Instance:      cdbs2
  Average Apply Rate:  17 KByte/s
  Real Time Query:     OFF

Pluggable Database Status:
SUCCESS

Execute Switchover for pdbs2

[[email protected] ~]$ dgmgrl sys/Welcome_01
DGMGRL for Linux: Release 21.0.0.0.0 - Production 
Version 21.8.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdbs1"
Connected as SYSDBA.
DGMGRL> show pluggable database pdbs2 at cdbs2;
Connected to "cdbs1"

Pluggable database 'pdbs2' at database 'cdbs2'

  Data Guard Role:     Primary
  Con_ID:              5
  Active Target:       con_id 3 at cdbs2

Pluggable Database Status:
SUCCESS

DGMGRL> show pluggable database pdbs2 at cdbs1;

Pluggable database 'pdbs2' at database 'cdbs1'

  Data Guard Role:     Physical Standby
  Con_ID:              3
  Source:              con_id 5 at cdbs1
  Transport Lag:       0 seconds (computed 37 seconds ago)
  Intended State:      APPLY-ON
  Apply State:         Running
  Apply Instance:      cdbs2
  Average Apply Rate:  12 KByte/s
  Real Time Query:     OFF

Pluggable Database Status:
SUCCESS


DGMGRL> switchover to pluggable database pdbs2 at cdbs1;
Verifying conditions for Switchover...

Connected to "cdbs2"
  Source pluggable database is 'PDBS2' at database 'cdbs2'

Performing switchover NOW, please wait...

  Closing pluggable database 'PDBS2'...
  Switching 'PDBS2' to standby role...
Connected to "cdbs1"
  Waiting for 'PDBS2' to recover all redo data...
  Stopping recovery at 'PDBS2'...
  Converting 'PDBS2' to primary role...
  Opening new primary 'PDBS2'...
Connected to "cdbs2"
  Waiting for redo data from new primary 'PDBS2'...
  Starting recovery at new standby 'PDBS2'...

Switchover succeeded, new primary is "PDBS2"
DGMGRL>
DGMGRL>
DGMGRL> show pluggable database pdbs2 at cdbs1;

Pluggable database 'pdbs2' at database 'cdbs1'

  Data Guard Role:     Primary
  Con_ID:              3
  Active Target:       con_id 5 at cdbs1

Pluggable Database Status:
SUCCESS

DGMGRL> show pluggable database pdbs2 at cdbs2;
Connected to "cdbs1"

Pluggable database 'pdbs2' at database 'cdbs2'

  Data Guard Role:     Physical Standby
  Con_ID:              5
  Source:              con_id 3 at cdbs2
  Transport Lag:       0 seconds (computed 67 seconds ago)
  Intended State:      APPLY-ON
  Apply State:         Running
  Apply Instance:      cdbs1
  Average Apply Rate:  (unknown)
  Real Time Query:     OFF

Pluggable Database Status:
SUCCESS

DGMGRL>

Conclusion

As you can see the new feature DGPDB is working and you also can do a switchover on pdb level. So oracle is going in the right direction that you can manage pdbs also in case of high availability like a “normal” database, but today you have to be aware, that the Setup is not straigt forward and also that you have a lot of limitations compared to the normal data guard with primary and standby databases.