Setup:

Oracle Database 19c (19.3) for Linux x86-64
LINUX.X64_193000_db_home.zip or V982063-01.zip
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html

19.7 Database RU (from MOS)
Database Release Update: 19.7.0.0.200414 (30869156)
OJVM RELEASE UPDATE: 19.7.0.0.200414 (30805684)
OCW RELEASE UPDATE: 19.3.0.0.0 (29585399)
p30805684_190000_Linux-x86-64.zip

vi .bash_profile for node1:

set_CDBPROD1()
{
export ORACLE_BASE=/u02/app/oracle
export ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_CDBPROD
export ORACLE_UNQNAME=CDBPROD
export ORACLE_SID=CDBPROD1
export PATH=$HOME/bin:$ORACLE_HOME/bin:/usr/sbin:$ORACLE_HOME/OPatch:/usr/java/jdk1.6.0_24/bin:/usr/local/bin:/bin:/usr/bin:/sbin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/lib64:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
alias tal='tail -500f /u02/app/oracle/diag/rdbms/cdbprod/CDBPROD1/trace/alert_CDBPROD1.log'
alias log='cd /u02/app/oracle/diag/rdbms/cdbprod/CDBPROD1/trace'
}

echo set_CDBPROD1
vi .bash_profile for node2:

set_CDBPROD2()
{
export ORACLE_BASE=/u02/app/oracle
export ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_CDBPROD
export ORACLE_UNQNAME=CDBPROD
export ORACLE_SID=CDBPROD2
export PATH=$HOME/bin:$ORACLE_HOME/bin:/usr/sbin:$ORACLE_HOME/OPatch:/usr/java/jdk1.6.0_24/bin:/usr/local/bin:/bin:/usr/bin:/sbin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/lib64:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
alias tal='tail -500f /u02/app/oracle/diag/rdbms/cdbprod/CDBPROD2/trace/alert_CDBPROD2.log'
alias log='cd /u02/app/oracle/diag/rdbms/cdbprod/CDBPROD2/trace'
}

echo set_CDBPROD2

 

mkdir -p /u02/app/oracle/product/19.0.0/dbhome_CDBPROD

unzip V982063-01.zip -d /u02/app/oracle/product/19.0.0/dbhome_CDBPROD

 

[my_user@node1 ~]$ sudo su - oracle
set_CDBPROD1 
[oracle@node1 ~]$ xauth add node1/unix:14 MIT-MAGIC-COOKIE-1 2a8f3101317e02452eab49ac203214d5
[oracle@node1 ~]$ export DISPLAY=localhost:14.0
[oracle@node1 ~]$ xclock
[oracle@node1 ~]$ set_CDBPROD1
[oracle@node1 ~]$ echo $ORACLE_HOME
/u02/app/oracle/product/19.0.0/dbhome_CDBPROD
[oracle@node1 ~]$ echo $ORACLE_SID
CDBPROD
[oracle@node1 ~]$
cd $ORACLE_HOME
./runInstaller -applyRU /u02/app/oracle/patch/30869156

 

If you get an error like below, you can edit and run it manually on node2:

Remote 'AttachHome' failed on nodes: 'node2'. Refer to '/u01/app/oraInventory/logs/InstallActions2020-05-28_04-45-00PM/installActions2020-05-28_04-45-00PM.log' for details.
It is recommended that the following command needs to be manually run on the failed nodes: 
/u02/app/oracle/product/19.0.0/dbhome_CDBPROD/oui/bin/runInstaller -attachHome -noClusterEnabled ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_CDBPROD ORACLE_HOME_NAME=OraDB19Home1 "CLUSTER_NODES={node2}" -force INVENTORY_LOCATION=/u01/app/oraInventory LOCAL_NODE=<node on which command is to be run>. 
Please refer 'AttachHome' logs under central inventory of remote nodes where failure occurred for more details.


/u02/app/oracle/product/19.0.0/dbhome_CDBPROD/oui/bin/runInstaller -attachHome -noClusterEnabled ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_CDBPROD ORACLE_HOME_NAME=OraDB19Home1 "CLUSTER_NODES={node2}" -force INVENTORY_LOCATION=/u01/app/oraInventory LOCAL_NODE=node2


[oracle@node2 ~]$ /u02/app/oracle/product/19.0.0/dbhome_CDBPROD/oui/bin/runInstaller -attachHome -noClusterEnabled ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_CDBPROD ORACLE_HOME_NAME=OraDB19Home1 "CLUSTER_NODES={node2}" -force INVENTORY_LOCATION=/u01/app/oraInventory LOCAL_NODE=node2
Starting Oracle Universal Installer...
Checking swap space: must be greater than 500 MB. Actual 16383 MB Passed
The inventory pointer is located at /etc/oraInst.loc
You can find the log of this install session at:
/u01/app/oraInventory/logs/AttachHome2020-05-28_05-00-31PM.log
'AttachHome' was successful.
[oracle@node2 ~]$

alter session set container=PDB1;

select name from v$pdbs;

show pdbs

show con_name

select * from v$pwfile_users;

ALTER PLUGGABLE DATABASE PDB1 CLOSE;
ALTER PLUGGABLE DATABASE PDB1 OPEN READ ONLY;
ALTER PLUGGABLE DATABASE PDB1 OPEN READ WRITE;
ALTER PLUGGABLE DATABASE PDB1 OPEN READ WRITE INSTANCES = ALL;
ALTER PLUGGABLE DATABASE ALL OPEN READ WRITE INSTANCES = ALL;

select con_id,grantee,granted_role from cdb_role_privs where grantee='PDBDBA';

DROP PLUGGABLE DATABASE PDB1 INCLUDING DATAFILES;
CREATE PLUGGABLE DATABASE PDB1 ADMIN USER PDBDBA IDENTIFIED BY welcome1 ROLES=(DBA);
ALTER PLUGGABLE DATABASE PDB1 OPEN READ WRITE INSTANCES = ALL;

vi tnsnames.ora (add pdb tns for each node)

PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan_name)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PDB1)
)
)

SQL> conn PDBDBA@PDB1
Enter password: 
Connected.