Purpose: Step-by-step guide to build a 2-node Oracle 19c Real Application Clusters (RAC) environment on AIX 7.3 LPARs in IBM Cloud Power Virtual Server (PowerVS): Grid Infrastructure, ASM, Oracle Database software and a RAC container database (CDB) with one pluggable database (PDB).
Audience: QA / Dev engineers who need an Oracle RAC test bed (for example, for TDE / KeyControl testing).
End result: A RAC CDB running on both nodes, with its PDB opening automatically after every restart.
1. Architecture
Clients (port 1521) | SCAN <scan-name> | ------------------- Public network (en0) ------------------- | | +-----------+ +-----------+ | Node 1 | <== Private interconnect (en2) ==>| Node 2 | | AIX 7.3 | | AIX 7.3 | | GI + ASM | | GI + ASM | | DB inst 1 | | DB inst 2 | +-----------+ +-----------+ \ / \--------- Shared disk (ASM disk group) -------/Layer | Component |
|---|---|
Clusterware | Oracle Grid Infrastructure 19c (Flex ASM) |
Storage | ASM disk group |
Database | Oracle Database 19c Enterprise Edition, RAC CDB with one PDB |
2. Prerequisites
2.1 Compute (per LPAR, 2 LPARs)
Item | Minimum | Recommended |
|---|---|---|
OS | AIX 7.3 | AIX 7.3 latest TL/SP |
vCPU | 2 | 4 |
RAM | 10 GB | 16 GB or more |
With less than 16 GB RAM, the database must use a small memory target (about 2 GB) and DBCA takes much longer.
2.2 Storage (per LPAR)
Each LPAR needs three disks: one OS disk, one local Oracle software disk, and the shared ASM disk.
Disk | Purpose | Size | Attached to |
|---|---|---|---|
Disk 1 ( | AIX OS, | 100 GB or more | Each node (local) |
Disk 2 ( |
| 100 GB or more | Each node (local) |
Disk 3 (shared) | ASM disk group | 100 GB or more | Both nodes (shareable volume) |
Required free space inside these disks:
Filesystem / area | Minimum |
|---|---|
| 5 GB |
| 2 GB |
Paging space | Equal to RAM (up to 16 GB) |
| 60 GB (Grid home ~12 GB, DB home ~8 GB, logs, staging zips) |
Shared ASM disk | 50 GB |
The shared disk must be created in PowerVS as a shareable volume and attached to both LPARs. It must not belong to any AIX volume group.
2.3 Network
Network | Interface | Purpose | Addresses needed |
|---|---|---|---|
Public subnet |
| Host IPs, VIPs, SCAN | 2 host IPs + 2 VIPs + 1 SCAN IP (all in the same subnet) |
Private subnet |
| Cluster interconnect and ASM traffic | 1 IP per node |
VIPs and the SCAN IP must be free (not assigned to any host) before the Grid install. Grid Infrastructure brings them up itself.
2.4 Software
Item | Notes |
|---|---|
| Oracle Grid Infrastructure 19c for AIX (Oracle eDelivery) |
| Oracle Database 19c for AIX (Oracle eDelivery) |
AIX fileset | Fortran runtime required by Oracle |
NTP server reachable from both nodes | For example, |
Root SSH access to both LPARs | Required for setup |
2.5 Planning sheet
Fill this in before you start. The commands in this guide use the Example values; replace them with yours.
Parameter | Example | Your value |
|---|---|---|
Node 1 / Node 2 hostname |
| |
Node 1 / Node 2 public IP ( |
| |
Public subnet / netmask |
| |
Node 1 / Node 2 VIP |
| |
SCAN name / IP |
| |
Node 1 / Node 2 private IP ( |
| |
Private subnet / netmask |
| |
Cluster name |
| |
Local Oracle disk |
| |
Shared ASM disk |
| |
Database name / PDB name |
| |
Passwords (ASM, SYS, SYSTEM, PDB admin) |
|
3. Prepare the operating system
Run every step on both nodes as root unless stated otherwise.
3.1 Host names (/etc/hosts)
cat >> /etc/hosts <<'EOF'# Public192.168.133.107 rac1192.168.133.110 rac2# VIP192.168.133.106 rac1-vip192.168.133.109 rac2-vip# SCAN192.168.133.108 racscan# Private interconnect192.168.100.2 rac1-priv192.168.100.3 rac2-privEOFCheck the private network:
ifconfig en2 # correct private IP and netmaskping -c 3 rac2-priv # from node 1 (ping rac1-priv from node 2)3.2 Groups and users
Use the same IDs on both nodes.
mkgroup -A id=54321 oinstallmkgroup -A id=54322 dbamkgroup -A id=54327 asmdbamkgroup -A id=54328 asmopermkgroup -A id=54329 asmadminmkuser id=54331 pgrp=oinstall groups=dba,asmadmin,asmdba,asmoper home=/home/grid gridmkuser id=54321 pgrp=oinstall groups=dba,asmdba home=/home/oracle oraclepasswd gridpasswd oraclechuser capabilities=CAP_NUMA_ATTACH,CAP_BYPASS_RAC_VMM,CAP_PROPAGATE gridchuser capabilities=CAP_NUMA_ATTACH,CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle3.3 Check OS filesystem sizes
df -g /tmp /varlsps -aIf /tmp or /var is below the minimum in section 2.2, grow it (rootvg must have free space):
chfs -a size=5G /tmpchfs -a size=2G /var3.4 Create /u01 and the Oracle directories
mkvg -y u01vg hdisk3crfs -v jfs2 -g u01vg -m /u01 -A yes -a size=95Gmount /u01mkdir -p /u01/app/19.0.0/grid /u01/app/grid /u01/app/oraInventory \ /u01/app/oracle/product/19.0.0/dbhome_1 /u01/tmpchown -R grid:oinstall /u01/app/19.0.0 /u01/app/grid /u01/app/oraInventorychown -R oracle:oinstall /u01/app/oraclechmod -R 775 /u01/appchmod 1777 /u01/tmp3.5 Required AIX settings
# I/O completion portsmkdev -l iocp0chdev -l iocp0 -P -a autoconfig=availablelsdev -Cc iocp # iocp0 Available# Packet filter devices used by installer network checkstcpdump -D >/dev/null 2>&1ls -l /dev/bpf* # devices exist# Network tunableno -p -o ipqmaxlen=512# Fortran runtimelslpp -l xlfrte # 17.1.1.4 or later3.6 Time synchronization (NTP with slewing)
cat > /etc/ntp.conf <<'EOF'server time.google.comdriftfile /etc/ntp.drifttracefile /etc/ntp.traceEOFstopsrc -s xntpdstartsrc -s xntpd -a "-x"ntpq -pTo keep -x after reboot, edit the xntpd line in /etc/rc.tcpip:
start /usr/sbin/xntpd "$src_running" "-x"3.7 scp compatibility (OpenSSH 9.x)
The Oracle installer copies files between nodes with scp. OpenSSH 9.x uses the SFTP protocol by default, which the installer does not support. Force the legacy protocol:
mv /usr/bin/scp /usr/bin/scp.origcat > /usr/bin/scp <<'EOF'#!/bin/shexec /usr/bin/scp.orig -T -O "$@"EOFchmod 755 /usr/bin/scp3.8 Shared ASM disk
The disk name can differ between nodes. Identify it by size or PVID.
lspvchdev -l hdisk0 -a reserve_policy=no_reserve -a pv=clearchown grid:asmadmin /dev/rhdisk0chmod 660 /dev/rhdisk0ls -l /dev/rhdisk0 # crw-rw---- grid asmadmin3.9 User environment
Add to both ~grid/.profile and ~oracle/.profile:
export TMP=/u01/tmpexport TMPDIR=/u01/tmpexport CV_DESTLOC=/u01/tmpumask 022Add to ~grid/.profile:
export ORACLE_BASE=/u01/app/gridexport ORACLE_HOME=/u01/app/19.0.0/gridexport PATH=$ORACLE_HOME/bin:$PATHAdd to ~oracle/.profile (use ORACLE_SID=orcl1 on node 1 and orcl2 on node 2):
export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1export ORACLE_SID=orcl1export PATH=$ORACLE_HOME/bin:$PATH3.10 Passwordless SSH
Set up for grid and oracle, between both nodes and from each node to itself.
su - gridssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa# Append ~/.ssh/id_rsa.pub of BOTH nodes to ~/.ssh/authorized_keys on BOTH nodesssh rac1 date; ssh rac2 date # no password promptRepeat as oracle.
4. Install Oracle Grid Infrastructure
4.1 Unzip the software (node 1, as grid)
cd /u01/app/19.0.0/gridunzip -q /u01/tmp/AIX.PPC64_193000_grid_home.zipAs root on both nodes, run the AIX pre-install script (copy it to node 2 first):
/u01/app/19.0.0/grid/clone/rootpre.sh4.2 Create the response file (node 1, as grid)
Save as /u01/tmp/grid.rsp and run chmod 600 on it.
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0INVENTORY_LOCATION=/u01/app/oraInventoryoracle.install.option=CRS_CONFIGORACLE_BASE=/u01/app/gridoracle.install.asm.OSDBA=asmdbaoracle.install.asm.OSOPER=asmoperoracle.install.asm.OSASM=asmadminoracle.install.crs.config.scanType=LOCAL_SCANoracle.install.crs.config.gpnp.scanName=racscanoracle.install.crs.config.gpnp.scanPort=1521oracle.install.crs.config.ClusterConfiguration=STANDALONEoracle.install.crs.config.configureAsExtendedCluster=falseoracle.install.crs.config.clusterName=racclusteroracle.install.crs.config.gpnp.configureGNS=falseoracle.install.crs.config.autoConfigureClusterNodeVIP=falseoracle.install.crs.config.clusterNodes=rac1:rac1-vip:HUB,rac2:rac2-vip:HUBoracle.install.crs.config.networkInterfaceList=en0:192.168.133.104:1,en2:192.168.100.0:5oracle.install.crs.configureGIMR=falseoracle.install.asm.configureGIMRDataDG=falseoracle.install.crs.config.storageOption=FLEX_ASM_STORAGEoracle.install.asm.SYSASMPassword=<PASSWORD>oracle.install.asm.monitorPassword=<PASSWORD>oracle.install.asm.diskGroup.name=DATAoracle.install.asm.diskGroup.redundancy=EXTERNALoracle.install.asm.diskGroup.AUSize=4oracle.install.asm.diskGroup.disks=/dev/rhdisk0oracle.install.asm.diskGroup.diskDiscoveryString=/dev/rhdisk0oracle.install.asm.configureAFD=falseoracle.install.crs.rootconfig.executeRootScript=falseIn
networkInterfaceList,1= public and5= ASM + private interconnect.
4.3 Run the installer (node 1, as grid)
export SKIP_ROOTPRE=TRUE/u01/app/19.0.0/grid/gridSetup.sh -silent -ignorePrereqFailure -responseFile /u01/tmp/grid.rsp
SKIP_ROOTPRE=TRUEstops the installer from waiting at the interactive "Has rootpre.sh been run?" question.
4.4 Run the root scripts on node 1 (as root)
/u01/app/oraInventory/orainstRoot.sh/u01/app/19.0.0/grid/root.shWait for CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded.
4.5 Apply the PowerVS network settings (node 1, as root)
Apply both settings before running root.sh on node 2.
a) Set the netmask and interface for the ASM network. Without this, the ASM network resource stays OFFLINE and node 2 cannot reach ASM.
/u01/app/19.0.0/grid/bin/crsctl modify res ora.asmnet1.asmnetwork \ -attr "USR_ORA_NETMASK=255.255.255.248,USR_ORA_IF=en2" -unsupportedsu - grid -c "srvctl start listener -listener ASMNET1LSNR_ASM -node rac1"b) Disable HAIP. The PowerVS network does not pass the link-local (169.254.x.x) traffic that HAIP uses, so the interconnect must use the private IPs directly.
/u01/app/19.0.0/grid/bin/crsctl modify res ora.cluster_interconnect.haip -attr "ENABLED=0" -init/u01/app/19.0.0/grid/bin/crsctl stop crs -f/u01/app/19.0.0/grid/bin/crsctl start crs4.6 Run the root scripts on node 2 (as root)
/u01/app/oraInventory/orainstRoot.sh/u01/app/19.0.0/grid/root.shThen disable HAIP on node 2 as well, and restart its stack:
/u01/app/19.0.0/grid/bin/crsctl modify res ora.cluster_interconnect.haip -attr "ENABLED=0" -init/u01/app/19.0.0/grid/bin/crsctl stop crs -f/u01/app/19.0.0/grid/bin/crsctl start crs4.7 Finish the Grid configuration (node 1, as grid)
srvctl modify asm -count 2export SKIP_ROOTPRE=TRUE/u01/app/19.0.0/grid/gridSetup.sh -executeConfigTools -responseFile /u01/tmp/grid.rsp -silentNETCA and ASMCA must succeed. A failure of the final Cluster Verification Utility check (
INS-43080) can be ignored.
4.8 Verify the cluster
olsnodes -n -s # both nodes Activecrsctl check cluster -all # CRS, CSS, EVM online on both nodescrsctl stat res -t # ASM, DATA disk group, listeners, VIPs, SCAN ONLINE5. Install the Oracle Database software
5.1 Unzip the software (node 1, as oracle)
cd /u01/app/oracle/product/19.0.0/dbhome_1unzip -q /u01/tmp/AIX.PPC64_193000_db_home.zip5.2 Create the response file (node 1, as oracle)
Save as /u01/tmp/db.rsp.
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0oracle.install.option=INSTALL_DB_SWONLYUNIX_GROUP_NAME=oinstallINVENTORY_LOCATION=/u01/app/oraInventoryORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1ORACLE_BASE=/u01/app/oracleoracle.install.db.InstallEdition=EEoracle.install.db.OSDBA_GROUP=dbaoracle.install.db.OSOPER_GROUP=dbaoracle.install.db.OSBACKUPDBA_GROUP=dbaoracle.install.db.OSDGDBA_GROUP=dbaoracle.install.db.OSKMDBA_GROUP=dbaoracle.install.db.OSRACDBA_GROUP=dbaoracle.install.db.rootconfig.executeRootScript=falseoracle.install.db.CLUSTER_NODES=rac1,rac25.3 Run the installer (node 1, as oracle)
export SKIP_ROOTPRE=TRUEcd /u01/app/oracle/product/19.0.0/dbhome_1./runInstaller -silent -ignorePrereqFailure -waitforcompletion -responseFile /u01/tmp/db.rspThe installer copies the Oracle home to node 2 automatically. Expected result: Successfully Setup Software.
5.4 Run the root script (both nodes, as root)
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh -silent5.5 Check the oracle binary group (both nodes)
The oracle binary must belong to the asmadmin group so the database can open ASM files.
ls -l /u01/app/oracle/product/19.0.0/dbhome_1/bin/oracleIf the group is not asmadmin, fix it as grid:
su - grid -c "/u01/app/19.0.0/grid/bin/setasmgidwrap o=/u01/app/oracle/product/19.0.0/dbhome_1/bin/oracle"6. Create the RAC database
6.1 Create the DBCA response file (node 1, as oracle)
Save as /u01/tmp/dbca_orcl.rsp and run chmod 600 on it.
responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v19.0.0gdbName=orclsid=orcldatabaseConfigType=RACnodelist=rac1,rac2policyManaged=falsecreateAsContainerDatabase=truenumberOfPDBs=1pdbName=orclpdbuseLocalUndoForPDBs=truepdbAdminPassword=<PASSWORD>sysPassword=<PASSWORD>systemPassword=<PASSWORD>templateName=General_Purpose.dbcemConfiguration=NONEstorageType=ASMdiskGroupName=+DATArecoveryGroupName=+DATAcharacterSet=AL32UTF8nationalCharacterSet=AL16UTF16listeners=LISTENERautomaticMemoryManagement=falsetotalMemory=2048databaseType=MULTIPURPOSESet
totalMemory(in MB) to fit the free memory on each node: about 2048 for 10 GB LPARs, 4096 or more for 16 GB LPARs.
6.2 Run DBCA (node 1, as oracle)
nohup dbca -silent -createDatabase -responseFile /u01/tmp/dbca_orcl.rsp -ignorePreReqs \ > /u01/tmp/dbca_orcl.log 2>&1 &tail -f /u01/tmp/dbca_orcl.logExpected result: 100% complete and Database creation complete.
6.3 Open the PDB automatically after restart (node 1, as oracle)
sqlplus / as sysdbaALTER PLUGGABLE DATABASE orclpdb SAVE STATE INSTANCES=ALL;SELECT con_name, instance_name, state FROM dba_pdb_saved_states;6.4 Remove the response files
They contain passwords.
rm /u01/tmp/grid.rsp /u01/tmp/db.rsp /u01/tmp/dbca_orcl.rsp7. Verify the installation
srvctl status database -d orcl -vsrvctl config database -d orcl | grep -iE "Management policy|Start option"Expected:
Instance orcl1 is running on node rac1. Instance status: Open.Instance orcl2 is running on node rac2. Instance status: Open.Management policy: AUTOMATICStart options: openSELECT inst_id, instance_name, host_name, status FROM gv$instance;SELECT inst_id, name, open_mode FROM gv$pdbs ORDER BY name, inst_id;Expected: both instances OPEN, and the PDB READ WRITE on both instances.
Restart test:
srvctl stop database -d orclsrvctl start database -d orclThe PDB must come back READ WRITE on both instances.
7.1 Connection strings
Target | Connect string |
|---|---|
CDB |
|
PDB |
|
Local, on a node |
|
8. Troubleshooting
Symptom | Cause | Fix |
|---|---|---|
Silent installer waits at "Has rootpre.sh been run?" | Interactive AIX question |
|
Installer fails while copying files to node 2 | OpenSSH 9.x |
|
Prerequisite check fails on | Devices not configured | Section 3.5 |
Installer or |
| Size disks as in section 2.2 |
Node 2 | ASM network has no netmask/interface | Section 4.5 a) |
ASM on node 2 stops about a minute after start (LMON error) | HAIP link-local traffic blocked on PowerVS | Section 4.5 b) |
Database cannot open ASM files on one node |
| Section 5.5 |
DBCA warning | Memory target larger than free RAM | Lower |
PDB is | PDB state not saved | Section 6.3 |
| AIX has no | Can be ignored |
9. Quick reference
Task | Command |
|---|---|
Cluster resource status |
|
Cluster health (all nodes) |
|
Cluster nodes |
|
ASM disk groups |
|
Interconnect configuration |
|
Database status |
|
Stop / start database |
|
Stop / start clusterware on one node |
|
Clusterware alert log |
|
Database alert log |
|