Introduction
This guide walks through the installation of Oracle Database 19c RAC on a two-node Oracle Linux 7.3 environment. It covers OS and network preparation, Grid Infrastructure setup, ASM disk group configuration, silent installation of the Oracle Database software, RAC database creation, and post-installation checks to verify cluster and database functionality.
This guide covers a silent installation of Oracle Database 19c (19.3) RAC on two Oracle Linux 7.3 nodes. For the newer release, see the Oracle Database 26ai RAC installation post. What is specific to this build is the ASMLib disk setup, a chrony time source with no external NTP, response-file installs on a memory-constrained lab, and a DBCA failure caused by ASM disk group compatibility, covered in its own section near the end.
Prerequisites
Below are the minimum requirements for a Linux environment.
For Each Node
- OS - Linux 7.3
- CPU - 2 core
- RAM - 8GB
- SWAP - 8GB
- Disk space - 50GB (/u01)
- Must have root user or sudo access.
- Disable the firewall.
- 2 Network cards (NIC).
For the Whole Setup
- Raw disk storage - 60GB (for ASM disks)
- Grid and Database binary. Download here.
Scenario
This lab demonstrates Oracle Database 19c RAC installation on Oracle Linux 7.3 using a two-node cluster with limited hardware resources. Each node is allocated 5GB RAM, hostnames are resolved through /etc/hosts without a DNS server, and shared ASM storage is provided through virtual disks configured in VirtualBox. The setup is intended for learning and testing purposes.
Environment Used in this Guide
Network Details for Each Node
| Server | Node 1 | Node 2 |
|---|---|---|
| Public Hostname | racprd1.oraeasy.com | racprd2.oraeasy.com |
| Private Hostname | racprd1-priv.oraeasy.com | racprd2-priv.oraeasy.com |
| Virtual Hostname | racprd1-vip.oraeasy.com | racprd2-vip.oraeasy.com |
| Scan Hostname | racprd-scan.oraeasy.com | racprd-scan.oraeasy.com |
Global Details for Each Node
| VM Tool | Oracle VitualBox 7.2 |
|---|---|
| OS | OL 7.3 |
| CPU | 2 core |
| RAM | 5GB |
| SWAP | 5GB |
| Grid/Database Version | 19c (19.3) |
| Grid Home | /u01/app/grid/19c/grid_1 |
| Database Home | /u01/app/oracle/19c/db_1 |
| Grid/Database OS user | oracle |
| Database Name | RACPRDB |
Summary of Activities
At the top level, we will be doing the RAC installation in the phases below.
- Node Preparation.
- ASM Disks Configuration.
- Oracle Cluster Verification Utility (CVU) Validation.
- Oracle Grid Infrastructure Installation.
- Oracle Database Software Installation.
- RAC Database Creation.
- Post-Installation Verification.
Now let's proceed to install the Oracle RAC setup step by step.
Node Preparation
Step 1: Create the First Machine
Create a machine with the required configuration and attach a single network card for internet connectivity; the private and public network cards will be added later once the base OS is ready. Here we have created our first machine with the name "racprd1".
[root@racprd1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.3G 0 2.3G 0% /dev
tmpfs 2.3G 100K 2.3G 1% /dev/shm
tmpfs 2.3G 9.0M 2.3G 1% /run
tmpfs 2.3G 0 2.3G 0% /sys/fs/cgroup
/dev/sda2 12G 3.6G 8.5G 30% /
/dev/sda6 57G 33M 57G 1% /u01
/dev/sda5 5.0G 33M 5.0G 1% /tmp
/dev/sda1 1014M 205M 810M 21% /boot
tmpfs 471M 0 471M 0% /run/user/0
tmpfs 471M 16K 471M 1% /run/user/1000
[root@racprd1 ~]#
[root@racprd1 ~]# free -g
total used free shared buff/cache available
Mem: 4 0 3 0 0 3
Swap: 4 0 4
[root@racprd1 ~]#
[root@racprd1 ~]# ping google.com
PING google.com (142.250.182.14) 56(84) bytes of data.
64 bytes from tzdelb-bf-in-f14.1e100.net (142.250.182.14): icmp_seq=1 ttl=119 time=8.10 ms
64 bytes from tzdelb-bf-in-f14.1e100.net (142.250.182.14): icmp_seq=2 ttl=119 time=7.20 ms
64 bytes from tzdelb-bf-in-f14.1e100.net (142.250.182.14): icmp_seq=3 ttl=119 time=7.18 ms
64 bytes from tzdelb-bf-in-f14.1e100.net (142.250.182.14): icmp_seq=4 ttl=119 time=7.16 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 7.164/7.414/8.101/0.396 ms
[root@racprd1 ~]#
The output confirms the layout later steps depend on: /u01 has 57G for both homes, /tmp has 5G against the 1GB CVU asks for, and the ping proves internet access for yum. free -g rounds down to whole gigabytes, which is why the 5GB VM shows 4; CVU later reports the precise 4.59GB.
Step 2: Install the Preinstall Package
Install the required operating system packages to prepare the servers for Oracle Database 19c RAC. These packages help configure kernel parameters, resource limits, OS prerequisites, and the utilities required for ASM disk management.
[root@racprd1 ~]# yum -y install oracle-database-preinstall-19c.x86_64
Loaded plugins: langpacks, ulninfo
(1/2): ol7_UEKR4/x86_64/primary_db | 45 MB 00:12:35
(2/2): ol7_latest/x86_64/primary_db | 54 MB 00:16:37
Resolving Dependencies
--> Running transaction check
---> Package oracle-database-preinstall-19c.x86_64 0:1.0-3.el7 will be installed
--> Processing Dependency: compat-libcap1 for package: oracle-database-preinstall-19c-1.0-3.el7.x86_64
--> Processing Dependency: ksh for package: oracle-database-preinstall-19c-1.0-3.el7.x86_64
--> Processing Dependency: libaio-devel for package: oracle-database-preinstall-19c-1.0-3.el7.x86_64
--> Running transaction check
---> Package compat-libcap1.x86_64 0:1.10-7.el7 will be installed
---> Package ksh.x86_64 0:20120801-144.0.1.el7_9 will be installed
---> Package libaio-devel.x86_64 0:0.3.109-13.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================
Package Arch Version Repository Size
===========================================================================================================
Installing:
oracle-database-preinstall-19c x86_64 1.0-3.el7 ol7_latest 27 k
Installing for dependencies:
compat-libcap1 x86_64 1.10-7.el7 ol7_latest 17 k
ksh x86_64 20120801-144.0.1.el7_9 ol7_latest 882 k
libaio-devel x86_64 0.3.109-13.el7 ol7_latest 12 k
Transaction Summary
===========================================================================================================
Install 1 Package (+3 Dependent packages)
Total download size: 938 k
Installed size: 3.2 M
Downloading packages:
warning: /var/cache/yum/x86_64/7Server/ol7_latest/packages/compat-libcap1-1.10-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY --:--:-- ETA
Public key for compat-libcap1-1.10-7.el7.x86_64.rpm is not installed
(1/4): compat-libcap1-1.10-7.el7.x86_64.rpm | 17 kB 00:00:00
(2/4): libaio-devel-0.3.109-13.el7.x86_64.rpm | 12 kB 00:00:01
(3/4): oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm | 27 kB 00:00:00
(4/4): ksh-20120801-144.0.1.el7_9.x86_64.rpm | 882 kB 00:00:25
---------------------------------------------------------------------------------------------------------
Total 37 kB/s | 938 kB 00:00:25
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Importing GPG key 0xEC551F03:
Userid : "Oracle OSS group (Open Source Software group) "
Fingerprint: 4214 4123 fecf c55b 9086 313d 72f9 7b74 ec55 1f03
Package : 7:oraclelinux-release-7.3-1.0.4.el7.x86_64 (@anaconda/7.3)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : libaio-devel-0.3.109-13.el7.x86_64 1/4
Installing : ksh-20120801-144.0.1.el7_9.x86_64 2/4
Installing : compat-libcap1-1.10-7.el7.x86_64 3/4
Installing : oracle-database-preinstall-19c-1.0-3.el7.x86_64 4/4
Verifying : compat-libcap1-1.10-7.el7.x86_64 1/4
Verifying : ksh-20120801-144.0.1.el7_9.x86_64 2/4
Verifying : libaio-devel-0.3.109-13.el7.x86_64 3/4
Verifying : oracle-database-preinstall-19c-1.0-3.el7.x86_64 4/4
Installed:
oracle-database-preinstall-19c.x86_64 0:1.0-3.el7
Dependency Installed:
compat-libcap1.x86_64 0:1.10-7.el7 ksh.x86_64 0:20120801-144.0.1.el7_9 libaio-devel.x86_64 0:0.3.109-13.el7
Complete!
[root@racprd1 ~]#
Install ASM Package:
[root@racprd1 ~]# yum -y install oracleasm kmod-oracleasm oracleasm-support
Loaded plugins: langpacks, ulninfo
Resolving Dependencies
--> Running transaction check
---> Package kernel-uek.x86_64 0:4.1.12-124.93.1.el7uek will be installed
--> Processing Dependency: kernel-firmware = 4.1.12-124.93.1.el7uek for package: kernel-uek-4.1.12-124.93.1.el7uek.x86_64
--> Processing Dependency: linux-firmware >= 20171128-57.git17e62881.0.2 for package: kernel-uek-4.1.12-124.93.1.el7uek.x86_64
---> Package kmod-oracleasm.x86_64 0:2.0.8-28.0.1.el7 will be installed
--> Processing Dependency: kernel(__check_object_size) = 0x88db9f48 for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(d_alloc) = 0x6fd8a0cd for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(d_genocide) = 0xb7073a6a for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(d_instantiate) = 0xa1501aec for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(d_make_root) = 0x46af2b76 for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(dput) = 0xa3a1832f for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(d_rehash) = 0x4dca5a4f for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(kern_mount_data) = 0xf482d525 for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(kern_unmount) = 0xbc42731d for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel(_raw_qspin_lock_irq) = 0x3588d8ba for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
--> Processing Dependency: kernel >= 3.10.0-1133.el7 for package: kmod-oracleasm-2.0.8-28.0.1.el7.x86_64
---> Package oracleasm-support.x86_64 0:2.1.11-2.el7 will be installed
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-1160.119.1.0.5.el7 will be installed
--> Processing Dependency: dracut >= 033-502 for package: kernel-3.10.0-1160.119.1.0.5.el7.x86_64
---> Package kernel-uek-firmware.noarch 0:4.1.12-124.93.1.el7uek will be installed
---> Package linux-firmware.noarch 0:20160909-50.gitc883a6b6.0.1.el7 will be updated
---> Package linux-firmware.noarch 999:20241003-999.35.git95bfe086.el7 will be an update
--> Running transaction check
---> Package dracut.x86_64 0:033-463.0.1.el7 will be updated
--> Processing Dependency: dracut = 033-463.0.1.el7 for package: dracut-config-rescue-033-463.0.1.el7.x86_64
--> Processing Dependency: dracut = 033-463.0.1.el7 for package: dracut-network-033-463.0.1.el7.x86_64
---> Package dracut.x86_64 0:033-572.0.13.el7 will be an update
--> Running transaction check
---> Package dracut-config-rescue.x86_64 0:033-463.0.1.el7 will be updated
---> Package dracut-config-rescue.x86_64 0:033-572.0.13.el7 will be an update
---> Package dracut-network.x86_64 0:033-463.0.1.el7 will be updated
---> Package dracut-network.x86_64 0:033-572.0.13.el7 will be an update
--> Processing Conflict: kernel-3.10.0-1160.119.1.0.5.el7.x86_64 conflicts selinux-policy-targeted < 3.13.1-201
--> Restarting Dependency Resolution with new changes.
--> Running transaction check
---> Package selinux-policy-targeted.noarch 0:3.13.1-102.0.2.el7 will be updated
---> Package selinux-policy-targeted.noarch 0:3.13.1-268.0.25.el7_9.2 will be an update
--> Processing Dependency: selinux-policy = 3.13.1-268.0.25.el7_9.2 for package: selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch
--> Processing Dependency: selinux-policy = 3.13.1-268.0.25.el7_9.2 for package: selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch
--> Processing Dependency: policycoreutils >= 2.5-24 for package: selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch
--> Running transaction check
---> Package policycoreutils.x86_64 0:2.5-8.0.1.el7 will be updated
--> Processing Dependency: policycoreutils = 2.5-8.0.1.el7 for package: policycoreutils-python-2.5-8.0.1.el7.x86_64
---> Package policycoreutils.x86_64 0:2.5-34.0.1.el7 will be an update
--> Processing Dependency: libselinux-utils >= 2.5-14 for package: policycoreutils-2.5-34.0.1.el7.x86_64
--> Processing Dependency: libsemanage >= 2.5-14 for package: policycoreutils-2.5-34.0.1.el7.x86_64
--> Processing Dependency: libsepol >= 2.5-10 for package: policycoreutils-2.5-34.0.1.el7.x86_64
---> Package selinux-policy.noarch 0:3.13.1-102.0.2.el7 will be updated
---> Package selinux-policy.noarch 0:3.13.1-268.0.25.el7_9.2 will be an update
--> Running transaction check
---> Package libselinux-utils.x86_64 0:2.5-6.el7 will be updated
---> Package libselinux-utils.x86_64 0:2.5-15.el7 will be an update
--> Processing Dependency: libselinux(x86-64) = 2.5-15.el7 for package: libselinux-utils-2.5-15.el7.x86_64
---> Package libsemanage.x86_64 0:2.5-4.el7 will be updated
--> Processing Dependency: libsemanage = 2.5-4.el7 for package: libsemanage-python-2.5-4.el7.x86_64
---> Package libsemanage.x86_64 0:2.5-14.el7 will be an update
---> Package libsepol.x86_64 0:2.5-6.el7 will be updated
---> Package libsepol.x86_64 0:2.5-10.el7 will be an update
---> Package policycoreutils-python.x86_64 0:2.5-8.0.1.el7 will be updated
---> Package policycoreutils-python.x86_64 0:2.5-34.0.1.el7 will be an update
--> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-34.0.1.el7.x86_64
--> Running transaction check
---> Package libselinux.x86_64 0:2.5-6.el7 will be updated
--> Processing Dependency: libselinux(x86-64) = 2.5-6.el7 for package: libselinux-python-2.5-6.el7.x86_64
---> Package libselinux.x86_64 0:2.5-15.el7 will be an update
---> Package libsemanage-python.x86_64 0:2.5-4.el7 will be updated
---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be an update
---> Package setools-libs.x86_64 0:3.3.8-1.1.el7 will be updated
---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be an update
--> Running transaction check
---> Package libselinux-python.x86_64 0:2.5-6.el7 will be updated
---> Package libselinux-python.x86_64 0:2.5-15.el7 will be an update
--> Processing Conflict: kernel-3.10.0-1160.119.1.0.5.el7.x86_64 conflicts kexec-tools < 2.0.14-3
--> Restarting Dependency Resolution with new changes.
--> Running transaction check
---> Package kexec-tools.x86_64 0:2.0.7-50.0.1.el7 will be updated
---> Package kexec-tools.x86_64 0:2.0.15-51.0.5.el7_9.3 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================================================================
Package Arch Version Repository Size
=================================================================================================================
Installing:
kernel x86_64 3.10.0-1160.119.1.0.5.el7 ol7_latest 52 M
kernel-uek x86_64 4.1.12-124.93.1.el7uek ol7_UEKR4 45 M
kernel-uek-firmware noarch 4.1.12-124.93.1.el7uek ol7_UEKR4 2.7 M
kmod-oracleasm x86_64 2.0.8-28.0.1.el7 ol7_latest 298 k
oracleasm-support x86_64 2.1.11-2.el7 ol7_latest 85 k
Updating:
kexec-tools x86_64 2.0.15-51.0.5.el7_9.3 ol7_latest 356 k
selinux-policy-targeted noarch 3.13.1-268.0.25.el7_9.2 ol7_latest 7.2 M
Updating for dependencies:
dracut x86_64 033-572.0.13.el7 ol7_latest 331 k
dracut-config-rescue x86_64 033-572.0.13.el7 ol7_latest 63 k
dracut-network x86_64 033-572.0.13.el7 ol7_latest 107 k
libselinux x86_64 2.5-15.el7 ol7_latest 162 k
libselinux-python x86_64 2.5-15.el7 ol7_latest 235 k
libselinux-utils x86_64 2.5-15.el7 ol7_latest 151 k
libsemanage x86_64 2.5-14.el7 ol7_latest 150 k
libsemanage-python x86_64 2.5-14.el7 ol7_latest 112 k
libsepol x86_64 2.5-10.el7 ol7_latest 297 k
linux-firmware noarch 999:20241003-999.35.git95bfe086.el7 ol7_latest 382 M
policycoreutils x86_64 2.5-34.0.1.el7 ol7_latest 916 k
policycoreutils-python x86_64 2.5-34.0.1.el7 ol7_latest 457 k
selinux-policy noarch 3.13.1-268.0.25.el7_9.2 ol7_latest 500 k
setools-libs x86_64 3.3.8-4.el7 ol7_latest 620 k
Transaction Summary
=================================================================================================================
Install 5 Packages
Upgrade 2 Packages (+14 Dependent packages)
Total download size: 493 M
Downloading packages:
No Presto metadata available for ol7_UEKR4
No Presto metadata available for ol7_latest
(1/21): dracut-config-rescue-033-572.0.13.el7.x86_64.rpm | 63 kB 00:00:03
(2/21): dracut-network-033-572.0.13.el7.x86_64.rpm | 107 kB 00:00:01
(3/21): dracut-033-572.0.13.el7.x86_64.rpm | 331 kB 00:00:08
(4/21): kexec-tools-2.0.15-51.0.5.el7_9.3.x86_64.rpm | 356 kB 00:00:08
(5/21): kmod-oracleasm-2.0.8-28.0.1.el7.x86_64.rpm | 298 kB 00:00:04
(6/21): libselinux-2.5-15.el7.x86_64.rpm | 162 kB 00:00:01
(7/21): libselinux-python-2.5-15.el7.x86_64.rpm | 235 kB 00:00:05
(8/21): libselinux-utils-2.5-15.el7.x86_64.rpm | 151 kB 00:00:08
(9/21): libsemanage-2.5-14.el7.x86_64.rpm | 150 kB 00:00:05
(10/21): libsemanage-python-2.5-14.el7.x86_64.rpm | 112 kB 00:00:03
(11/21): libsepol-2.5-10.el7.x86_64.rpm | 297 kB 00:00:05
(12/21): kernel-uek-firmware-4.1.12-124.93.1.el7uek.noarch.rpm | 2.7 MB 00:01:04
(13/21): kernel-uek-4.1.12-124.93.1.el7uek.x86_64.rpm | 45 MB 00:14:39
(14/21): kernel-3.10.0-1160.119.1.0.5.el7.x86_64.rpm | 52 MB 00:16:57
(15/21): oracleasm-support-2.1.11-2.el7.x86_64.rpm | 85 kB 00:00:02
(16/21): policycoreutils-2.5-34.0.1.el7.x86_64.rpm | 916 kB 00:00:25
(17/21): policycoreutils-python-2.5-34.0.1.el7.x86_64.rpm | 457 kB 00:00:05
(18/21): selinux-policy-3.13.1-268.0.25.el7_9.2.noarch.rpm | 500 kB 00:00:07
(19/21): selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch.rpm | 7.2 MB 00:02:13
(20/21): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:00:16
(21/21): linux-firmware-20241003-999.35.git95bfe086.el7.noarch.rpm | 382 MB 01:55:34
-----------------------------------------------------------------------------------------------------------
Total 72 kB/s | 493 MB 01:56:25
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : libsepol-2.5-10.el7.x86_64 1/37
Updating : libselinux-2.5-15.el7.x86_64 2/37
Updating : dracut-033-572.0.13.el7.x86_64 3/37
Updating : libsemanage-2.5-14.el7.x86_64 4/37
Updating : 999:linux-firmware-20241003-999.35.git95bfe086.el7.noarch 5/37
Installing : kernel-3.10.0-1160.119.1.0.5.el7.x86_64 6/37
Updating : libsemanage-python-2.5-14.el7.x86_64 7/37
Updating : dracut-network-033-572.0.13.el7.x86_64 8/37
Updating : libselinux-utils-2.5-15.el7.x86_64 9/37
Updating : policycoreutils-2.5-34.0.1.el7.x86_64 10/37
Updating : selinux-policy-3.13.1-268.0.25.el7_9.2.noarch 11/37
Updating : setools-libs-3.3.8-4.el7.x86_64 12/37
Updating : libselinux-python-2.5-15.el7.x86_64 13/37
Installing : kernel-uek-firmware-4.1.12-124.93.1.el7uek.noarch 14/37
Installing : kernel-uek-4.1.12-124.93.1.el7uek.x86_64 15/37
Updating : policycoreutils-python-2.5-34.0.1.el7.x86_64 16/37
Updating : selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch 17/37
Updating : kexec-tools-2.0.15-51.0.5.el7_9.3.x86_64 18/37
Installing : kmod-oracleasm-2.0.8-28.0.1.el7.x86_64 19/37
Updating : dracut-config-rescue-033-572.0.13.el7.x86_64 20/37
Installing : oracleasm-support-2.1.11-2.el7.x86_64 21/37
Note: Forwarding request to 'systemctl enable oracleasm.service'.
Created symlink from /etc/systemd/system/multi-user.target.wants/oracleasm.service to /usr/lib/systemd/system/oracleasm.service.
Cleanup : selinux-policy-targeted-3.13.1-102.0.2.el7.noarch 22/37
Cleanup : selinux-policy-3.13.1-102.0.2.el7.noarch 23/37
Cleanup : dracut-config-rescue-033-463.0.1.el7.x86_64 24/37
Cleanup : linux-firmware-20160909-50.gitc883a6b6.0.1.el7.noarch 25/37
Cleanup : policycoreutils-python-2.5-8.0.1.el7.x86_64 26/37
Cleanup : policycoreutils-2.5-8.0.1.el7.x86_64 27/37
Cleanup : libselinux-utils-2.5-6.el7.x86_64 28/37
Cleanup : setools-libs-3.3.8-1.1.el7.x86_64 29/37
Cleanup : kexec-tools-2.0.7-50.0.1.el7.x86_64 30/37
Cleanup : dracut-network-033-463.0.1.el7.x86_64 31/37
Cleanup : libselinux-python-2.5-6.el7.x86_64 32/37
Cleanup : libsemanage-python-2.5-4.el7.x86_64 33/37
Cleanup : libsemanage-2.5-4.el7.x86_64 34/37
Cleanup : libselinux-2.5-6.el7.x86_64 35/37
Cleanup : libsepol-2.5-6.el7.x86_64 36/37
Cleanup : dracut-033-463.0.1.el7.x86_64 37/37
Verifying : 999:linux-firmware-20241003-999.35.git95bfe086.el7.noarch 1/37
Verifying : libselinux-2.5-15.el7.x86_64 2/37
Verifying : dracut-033-572.0.13.el7.x86_64 3/37
Verifying : policycoreutils-2.5-34.0.1.el7.x86_64 4/37
Verifying : policycoreutils-python-2.5-34.0.1.el7.x86_64 5/37
Verifying : selinux-policy-3.13.1-268.0.25.el7_9.2.noarch 6/37
Verifying : dracut-network-033-572.0.13.el7.x86_64 7/37
Verifying : libselinux-utils-2.5-15.el7.x86_64 8/37
Verifying : kernel-3.10.0-1160.119.1.0.5.el7.x86_64 9/37
Verifying : oracleasm-support-2.1.11-2.el7.x86_64 10/37
Verifying : setools-libs-3.3.8-4.el7.x86_64 11/37
Verifying : libsemanage-python-2.5-14.el7.x86_64 12/37
Verifying : libsemanage-2.5-14.el7.x86_64 13/37
Verifying : libsepol-2.5-10.el7.x86_64 14/37
Verifying : libselinux-python-2.5-15.el7.x86_64 15/37
Verifying : dracut-config-rescue-033-572.0.13.el7.x86_64 16/37
Verifying : kernel-uek-firmware-4.1.12-124.93.1.el7uek.noarch 17/37
Verifying : kernel-uek-4.1.12-124.93.1.el7uek.x86_64 18/37
Verifying : selinux-policy-targeted-3.13.1-268.0.25.el7_9.2.noarch 19/37
Verifying : kmod-oracleasm-2.0.8-28.0.1.el7.x86_64 20/37
Verifying : kexec-tools-2.0.15-51.0.5.el7_9.3.x86_64 21/37
Verifying : libsepol-2.5-6.el7.x86_64 22/37
Verifying : selinux-policy-3.13.1-102.0.2.el7.noarch 23/37
Verifying : libselinux-python-2.5-6.el7.x86_64 24/37
Verifying : libselinux-utils-2.5-6.el7.x86_64 25/37
Verifying : libsemanage-python-2.5-4.el7.x86_64 26/37
Verifying : kexec-tools-2.0.7-50.0.1.el7.x86_64 27/37
Verifying : dracut-network-033-463.0.1.el7.x86_64 28/37
Verifying : dracut-033-463.0.1.el7.x86_64 29/37
Verifying : dracut-config-rescue-033-463.0.1.el7.x86_64 30/37
Verifying : selinux-policy-targeted-3.13.1-102.0.2.el7.noarch 31/37
Verifying : policycoreutils-python-2.5-8.0.1.el7.x86_64 32/37
Verifying : libselinux-2.5-6.el7.x86_64 33/37
Verifying : policycoreutils-2.5-8.0.1.el7.x86_64 34/37
Verifying : libsemanage-2.5-4.el7.x86_64 35/37
Verifying : linux-firmware-20160909-50.gitc883a6b6.0.1.el7.noarch 36/37
Verifying : setools-libs-3.3.8-1.1.el7.x86_64 37/37
Installed:
kernel.x86_64 0:3.10.0-1160.119.1.0.5.el7 kernel-uek.x86_64 0:4.1.12-124.93.1.el7uek kernel-uek-firmware.noarch 0:4.1.12-124.93.1.el7uek
kmod-oracleasm.x86_64 0:2.0.8-28.0.1.el7 oracleasm-support.x86_64 0:2.1.11-2.el7
Updated:
kexec-tools.x86_64 0:2.0.15-51.0.5.el7_9.3 selinux-policy-targeted.noarch 0:3.13.1-268.0.25.el7_9.2
Dependency Updated:
dracut.x86_64 0:033-572.0.13.el7 dracut-config-rescue.x86_64 0:033-572.0.13.el7 dracut-network.x86_64 0:033-572.0.13.el7
libselinux.x86_64 0:2.5-15.el7 libselinux-python.x86_64 0:2.5-15.el7 libselinux-utils.x86_64 0:2.5-15.el7
libsemanage.x86_64 0:2.5-14.el7 libsemanage-python.x86_64 0:2.5-14.el7 libsepol.x86_64 0:2.5-10.el7
linux-firmware.noarch 999:20241003-999.35.git95bfe086.el7 policycoreutils.x86_64 0:2.5-34.0.1.el7 policycoreutils-python.x86_64 0:2.5-34.0.1.el7
selinux-policy.noarch 0:3.13.1-268.0.25.el7_9.2 setools-libs.x86_64 0:3.3.8-4.el7
Complete!
[root@racprd1 ~]#
The ASM package install is far larger than it looks because kmod-oracleasm requires a newer kernel (3.10.0-1160) plus updated firmware and SELinux policy, about 493MB in total, and the transcript shows it took close to two hours on this connection. Reboot into the new kernel before running oracleasm init, so the module matches the running kernel.
Step 3: Configure OS Groups for the Oracle User
The preinstall package already creates the standard OSDBA/OSOPER groups on the oracle user, but the ASM-specific groups still need creating by hand since a single "oracle" user will own both the Grid and Database homes here:
[root@racprd1 ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)
[root@racprd1 ~]#
[root@racprd1 ~]# groupadd -g 54331 asmadmin
[root@racprd1 ~]# groupadd -g 54332 asmdba
[root@racprd1 ~]# groupadd -g 54333 asmoper
[root@racprd1 ~]# usermod -a -G asmadmin,asmdba,asmoper oracle
[root@racprd1 ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba),54331(asmadmin),54332(asmdba),54333(asmoper)
[root@racprd1 ~]#
[root@racprd1 ~]# passwd oracle
Changing password for user oracle.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@racprd1 ~]#
The BAD PASSWORD line is only a length warning from passwd; root can still set the password, but use a strong one outside a lab. The group IDs matter more: RAC needs identical GIDs on every node, and because Node 2 is cloned from this machine later, asmadmin, asmdba, and asmoper arrive with the same numbers.
Step 4: Create Directories for Grid and Database Home
These directories become ORACLE_BASE and the parent of ORACLE_HOME for both homes, so they need to exist and be owned by oracle before either installer will accept them:
[root@racprd1 ~]# mkdir -p /u01/app/grid/19c/grid_1
[root@racprd1 ~]# mkdir -p /u01/grid
[root@racprd1 ~]# mkdir -p /u01/app/oracle/19c/db_1
[root@racprd1 ~]# chown -R oracle:oinstall /u01
[root@racprd1 ~]# chmod -R 775 /u01
The Grid home /u01/app/grid/19c/grid_1 deliberately sits outside the Grid ORACLE_BASE of /u01/grid, because Oracle does not allow a Grid home under an Oracle base path. That base is where clusterware logs land later, such as /u01/grid/crsdata in the root script output.
Step 5: Configure SELinux and Disable the Firewall
SELinux in enforcing mode and an active firewall are common causes of cluster communication failures during Grid installation, so both are relaxed for this lab setup, matching Oracle's documented prerequisites:
[root@racprd1 ~]# cat /etc/selinux/config | grep SELINUX
# SELINUX= can take one of these three values:
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
SELINUXTYPE=targeted
[root@racprd1 ~]#
[root@racprd1 ~]# vi /etc/selinux/config
[root@racprd1 ~]# cat /etc/selinux/config | grep SELINUX
# SELINUX= can take one of these three values:
SELINUX=permissive
# SELINUXTYPE= can take one of three two values:
SELINUXTYPE=targeted
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2026-09-20 20:00:33 IST; 56min ago
Docs: man:firewalld(1)
Main PID: 633 (firewalld)
CGroup: /system.slice/firewalld.service
└─633 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Sep 20 20:00:28 racprd1.oraeasy.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Sep 20 20:00:33 racprd1.oraeasy.com systemd[1]: Started firewalld - dynamic firewall daemon.
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl stop firewalld
[root@racprd1 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
Sep 20 20:00:28 racprd1.oraeasy.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Sep 20 20:00:33 racprd1.oraeasy.com systemd[1]: Started firewalld - dynamic firewall daemon.
Sep 20 20:57:29 racprd1.oraeasy.com systemd[1]: Stopping firewalld - dynamic firewall daemon...
Sep 20 20:57:30 racprd1.oraeasy.com systemd[1]: Stopped firewalld - dynamic firewall daemon.
[root@racprd1 ~]#
Editing /etc/selinux/config only changes the mode used at the next boot, so the running system stays in enforcing mode until you reboot or run setenforce 0. Permissive is enough here because it logs violations without blocking cluster processes.
Step 6: Configure /etc/hosts
Since this lab uses /etc/hosts instead of DNS, every public, virtual, SCAN, and private hostname the cluster references has to be resolvable here, identically on both nodes. The SCAN name maps to three addresses because Oracle recommends three SCAN listeners, but a hosts file returns them in file order instead of rotating them, so this arrangement suits a lab only and production should use DNS.
[root@racprd1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@racprd1 ~]#
[root@racprd1 ~]# vi /etc/hosts
[root@racprd1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# Public
192.168.80.61 racprd1.oraeasy.com racprd1
192.168.80.62 racprd2.oraeasy.com racprd2
# Virtual
192.168.80.71 racprd1-vip.oraeasy.com racprd1-vip
192.168.80.72 racprd2-vip.oraeasy.com racprd2-vip
# SCAN
192.168.80.81 racprd-scan.oraeasy.com racprd-scan
192.168.80.82 racprd-scan.oraeasy.com racprd-scan
192.168.80.83 racprd-scan.oraeasy.com racprd-scan
# Private
192.168.10.61 racprd1-priv.oraeasy.com racprd1-priv
192.168.10.62 racprd2-priv.oraeasy.com racprd2-priv
[root@racprd1 ~]#
Step 7: Create Environment Files for Grid and Database Home
Sourcing a dedicated environment file before running any Grid or Database utility avoids repeatedly retyping ORACLE_HOME/ORACLE_SID, and keeps the two homes from being mixed up during the install:
For Grid Home:
[oracle@racprd1 ~]$ vi .grid_env
[oracle@racprd1 ~]$ cat .grid_env
# Environment variables for ASM - Grid Home
ORACLE_SID=+ASM1; export ORACLE_SID
ORACLE_BASE=/u01/grid; export ORACLE_BASE
ORACLE_HOME=/u01/app/grid/19c/grid_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ chmod 775 .grid_env
[oracle@racprd1 ~]$ . .grid_env
[oracle@racprd1 ~]$ env|grep ORA
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/19c/grid_1
For Database Home:
[oracle@racprd1 ~]$ vi .db_env
[oracle@racprd1 ~]$ cat .db_env
# Environment variables for Database - DB Home
ORACLE_SID=racprdb1; export ORACLE_SID
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/19c/db_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ chmod 775 .db_env
[oracle@racprd1 ~]$ . .db_env
[oracle@racprd1 ~]$ env|grep ORA
ORACLE_SID=racprdb1
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/19c/db_1
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$
The SIDs are not arbitrary: +ASM1 is the first ASM instance name Grid creates on this node, and racprdb1 matches the instance name DBCA derives later from the racprdb prefix. Node 2 therefore uses +ASM2 and racprdb2.
Step 8: Add the Network Cards
RAC needs separate public and private network paths, so two more virtual NICs are added here, on top of the one used for internet access during package installation. Shut down the machine first.
In the machine settings, go to the Network section. Check the box "Enable Network Adapter", in "Attached To" select "Internal Network", and give the network the name "Pubnet (Public Network)". Leave the rest as default and click OK.
Similarly add a network for "Privnet (Private Network)".
Now we can view the attached network cards. You can see the one extra network card added during machine creation for internet access.
Internal Network adapters let the two VMs talk to each other without involving the host or router, which is why both nodes must use exactly the same network names. The new adapters appear in the guest as enp0s8 (public) and enp0s9 (private), after the internet-facing enp0s3.
Step 9: Configure the IPs
First view the current IPs and network profiles:
[root@racprd1 ~]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:c3:66:c7 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fec3:66c7/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:88:b8:69 brd ff:ff:ff:ff:ff:ff
4: enp0s9: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:82:87:c3 brd ff:ff:ff:ff:ff:ff
5: virbr0: mtu 1500 qdisc noqueue state DOWN
link/ether 52:54:00:85:cd:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
6: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
link/ether 52:54:00:85:cd:0c brd ff:ff:ff:ff:ff:ff
[root@racprd1 ~]#
[root@racprd1 ~]# ip route
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.5 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
[root@racprd1 ~]#
[root@racprd1 ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
virbr0 bridge connected virbr0
enp0s3 ethernet connected enp0s3
enp0s8 ethernet disconnected --
enp0s9 ethernet disconnected --
lo loopback unmanaged --
virbr0-nic tun unmanaged --
[root@racprd1 ~]# ls -l /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r--. 1 root root 335 Sep 21 11:55 /etc/sysconfig/network-scripts/ifcfg-enp0s3
-rw-r--r--. 1 root root 254 Sep 12 2016 /etc/sysconfig/network-scripts/ifc
nmcli shows enp0s8 and enp0s9 as disconnected with no connection profile, which is why the interface files are written by hand next. Note virbr0 at 192.168.122.1, the default libvirt bridge; it is unrelated to the cluster but reappears in the CVU results.
Now configure the IPs:
Public Network:
[root@racprd1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
[root@racprd1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=none
NAME=enp0s8
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.80.61
NETMASK=255.255.255.0
[root@racprd1 ~]#
Private Network:
[root@racprd1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9
[root@racprd1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9
TYPE=Ethernet
BOOTPROTO=none
NAME=enp0s9
DEVICE=enp0s9
ONBOOT=yes
IPADDR=192.168.10.61
NETMASK=255.255.255.0
[root@racprd1 ~]#
Turn Up the Network:
[root@racprd1 ~]# ifup enp0s8
[root@racprd1 ~]# ifup enp0s9
[root@racprd1 ~]#
Static addresses with BOOTPROTO=none and ONBOOT=yes survive reboots, and no gateway is set because both subnets are internal to the cluster. The VIP and SCAN addresses from /etc/hosts are intentionally not configured on any NIC, since clusterware brings them up itself.
Now verify all the IPs are assigned correctly:
[root@racprd1 ~]# ip addr show enp0s8
3: enp0s8: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:88:b8:69 brd ff:ff:ff:ff:ff:ff
inet 192.168.80.61/24 brd 192.168.80.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe88:b869/64 scope link
valid_lft forever preferred_lft forever
[root@racprd1 ~]#
[root@racprd1 ~]# ip addr show enp0s9
4: enp0s9: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:82:87:c3 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.61/24 brd 192.168.10.255 scope global enp0s9
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe82:87c3/64 scope link
valid_lft forever preferred_lft forever
[root@racprd1 ~]#
[root@racprd1 ~]# ip route
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.5 metric 100
192.168.10.0/24 dev enp0s9 proto kernel scope link src 192.168.10.61 metric 100
192.168.80.0/24 dev enp0s8 proto kernel scope link src 192.168.80.61 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
[root@racprd1 ~]#
[root@racprd1 ~]# ifconfig
enp0s3: flags=4163 mtu 1500
inet 192.168.1.61 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a00:27ff:fec3:66c7 prefixlen 64 scopeid 0x20
ether 08:00:27:c3:66:c7 txqueuelen 1000 (Ethernet)
RX packets 1148 bytes 79036 (77.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 256 bytes 35212 (34.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s8: flags=4163 mtu 1500
inet 192.168.80.61 netmask 255.255.255.0 broadcast 192.168.80.255
inet6 fe80::a00:27ff:fe88:b869 prefixlen 64 scopeid 0x20
ether 08:00:27:88:b8:69 txqueuelen 1000 (Ethernet)
RX packets 18 bytes 3278 (3.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 4115 (4.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s9: flags=4163 mtu 1500
inet 192.168.10.61 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a00:27ff:fe82:87c3 prefixlen 64 scopeid 0x20
ether 08:00:27:82:87:c3 txqueuelen 1000 (Ethernet)
RX packets 18 bytes 3278 (3.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27 bytes 3853 (3.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:85:cd:0c txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@racprd1 ~]#
Step 10: Clone the Machine for Node 2
Cloning racprd1 after it's fully prepared, instead of building racprd2 from scratch, guarantees both nodes start with identical packages, groups, and directory layout, which is exactly what a symmetric RAC cluster needs. Shut down the machine before cloning.
Right-click the machine and select Clone.
Provide the machine name "racprd2" and select its location. Leave the rest as default and click Finish.
Monitor the progress.
Once completed, the new machine appears in the list.
Step 11: Configure Node 2's Hostname, IPs, and Environment
Because Node 2 was cloned from Node 1, it starts with the same hostname and IPs, which have to be changed before both nodes can run at once. Refer back to Steps 7 and 9 for the environment files and IP settings, then verify the result. SELinux, the firewall, and /etc/hosts come across with the clone unchanged:
[root@racprd2 ~]# hostname
racprd2.oraeasy.com
[root@racprd2 ~]#
[root@racprd2 ~]# ifconfig
enp0s3: flags=4163 mtu 1500
inet 192.168.1.62 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a00:27ff:fee1:6120 prefixlen 64 scopeid 0x20
ether 08:00:27:e1:61:20 txqueuelen 1000 (Ethernet)
RX packets 978 bytes 69912 (68.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 189 bytes 29722 (29.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s8: flags=4163 mtu 1500
inet 192.168.80.62 netmask 255.255.255.0 broadcast 192.168.80.255
inet6 fe80::a00:27ff:feed:2e70 prefixlen 64 scopeid 0x20
ether 08:00:27:ed:2e:70 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 4046 (3.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s9: flags=4163 mtu 1500
inet 192.168.10.62 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a00:27ff:feac:f97f prefixlen 64 scopeid 0x20
ether 08:00:27:ac:f9:7f txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 4046 (3.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:85:cd:0c txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@racprd2 ~]#
[root@racprd1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# Public
192.168.80.61 racprd1.oraeasy.com racprd1
192.168.80.62 racprd2.oraeasy.com racprd2
# Virtual
192.168.80.71 racprd1-vip.oraeasy.com racprd1-vip
192.168.80.72 racprd2-vip.oraeasy.com racprd2-vip
# SCAN
192.168.80.81 racprd-scan.oraeasy.com racprd-scan
192.168.80.82 racprd-scan.oraeasy.com racprd-scan
192.168.80.83 racprd-scan.oraeasy.com racprd-scan
# Private
192.168.10.61 racprd1-priv.oraeasy.com racprd1-priv
192.168.10.62 racprd2-priv.oraeasy.com racprd2-priv
[root@racprd2 ~]#
For Grid Home:
[oracle@racprd2 ~]$ vi .grid_env
[oracle@racprd2 ~]$ cat .grid_env
# Environment variables for ASM - Grid Home
ORACLE_SID=+ASM2; export ORACLE_SID
ORACLE_BASE=/u01/grid; export ORACLE_BASE
ORACLE_HOME=/u01/app/grid/19c/grid_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@racprd2 ~]$ . .grid_env
[oracle@racprd2 ~]$ env|grep ORA
ORACLE_SID=+ASM2
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/19c/grid_1
[oracle@racprd2 ~]$
For Database Home:
[oracle@racprd2 ~]$ vi .db_env
[oracle@racprd2 ~]$ cat .db_env
# Environment variables for Database - DB Home
ORACLE_SID=racprdb2; export ORACLE_SID
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/19c/db_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ . .db_env
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ env|grep ORA
ORACLE_SID=racprdb2
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/19c/db_1
[oracle@racprd2 ~]$
Each adapter keeps its own MAC address with an address ending in .62, the hosts file matches Node 1, and the environment files differ only in the SIDs. Identical hosts files matter because Grid resolves peer names locally here.
Step 12: Verify Connectivity Between Both Nodes
With both nodes configured, confirming public and private connectivity in both directions before moving on avoids chasing a networking issue later, in the middle of a Grid Infrastructure install where the errors are far less obvious:
From Node 1 to Node 2:
[root@racprd1 ~]# ping racprd2 -c 3
PING racprd2.oraeasy.com (192.168.80.62) 56(84) bytes of data.
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=1 ttl=64 time=2.12 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=2 ttl=64 time=0.797 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=3 ttl=64 time=0.769 ms
--- racprd2.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.769/1.230/2.124/0.632 ms
[root@racprd1 ~]#
[root@racprd1 ~]# ping racprd2-priv -c 3
PING racprd2-priv.oraeasy.com (192.168.10.62) 56(84) bytes of data.
64 bytes from racprd2-priv.oraeasy.com (192.168.10.62): icmp_seq=1 ttl=64 time=1.96 ms
64 bytes from racprd2-priv.oraeasy.com (192.168.10.62): icmp_seq=2 ttl=64 time=0.752 ms
64 bytes from racprd2-priv.oraeasy.com (192.168.10.62): icmp_seq=3 ttl=64 time=0.898 ms
--- racprd2-priv.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2179ms
rtt min/avg/max/mdev = 0.752/1.204/1.963/0.540 ms
[root@racprd1 ~]#
[root@racprd1 ~]#
From Node 2 to Node 1:
[root@racprd2 ~]# ping racprd1 -c 3
PING racprd1.oraeasy.com (192.168.80.61) 56(84) bytes of data.
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=2 ttl=64 time=0.829 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=3 ttl=64 time=0.883 ms
--- racprd1.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.829/0.954/1.152/0.145 ms
[root@racprd2 ~]#
[root@racprd2 ~]# ping racprd1-priv -c 3
PING racprd1-priv.oraeasy.com (192.168.10.61) 56(84) bytes of data.
64 bytes from racprd1-priv.oraeasy.com (192.168.10.61): icmp_seq=1 ttl=64 time=0.976 ms
64 bytes from racprd1-priv.oraeasy.com (192.168.10.61): icmp_seq=2 ttl=64 time=0.754 ms
64 bytes from racprd1-priv.oraeasy.com (192.168.10.61): icmp_seq=3 ttl=64 time=0.866 ms
--- racprd1-priv.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.754/0.865/0.976/0.093 ms
[root@racprd2 ~]#
Pinging by short name proves /etc/hosts resolves in both directions, and sub-2 ms replies with ttl=64 indicate a direct same-network path, which is what the interconnect needs.
Both nodes have now been prepared, so let's move on to the next phase.
ASM Disks Configuration
Step 1: Review the Current Attached Disk
Before adding shared storage, it's worth confirming what's already attached, so the new shared disk is easy to identify once it appears:
[root@racprd1 ~]# fdisk -l
Disk /dev/sda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c6d14
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 27265023 12582912 83 Linux
/dev/sda3 27265024 37750783 5242880 82 Linux swap / Solaris
/dev/sda4 37750784 167772159 65010688 5 Extended
/dev/sda5 37752832 48238591 5242880 83 Linux
/dev/sda6 48240640 167772159 59765760 83 Linux
[root@racprd1 ~]#
Only /dev/sda exists at this point, and its sda6 partition is the /u01 filesystem, so any new disk that appears afterwards is the shared one.
Step 2: Create and Attach a Shared Hard Disk
A shared disk needs the "Shareable" type set explicitly and must be attached to both machines individually; ASM will later use it, and both nodes need concurrent, coordinated access for RAC to work. Shut down both machines first.
In the left panel, click the Media icon. Then, in the Hard disk section, click Create.
Provide the disk name and size, select the hard disk type as VDI, and select Pre-Allocate since it will be used as ASM storage. Click Finish.
VirtualBox only allows a disk to be marked Shareable when it is fixed size, which is why Pre-Allocate is chosen instead of a dynamically allocated disk. The type also cannot be changed while the disk is attached to a running VM, so keep both machines powered off.
Monitor the progress.
Once completed, the hard disk can be viewed. Change its Type from Normal to Shareable, then click Apply.
Select the first machine, then click Storage. Under the controller SATA section, click Add Hard Disk.
Select the disk name and click Choose.
Click OK.
Do the same steps for Node 2, attaching the same shared disk.
The storage tab now shows the added hard disk on both nodes.
Step 3: Verify the New Disk on Both Nodes
Once both machines are started again, the new shared disk should appear as /dev/sdb identically on both nodes, since it's the same underlying disk:
Node 1:
[root@racprd1 ~]# fdisk -l
Disk /dev/sdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c6d14
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 27265023 12582912 83 Linux
/dev/sda3 27265024 37750783 5242880 82 Linux swap / Solaris
/dev/sda4 37750784 167772159 65010688 5 Extended
/dev/sda5 37752832 48238591 5242880 83 Linux
/dev/sda6 48240640 167772159 59765760 83 Linux
[root@racprd1 ~]#
Node 2:
[root@racprd2 ~]# fdisk -l
Disk /dev/sdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c6d14
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 27265023 12582912 83 Linux
/dev/sda3 27265024 37750783 5242880 82 Linux swap / Solaris
/dev/sda4 37750784 167772159 65010688 5 Extended
/dev/sda5 37752832 48238591 5242880 83 Linux
/dev/sda6 48240640 167772159 59765760 83 Linux 54532096 167772159 113240064 54G 83 Linux
[root@rac2 ~]#
Both nodes report /dev/sdb at 64.4 GB with no partition table yet, and identical size and device name confirm the same virtual disk is attached to each machine.
Step 4: Partition the New Disk
Three partitions are carved out of the shared disk here, one each for the CRS, DATA, and FRA diskgroups created later. Partitioning is only ever done from one node; the second node will see the same partition table since it's the same physical disk:
[root@racprd1 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x246fcf14.
Command (m for help): n Press "n" for new partition:
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): Press Enter for default.
Using default response p.
Partition number (1-4, default 1): Press Enter for default:
Provide size:
First sector (2048-125829119, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-125829119, default 125829119): +35G
Partition 1 of type Linux and of size 35 GiB is set
Do same for next two partition:
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (73402368-125829119, default 73402368):
Using default value 73402368
Last sector, +sectors or +size{K,M,G} (73402368-125829119, default 125829119): +15G
Partition 2 of type Linux and of size 15 GiB is set
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
Partition number (3,4, default 3):
First sector (104859648-125829119, default 104859648):
Using default value 104859648
Last sector, +sectors or +size{K,M,G} (104859648-125829119, default 125829119):
Using default value 125829119
Partition 3 of type Linux and of size 10 GiB is set
Command (m for help): w Press "w" to save the changes:
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
View the partitions:
Node 1:
[root@racprd1 ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x246fcf14
Device Boot Start End Blocks Id System
/dev/sdb1 2048 73402367 36700160 83 Linux
/dev/sdb2 73402368 104859647 15728640 83 Linux
/dev/sdb3 104859648 125829119 10484736 83 Linux
[root@racprd1 ~]#
Node 2:
[root@racprd2 ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x246fcf14
Device Boot Start End Blocks Id System
/dev/sdb1 2048 73402367 36700160 83 Linux
/dev/sdb2 73402368 104859647 15728640 83 Linux
/dev/sdb3 104859648 125829119 10484736 83 Linux
[root@racprd2 ~]#
The 35G, 15G, and remaining 10G partitions become sdb1, sdb2, and sdb3, which the next steps label DATA1, FRA1, and CRS1. Node 2 listing the same table without partitioning anything itself shows the disk is genuinely shared.
Step 5: Configure oracleasm
Initializing ASMLib creates the kernel driver mount point, and configure -i sets the driver to load automatically on boot with the correct ownership for the oracle/oinstall pair. We need to do this on both nodes.
Node 1:
[root@racprd1 ~]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Configuring "oracleasm" to use device physical block size
Mounting ASMlib driver filesystem: /dev/oracleasm
[root@racprd1 ~]#
[root@racprd1 ~]# oracleasm configure -i
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: oinstall
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
[root@racprd1 ~]#
Node 2:
[root@racprd2 ~]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Configuring "oracleasm" to use device physical block size
Mounting ASMlib driver filesystem: /dev/oracleasm
[root@racprd2 ~]#
[root@racprd2 ~]#
[root@racprd2 ~]# oracleasm configure -i
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: oinstall
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
[root@racprd2 ~]#
The owner and group answers (oracle and oinstall) decide who can open the device files under /dev/oracleasm/disks, so the Grid installer running as oracle can read them. That same path is what diskDiscoveryString points to in the Grid response file.
Step 6: Create ASM Disks
Label each partition as an ASMLib disk, then scan and list to confirm all three are recognized:
root@racprd1 ~]# oracleasm createdisk DATA1 /dev/sdb1
Writing disk header: done
Instantiating disk: done
[root@racprd1 ~]#
[root@racprd1 ~]# oracleasm createdisk FRA1 /dev/sdb2
Writing disk header: done
Instantiating disk: done
[root@racprd1 ~]#
[root@racprd1 ~]#
[root@racprd1 ~]# oracleasm createdisk CRS1 /dev/sdb3
Writing disk header: done
Instantiating disk: done
[root@racprd1 ~]#
[root@racprd1 ~]#
[root@racprd1 ~]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
[root@racprd1 ~]#
[root@racprd1 ~]#
[root@racprd1 ~]# oracleasm listdisks
CRS1
DATA1
FRA1
[root@racprd1 ~]#
Disks are labeled from one node only, since the label is written into the disk header. Each label maps to /dev/oracleasm/disks/<label>, the path used later in the response file and the CREATE DISKGROUP statements.
Step 7: Scan & list disks on Node 2
We don't need to create the disks on Node 2, so just scan the disks on Node 2 and list them:
[root@racprd2 ~]# oracleasm listdisks
[root@racprd2 ~]#
[root@racprd2 ~]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "DATA1"
Instantiating disk "FRA1"
Instantiating disk "CRS1"
[root@racprd2 ~]#
[root@racprd2 ~]# oracleasm listdisks
CRS1
DATA1
FRA1
[root@racprd2 ~]#
The empty first listdisks is expected because Node 2 has not read the disk headers yet. After scandisks it instantiates all three labels, proving the headers written from Node 1 are visible through the shared disk.
ASM disk configuration is now complete, so let's move on to the next phase.
Oracle Cluster Verification Utility (CVU) Validation
We need to run the runcluvfy.sh script, which ships in the Grid Home software. It is the Oracle Cluster Verification Utility (CVU) script used to validate Oracle RAC environment readiness. Before running it, we need passwordless SSH connectivity between the nodes, since both CVU and the Grid installer rely on it.
Step 1: Unzip the Grid Home Software
The Grid Home is unzipped directly into the empty directory created back in Step 4 of Node Preparation, since that directory is what ORACLE_HOME already points to:
[oracle@racprd1 software]$ pwd
/home/oracle/software
[oracle@racprd1 software]$ ls -lrth
total 2.7G
-rw-r--r--. 1 oracle oinstall 2.7G Sep 25 18:58 LINUX.X64_193000_grid_home.zip
[oracle@racprd1 software]$ unzip LINUX.X64_193000_grid_home.zip -d /u01/app/grid/19c/grid_1/
The 19c Grid software is image based, so the zip is extracted straight into the final home and there is no separate install copy. Extract it on Node 1 only; the installer copies the software to Node 2 during setup.
Step 2: Run sshUserSetup.sh
Syntax: ./sshUserSetup.sh -user "username" -hosts "node1 node2" -noPromptPassphrase -confirm -advanced
This script, shipped inside the Grid Home, does the actual key exchange: it copies each node's public key to the other node's authorized_keys and verifies the result, so oracle can SSH between nodes without a password afterward, which is a hard requirement for both CVU and the Grid installer:
[oracle@racprd1 ~]$ find /u01/app/grid -name sshUserSetup.sh 2>/dev/null
/u01/app/grid/19c/grid_1/oui/prov/resources/scripts/sshUserSetup.sh
/u01/app/grid/19c/grid_1/deinstall/sshUserSetup.sh
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ cd /u01/app/grid/19c/grid_1/deinstall
[oracle@racprd1 deinstall]$
[oracle@racprd1 deinstall]$ ./sshUserSetup.sh -user oracle -hosts "racprd1 racprd2" -noPromptPassphrase -confirm -advanced
The output of this script is also logged into /tmp/sshUserSetup_2026-09-25-19-25-34.log
Hosts are racprd1 racprd2
user is oracle
Platform:- Linux
Checking if the remote hosts are reachable
PING racprd1.oraeasy.com (192.168.80.61) 56(84) bytes of data.
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=2 ttl=64 time=0.331 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=4 ttl=64 time=0.083 ms
64 bytes from racprd1.oraeasy.com (192.168.80.61): icmp_seq=5 ttl=64 time=0.090 ms
--- racprd1.oraeasy.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4455ms
rtt min/avg/max/mdev = 0.045/0.126/0.331/0.103 ms
PING racprd2.oraeasy.com (192.168.80.62) 56(84) bytes of data.
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=1 ttl=64 time=0.972 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=2 ttl=64 time=1.11 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=3 ttl=64 time=0.986 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=4 ttl=64 time=1.00 ms
64 bytes from racprd2.oraeasy.com (192.168.80.62): icmp_seq=5 ttl=64 time=0.893 ms
--- racprd2.oraeasy.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4024ms
rtt min/avg/max/mdev = 0.893/0.992/1.112/0.080 ms
Remote host reachability check succeeded.
The following hosts are reachable: racprd1 racprd2.
The following hosts are not reachable: .
All hosts are reachable. Proceeding further...
firsthost racprd1
numhosts 2
The script will setup SSH connectivity from the host racprd1.oraeasy.com to all
the remote hosts. After the script is executed, the user can use SSH to run
commands on the remote hosts or copy files between this host racprd1.oraeasy.com
and the remote hosts without being prompted for passwords or confirmations.
NOTE 1:
As part of the setup procedure, this script will use ssh and scp to copy
files between the local host and the remote hosts. Since the script does not
store passwords, you may be prompted for the passwords during the execution of
the script whenever ssh or scp is invoked.
NOTE 2:
AS PER SSH REQUIREMENTS, THIS SCRIPT WILL SECURE THE USER HOME DIRECTORY
AND THE .ssh DIRECTORY BY REVOKING GROUP AND WORLD WRITE PRIVILEGES TO THESE
directories.
Do you want to continue and let the script make the above mentioned changes (yes/no)?
Confirmation provided on the command line
The user chose yes
User chose to skip passphrase related questions.
Creating .ssh directory on local host, if not present already
Creating authorized_keys file on local host
Changing permissions on authorized_keys to 644 on local host
Creating known_hosts file on local host
Changing permissions on known_hosts to 644 on local host
Creating config file on local host
If a config file exists already at /home/oracle/.ssh/config, it would be backed up to /home/oracle/.ssh/config.backup.
Creating .ssh directory and setting permissions on remote host racprd1
THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR oracle. THIS IS AN SSH REQUIREMENT.
The script would create ~oracle/.ssh/config file on remote host racprd1. If a config file exists already at ~oracle/.ssh/config, it would be backed up to ~oracle/.ssh/config.backup.
The user may be prompted for a password here since the script would be running SSH on host racprd1.
Warning: Permanently added 'racprd1,192.168.80.61' (ECDSA) to the list of known hosts.
oracle@racprd1's password:
Done with creating .ssh directory and setting permissions on remote host racprd1.
Creating .ssh directory and setting permissions on remote host racprd2
THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR oracle. THIS IS AN SSH REQUIREMENT.
The script would create ~oracle/.ssh/config file on remote host racprd2. If a config file exists already at ~oracle/.ssh/config, it would be backed up to ~oracle/.ssh/config.backup.
The user may be prompted for a password here since the script would be running SSH on host racprd2.
Warning: Permanently added 'racprd2,192.168.80.62' (ECDSA) to the list of known hosts.
Done with creating .ssh directory and setting permissions on remote host racprd2.
Copying local host public key to the remote host racprd1
The user may be prompted for a password or passphrase here since the script would be using SCP for host racprd1.
oracle@racprd1's password:
Done copying local host public key to the remote host racprd1
Copying local host public key to the remote host racprd2
The user may be prompted for a password or passphrase here since the script would be using SCP for host racprd2.
Done copying local host public key to the remote host racprd2
Creating keys on remote host racprd1 if they do not exist already. This is required to setup SSH on host racprd1.
Creating keys on remote host racprd2 if they do not exist already. This is required to setup SSH on host racprd2.
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa.
Your public key has been saved in .ssh/id_rsa.pub.
The key fingerprint is:
0a:04:75:20:9b:46:c4:69:3f:b0:7e:32:15:45:17:04 oracle@racprd2.oraeasy.com
The key's randomart image is:
+--[ RSA 1024]----+
| o=oo+Eo+. |
| .==.. . |
| .++.. |
| ...+ |
| . ... S |
| + .. . |
| + . |
| |
| |
+-----------------+
Updating authorized_keys file on remote host racprd1
Updating known_hosts file on remote host racprd1
Updating authorized_keys file on remote host racprd2
Updating known_hosts file on remote host racprd2
cat: /home/oracle/.ssh/known_hosts.tmp: No such file or directory
cat: /home/oracle/.ssh/authorized_keys.tmp: No such file or directory
SSH setup is complete.
------------------------------------------------------------------------
Verifying SSH setup
===================
The script will now run the date command on the remote nodes using ssh
to verify if ssh is setup correctly. IF THE SETUP IS CORRECTLY SETUP,
THERE SHOULD BE NO OUTPUT OTHER THAN THE DATE AND SSH SHOULD NOT ASK FOR
PASSWORDS. If you see any output other than date or are prompted for the
password, ssh is not setup correctly and you will need to resolve the
issue and set up ssh again.
The possible causes for failure could be:
1. The server settings in /etc/ssh/sshd_config file do not allow ssh
for user oracle.
2. The server may have disabled public key based authentication.
3. The client public key on the server may be outdated.
4. ~oracle or ~oracle/.ssh on the remote host may not be owned by oracle.
5. User may not have passed -shared option for shared remote users or
may be passing the -shared option for non-shared remote users.
6. If there is output in addition to the date, but no password is asked,
it may be a security alert shown as part of company policy. Append the
additional text to the /sysman/prov/resources/ignoreMessages.txt file.
------------------------------------------------------------------------
--racprd1:--
Running /usr/bin/ssh -x -l oracle racprd1 date to verify SSH connectivity has been setup from local host to racprd1.
IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR.
Fri Sep 25 19:25:52 IST 2026
------------------------------------------------------------------------
--racprd2:--
Running /usr/bin/ssh -x -l oracle racprd2 date to verify SSH connectivity has been setup from local host to racprd2.
IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR.
Fri Sep 25 19:25:52 IST 2026
------------------------------------------------------------------------
------------------------------------------------------------------------
Verifying SSH connectivity has been setup from racprd1 to racprd1
IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL.
Fri Sep 25 19:25:53 IST 2026
------------------------------------------------------------------------
------------------------------------------------------------------------
Verifying SSH connectivity has been setup from racprd1 to racprd2
IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL.
Fri Sep 25 19:25:53 IST 2026
------------------------------------------------------------------------
-Verification from complete-
SSH verification complete.
[oracle@racprd1 deinstall]$
The two cat errors near the end about .tmp files did not stop the run, since verification then printed the date from every host pair without a password prompt. That is the result to look for.
Step 4: Verify Passwordless Connectivity
An SSH login that completes with no password prompt on either side confirms the key exchange took effect correctly:
Node 1:
[oracle@racprd1 deinstall]$ ssh racprd2
Last login: Fri Sep 25 19:19:21 2026 from racprd1.oraeasy.com
[oracle@racprd2 ~] hostname;date
racprd2.oraeasy.com
Fri Sep 25 19:27:22 IST 2026
[oracle@racprd2 ~]
Node 2:
[oracle@racprd2 ~]$ ssh racprd1
Last login: Fri Sep 25 19:19:43 2026 from racprd2.oraeasy.com
[oracle@racprd1 ~]$ hostname;date
racprd1.oraeasy.com
Fri Sep 25 19:27:35 IST 2026
[oracle@racprd1 ~]$
Step 5: Run runcluvfy.sh
This is the first end-to-end readiness check across both nodes together, covering memory, swap, package versions, name resolution, and several daemons that can interfere with Grid Infrastructure. It must run as oracle from the Grid home, and -verbose prints a per-node result for every check:
[oracle@racprd1 grid_1]$ pwd
/u01/app/grid/19c/grid_1
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$ ls runcluvfy.sh
runcluvfy.sh
[oracle@racprd1 grid_1]$ ./runcluvfy.sh stage -pre crsinst -n racprd1,racprd2 -verbose
Verifying Physical Memory ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 4.5905GB (4813452.0KB) 8GB (8388608.0KB) failed
racprd1 4.5905GB (4813452.0KB) 8GB (8388608.0KB) failed
Verifying Physical Memory ...FAILED (PRVF-7530)
Verifying Available Physical Memory ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 4.2583GB (4465188.0KB) 50MB (51200.0KB) passed
racprd1 3.8498GB (4036816.0KB) 50MB (51200.0KB) passed
Verifying Available Physical Memory ...PASSED
Verifying Swap Size ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 5GB (5242876.0KB) 4.5905GB (4813452.0KB) passed
racprd1 5GB (5242876.0KB) 4.5905GB (4813452.0KB) passed
Verifying Swap Size ...PASSED
Verifying Free Space: racprd2:/usr,racprd2:/var,racprd2:/etc,racprd2:/sbin ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/usr racprd2 / 6.9541GB 25MB passed
/var racprd2 / 6.9541GB 5MB passed
/etc racprd2 / 6.9541GB 25MB passed
/sbin racprd2 / 6.9541GB 10MB passed
Verifying Free Space: racprd2:/usr,racprd2:/var,racprd2:/etc,racprd2:/sbin ...PASSED
Verifying Free Space: racprd2:/tmp ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/tmp racprd2 /tmp 5.1846GB 1GB passed
Verifying Free Space: racprd2:/tmp ...PASSED
Verifying Free Space: racprd1:/usr,racprd1:/var,racprd1:/etc,racprd1:/sbin ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/usr racprd1 / 4.1367GB 25MB passed
/var racprd1 / 4.1367GB 5MB passed
/etc racprd1 / 4.1367GB 25MB passed
/sbin racprd1 / 4.1367GB 10MB passed
Verifying Free Space: racprd1:/usr,racprd1:/var,racprd1:/etc,racprd1:/sbin ...PASSED
Verifying Free Space: racprd1:/tmp ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/tmp racprd1 /tmp 5.1699GB 1GB passed
Verifying Free Space: racprd1:/tmp ...PASSED
Verifying User Existence: oracle ...
Node Name Status Comment
------------ ------------------------ ------------------------
racprd2 passed exists(54321)
racprd1 passed exists(54321)
..............
..............
..............
..............
Pre-check for cluster services setup was unsuccessful on all the nodes.
Failures were encountered during execution of CVU verification request "stage -pre crsinst".
Verifying Physical Memory ...FAILED
racprd2: PRVF-7530 : Sufficient physical memory is not available on node
"racprd2" [Required physical memory = 8GB (8388608.0KB)]
racprd1: PRVF-7530 : Sufficient physical memory is not available on node
"racprd1" [Required physical memory = 8GB (8388608.0KB)]
Verifying Package: kmod-20-21 (x86_64) ...FAILED
racprd2: PRVF-7533 : Proper version of package "kmod" is not found on node
"racprd2" [Required = "kmod(x86_64)-20-21" ; Found =
"kmod(x86_64)-20-9.el7"].
racprd1: PRVF-7533 : Proper version of package "kmod" is not found on node
"racprd1" [Required = "kmod(x86_64)-20-21" ; Found =
"kmod(x86_64)-20-9.el7"].
Verifying Package: kmod-libs-20-21 (x86_64) ...FAILED
racprd2: PRVF-7533 : Proper version of package "kmod-libs" is not found on node
"racprd2" [Required = "kmod-libs(x86_64)-20-21" ; Found =
"kmod-libs(x86_64)-20-9.el7"].
racprd1: PRVF-7533 : Proper version of package "kmod-libs" is not found on node
"racprd1" [Required = "kmod-libs(x86_64)-20-21" ; Found =
"kmod-libs(x86_64)-20-9.el7"].
Verifying Package: cvuqdisk-1.0.10-1 ...FAILED
racprd2: PRVG-11550 : Package "cvuqdisk" is missing on node "racprd2"
racprd1: PRVG-11550 : Package "cvuqdisk" is missing on node "racprd1"
Verifying Node Connectivity ...FAILED
PRVG-1172 : The IP address "192.168.122.1" is on multiple interfaces "virbr0"
on nodes "racprd2,racprd1"
racprd2: PRVG-11067 : TCP connectivity from node "racprd2": "192.168.122.1" to
node "racprd2": "192.168.122.1" failed.
PRVG-11095 : The TCP system call "connect" failed with error "111"
while executing exectask on node "racprd2"
Connection refused
racprd2: PRVG-11067 : TCP connectivity from node "racprd2": "192.168.122.1" to
node "racprd1": "192.168.122.1" failed.
PRVG-11095 : The TCP system call "connect" failed with error "111"
while executing exectask on node "racprd2"
Connection refused
Verifying Network Time Protocol (NTP) ...FAILED
racprd2: PRVG-1017 : NTP configuration file "/etc/chrony.conf" is present on
nodes "racprd2,racprd1" on which NTP daemon or service was not running
racprd1: PRVG-1017 : NTP configuration file "/etc/chrony.conf" is present on
nodes "racprd2,racprd1" on which NTP daemon or service was not running
Verifying resolv.conf Integrity ...FAILED
racprd2: PRVG-10048 : Name "racprd2" was not resolved to an address of the
specified type by name servers "192.168.1.1".
racprd1: PRVG-10048 : Name "racprd1" was not resolved to an address of the
specified type by name servers "192.168.1.1".
Verifying Daemon "avahi-daemon" not configured and running ...FAILED
racprd2: PRVG-1359 : Daemon process "avahi-daemon" is configured on node
"racprd2"
racprd2: PRVG-1360 : Daemon process "avahi-daemon" is running on node "racprd2"
racprd1: PRVG-1359 : Daemon process "avahi-daemon" is configured on node
"racprd1"
racprd1: PRVG-1360 : Daemon process "avahi-daemon" is running on node "racprd1"
Verifying RPM Package Manager database ...INFORMATION
PRVG-11250 : The check "RPM Package Manager database" was not performed because
it needs 'root' user privileges.
CVU operation performed: stage -pre crsinst
Date: Sep 26, 2026 3:01:36 PM
CVU home: /u01/app/grid/19c/grid_1/
User: oracle
[oracle@racprd1 grid_1]$
This first run fails by design, and each failure maps to a later fix: PRVF-7530 (memory) is a lab limitation, the kmod and cvuqdisk failures are fixed with yum and rpm, avahi-daemon is stopped, and the NTP failure is handled with chrony. The virbr0 and resolv.conf failures do not block the install, and PRVG-11250 only means the RPM database check needs root.
Step 6: Fix the Reported Failures
Physical Memory and resolv.conf Integrity can be ignored here, since this is a deliberately memory-constrained lab with no real DNS. The package failures (kmod, kmod-libs, cvuqdisk) and the avahi-daemon mDNS service are worth fixing before proceeding, because the daemon can interfere with the cluster's network name handling:
avahi-daemon:
[root@racprd1 ~]# systemctl stop avahi-daemon
Warning: Stopping avahi-daemon.service, but it can still be activated by:
avahi-daemon.socket
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl disable avahi-daemon
Removed symlink /etc/systemd/system/multi-user.target.wants/avahi-daemon.service.
Removed symlink /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.Avahi.service.
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service; disabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2026-09-26 16:44:55 IST; 15s ago
Main PID: 622 (code=exited, status=0/SUCCESS)
Status: "avahi-daemon 0.6.31 starting up."
Sep 26 15:14:46 racprd1.oraeasy.com avahi-daemon[622]: Withdrawing address record for fe80::a00:27ff:fec3:66c7 on enp0s3.
Sep 26 15:14:46 racprd1.oraeasy.com avahi-daemon[622]: Withdrawing address record for 192.168.1.61 on enp0s3.
Sep 26 15:14:46 racprd1.oraeasy.com avahi-daemon[622]: Leaving mDNS multicast group on interface enp0s3.IPv4 with address 192.168.1.61.
Sep 26 15:14:46 racprd1.oraeasy.com avahi-daemon[622]: Interface enp0s3.IPv4 no longer relevant for mDNS.
Sep 26 15:14:48 racprd1.oraeasy.com avahi-daemon[622]: Joining mDNS multicast group on interface enp0s3.IPv4 with address 192.168.1.11.
Sep 26 15:14:48 racprd1.oraeasy.com avahi-daemon[622]: New relevant interface enp0s3.IPv4 for mDNS.
Sep 26 15:14:48 racprd1.oraeasy.com avahi-daemon[622]: Registering new address record for 192.168.1.11 on enp0s3.IPv4.
Sep 26 16:44:55 racprd1.oraeasy.com avahi-daemon[622]: Got SIGTERM, quitting.
Sep 26 16:44:55 racprd1.oraeasy.com systemd[1]: Stopping Avahi mDNS/DNS-SD Stack...
Sep 26 16:44:55 racprd1.oraeasy.com systemd[1]: Stopped Avahi mDNS/DNS-SD Stack.
[root@racprd1 ~]#
kmod-libs upgrade:
[root@racprd1 ~]# yum update kmod kmod-libs
Loaded plugins: langpacks, ulninfo
ol7_UEKR4 | 3.0 kB 00:00:00
ol7_latest | 3.6 kB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package kmod.x86_64 0:20-9.el7 will be updated
---> Package kmod.x86_64 0:20-28.0.3.el7 will be an update
---> Package kmod-libs.x86_64 0:20-9.el7 will be updated
---> Package kmod-libs.x86_64 0:20-28.0.3.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
====================================================================
Package Arch Version Repository Size
====================================================================
Updating:
kmod x86_64 20-28.0.3.el7 ol7_latest 125 k
kmod-libs x86_64 20-28.0.3.el7 ol7_latest 53 k
Transaction Summary
====================================================================
Upgrade 2 Packages
Total download size: 177 k
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for ol7_latest
(1/2): kmod-libs-20-28.0.3.el7.x86_64.rpm | 53 kB 00:00:03
(2/2): kmod-20-28.0.3.el7.x86_64.rpm | 125 kB 00:00:09
--------------------------------------------------------------------------------
Total 18 kB/s | 177 kB 00:00:09
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : kmod-20-28.0.3.el7.x86_64 1/4
Updating : kmod-libs-20-28.0.3.el7.x86_64 2/4
Cleanup : kmod-20-9.el7.x86_64 3/4
Cleanup : kmod-libs-20-9.el7.x86_64 4/4
Verifying : kmod-libs-20-28.0.3.el7.x86_64 1/4
Verifying : kmod-20-28.0.3.el7.x86_64 2/4
Verifying : kmod-20-9.el7.x86_64 3/4
Verifying : kmod-libs-20-9.el7.x86_64 4/4
Updated:
kmod.x86_64 0:20-28.0.3.el7 kmod-libs.x86_64 0:20-28.0.3.el7
Complete!
[root@racprd1 ~]# rpm -q kmod kmod-libs
kmod-20-28.0.3.el7.x86_64
kmod-libs-20-28.0.3.el7.x86_64
[root@racprd1 ~]#
Install cvuqdisk:
[root@racprd1 ~]# find /u01/app/grid/19c/grid_1 -name "cvuqdisk*.rpm"
/u01/app/grid/19c/grid_1/cv/remenv/cvuqdisk-1.0.10-1.rpm
/u01/app/grid/19c/grid_1/cv/rpm/cvuqdisk-1.0.10-1.rpm
[root@racprd1 ~]#
[root@racprd1 ~]# rpm -ivh /u01/app/grid/19c/grid_1/cv/rpm/cvuqdisk-1.0.10-1.rpm
Preparing... ################################# [100%]
Using default group oinstall to install package
Updating / installing...
1:cvuqdisk-1.0.10-1 ################################# [100%]
[root@racprd1 ~]#
[root@racprd1 ~]# rpm -qa | grep cvuqdisk
cvuqdisk-1.0.10-1.x86_64
[root@racprd1 ~]#
Scp cvuqdisk rpm to Node 2:
[root@racprd1 ~]# scp /u01/app/grid/19c/grid_1/cv/rpm/cvuqdisk-1.0.10-1.rpm racprd2:
The authenticity of host 'racprd2 (192.168.80.62)' can't be established.
ECDSA key fingerprint is e0:94:bb:c4:f7:04:b5:14:76:6c:d7:91:07:50:5e:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'racprd2,192.168.80.62' (ECDSA) to the list of known hosts.
root@racprd2's password:
cvuqdisk-1.0.10-1.rpm 100% 11KB 11.1KB/s 00:00
[root@racprd1 ~]#
The kmod update brings the packages to the version Grid 19c checks for, and cvuqdisk lets CVU and the installer discover shared disks by SCSI ID. It installs under the oinstall group and must exist on every node, which is why the RPM is copied to Node 2 with scp.
Step 7: Repeat on Node 2
The same fixes are applied on Node 2, since a cluster-wide precheck only clears when every node passes:
avahi-daemon:
[root@racprd2 ~]# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service; disabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2026-09-26 16:45:21 IST; 15s ago
Main PID: 628 (code=exited, status=0/SUCCESS)
Status: "avahi-daemon 0.6.31 starting up."
Sep 26 15:18:29 racprd2.oraeasy.com avahi-daemon[628]: New relevant interface enp0s3.IPv4 for mDNS.
Sep 26 15:18:29 racprd2.oraeasy.com avahi-daemon[628]: Registering new address record for 192.168.1.8 on enp0s3.IPv4.
Sep 26 16:45:21 racprd2.oraeasy.com systemd[1]: Stopping Avahi mDNS/DNS-SD Stack...
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: Got SIGTERM, quitting.
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: Leaving mDNS multicast group on interface virbr0.IPv4 with address 192.168.122.1.
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: Leaving mDNS multicast group on interface enp0s9.IPv4 with address 192.168.10.62.
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: Leaving mDNS multicast group on interface enp0s8.IPv4 with address 192.168.80.62.
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: Leaving mDNS multicast group on interface enp0s3.IPv4 with address 192.168.1.8.
Sep 26 16:45:21 racprd2.oraeasy.com avahi-daemon[628]: avahi-daemon 0.6.31 exiting.
Sep 26 16:45:21 racprd2.oraeasy.com systemd[1]: Stopped Avahi mDNS/DNS-SD Stack.
[root@racprd2 ~]#
kmod-libs upgrade:
[root@racprd2 ~]# rpm -q kmod kmod-libs
kmod-20-28.0.3.el7.x86_64
kmod-libs-20-28.0.3.el7.x86_64
Install cvuqdisk:
[root@racprd2 ~]# ls -lrth cvu*
total 12K
-rw-r--r--. 1 root root 12K Sep 26 15:20 cvuqdisk-1.0.10-1.rpm
[root@racprd2 ~]#
[root@racprd2 ~]# rpm -ivh cvuqdisk-1.0.10-1.rpm
Preparing... ################################# [100%]
Using default group oinstall to install package
Updating / installing...
1:cvuqdisk-1.0.10-1 ################################# [100%]
[root@racprd2 ~]#
[root@racprd2 ~]#
[root@racprd2 ~]# rpm -qa | grep cvuqdisk
cvuqdisk-1.0.10-1.x86_64
Step 8: Configure NTP
NTP (Network Time Protocol) is a protocol used to synchronize system clocks across servers, ensuring that all RAC nodes maintain consistent and accurate time. For the RAC installation, time synchronization between all cluster nodes is important because Oracle Clusterware depends on consistent system time.
In our lab environment, the RAC nodes did not have access to an external NTP server. Therefore, we configured racprd1 as the local Chrony time source and configured racprd2 to synchronize its time from racprd1 over the private RAC network.
On Node 1:
[root@racprd1 ~]# cp /etc/chrony.conf /etc/chrony.conf_bkp
[root@racprd1 ~]#
[root@racprd1 ~]# vi /etc/chrony.conf
[root@racprd1 ~]# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# These servers are currently unreachable because this RAC lab
# does not have external network access.
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
# Ignore stratum in source selection.
stratumweight 0
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Enable kernel RTC synchronization.
rtcsync
# In first three updates step the system clock instead of slew
# if the adjustment is larger than 10 seconds.
makestep 10 3
# Allow RAC private network clients to synchronize time from this node.
allow 192.168.10.0/24
# Listen for commands only on localhost.
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
# Serve time even if not synchronized to an external NTP server.
local stratum 10
keyfile /etc/chrony.keys
# Specify the key used as password for chronyc.
commandkey 1
# Generate command key if missing.
generatecommandkey
# Disable logging of client accesses.
noclientlog
# Send a message to syslog if a clock adjustment is larger than 0.5 seconds.
logchange 0.5
logdir /var/log/chrony
#log measurements statistics tracking
[root@racprd1 ~]#
[root@racprd1 ~]# systemctl restart chronyd
[root@racprd1 ~]#
[root@racprd1 ~]# chronyc tracking
Reference ID : 127.127.1.1 ()
Stratum : 10
Ref time (UTC) : Sat Sep 26 11:47:08 2026
System time : 0.000000000 seconds slow of NTP time
Last offset : +0.000000000 seconds
RMS offset : 0.000000000 seconds
Frequency : 8.406 ppm slow
Residual freq : +0.000 ppm
Skew : 0.000 ppm
Root delay : 0.000000 seconds
Root dispersion : 0.000001 seconds
Update interval : 0.0 seconds
Leap status : Not synchronised
[root@racprd1 ~]#
[root@racprd1 ~]# chronyc sources -v
210 Number of sources = 0
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
[root@racprd1 ~]#
[root@racprd1 ~]# date
Sat Sep 26 17:20:01 IST 2026
[root@racprd1 ~]#
On Node 2:
[root@racprd2 ~]# cp /etc/chrony.conf /etc/chrony.conf_bkp
[root@racprd2 ~]# vi /etc/chrony.conf
[root@racprd2 ~]# cat /etc/chrony.conf
# Use racprd1 as the NTP server.
server 192.168.10.61 iburst
# Ignore stratum in source selection.
stratumweight 0
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Enable kernel RTC synchronization.
rtcsync
# In first three updates step the system clock instead of slew
# if the adjustment is larger than 10 seconds.
makestep 10 3
# Listen for commands only on localhost.
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
# Specify the key used as password for chronyc.
commandkey 1
# Generate command key if missing.
generatecommandkey
# Disable logging of client accesses.
noclientlog
# Send a message to syslog if a clock adjustment is larger than 0.5 seconds.
logchange 0.5
logdir /var/log/chrony
#log measurements statistics tracking
[root@racprd2 ~]#
[root@racprd2 ~]# systemctl restart chronyd
[root@racprd2 ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* racprd1-priv.oraeasy.com 10 6 17 8 +128us[+1759us] +/- 533us
[root@racprd2 ~]#
[root@racprd2 ~]# chronyc tracking
Reference ID : 192.168.10.61 (racprd1-priv.oraeasy.com)
Stratum : 11
Ref time (UTC) : Sat Sep 26 11:48:48 2026
System time : 0.000012707 seconds slow of NTP time
Last offset : +0.001631472 seconds
RMS offset : 0.001631472 seconds
Frequency : 20.861 ppm slow
Residual freq : +351.279 ppm
Skew : 103.410 ppm
Root delay : 0.000985 seconds
Root dispersion : 0.007055 seconds
Update interval : 2.1 seconds
Leap status : Normal
[root@racprd2 ~]#
[root@racprd2 ~]# date
Sat Sep 26 17:20:04 IST 2026
[root@racprd2 ~]#
With no external time source, Node 1 serves its own clock through local stratum 10, and allow 192.168.10.0/24 lets the private network request time from it. That is why Node 1 shows zero sources and a 127.127.1.1 reference, while Node 2 selects Node 1 (^*) at stratum 11 with a normal leap status. Both clocks now agree, which is what clusterware needs, but CVU will still flag the missing external source.
Step 9: Re-run runcluvfy.sh
After the fixes, the memory and DNS failures remain as expected, along with two environment-related ones: the virbr0 bridge and the lack of an external time source:
[oracle@racprd1 grid_1]$ ./runcluvfy.sh stage -pre crsinst -n racprd1,racprd2 -verbose
Verifying Physical Memory ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 4.5905GB (4813452.0KB) 8GB (8388608.0KB) failed
racprd1 4.5905GB (4813452.0KB) 8GB (8388608.0KB) failed
Verifying Physical Memory ...FAILED (PRVF-7530)
Verifying Available Physical Memory ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 3.8829GB (4071468.0KB) 50MB (51200.0KB) passed
racprd1 2.8856GB (3025728.0KB) 50MB (51200.0KB) passed
Verifying Available Physical Memory ...PASSED
Verifying Swap Size ...
Node Name Available Required Status
------------ ------------------------ ------------------------ ----------
racprd2 5GB (5242876.0KB) 4.5905GB (4813452.0KB) passed
racprd1 5GB (5242876.0KB) 4.5905GB (4813452.0KB) passed
Verifying Swap Size ...PASSED
Verifying Free Space: racprd2:/usr,racprd2:/var,racprd2:/etc,racprd2:/sbin ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/usr racprd2 / 6.9209GB 25MB passed
/var racprd2 / 6.9209GB 5MB passed
/etc racprd2 / 6.9209GB 25MB passed
/sbin racprd2 / 6.9209GB 10MB passed
Verifying Free Space: racprd2:/usr,racprd2:/var,racprd2:/etc,racprd2:/sbin ...PASSED
Verifying Free Space: racprd2:/tmp ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/tmp racprd2 /tmp 5.1846GB 1GB passed
Verifying Free Space: racprd2:/tmp ...PASSED
Verifying Free Space: racprd1:/usr,racprd1:/var,racprd1:/etc,racprd1:/sbin ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/usr racprd1 / 4.1084GB 25MB passed
/var racprd1 / 4.1084GB 5MB passed
/etc racprd1 / 4.1084GB 25MB passed
/sbin racprd1 / 4.1084GB 10MB passed
Verifying Free Space: racprd1:/usr,racprd1:/var,racprd1:/etc,racprd1:/sbin ...PASSED
Verifying Free Space: racprd1:/tmp ...
Path Node Name Mount point Available Required Status
---------------- ------------ ------------ ------------ ------------ ------------
/tmp racprd1 /tmp 5.1309GB 1GB passed
Verifying Free Space: racprd1:/tmp ...PASSED
Verifying User Existence: oracle ...
Node Name Status Comment
------------ ------------------------ ------------------------
racprd2 passed exists(54321)
racprd1 passed exists(54321)
..............
..............
..............
..............
Pre-check for cluster services setup was unsuccessful on all the nodes.
Failures were encountered during execution of CVU verification request "stage -pre crsinst".
Verifying Physical Memory ...FAILED
racprd2: PRVF-7530 : Sufficient physical memory is not available on node
"racprd2" [Required physical memory = 8GB (8388608.0KB)]
racprd1: PRVF-7530 : Sufficient physical memory is not available on node
"racprd1" [Required physical memory = 8GB (8388608.0KB)]
Verifying Node Connectivity ...FAILED
PRVF-6006 : unable to reach the IP addresses "192.168.122.1" from the local node
PRKC-1071 : Nodes "192.168.122.1" did not respond to ping in "3" seconds,
PRKN-1035 : Host "192.168.122.1" is unreachable
PRVG-11078 : node connectivity failed for subnet "192.168.122.0"
Verifying Network Time Protocol (NTP) ...FAILED
Verifying chrony daemon is synchronized with at least one external time
source ...FAILED
racprd1: PRVG-13606 : chrony daemon is not synchronized with any external
time source on node "racprd1".
Verifying resolv.conf Integrity ...FAILED
racprd2: PRVF-5636 : The DNS response time for an unreachable node exceeded
"15000" ms on following nodes: racprd1,racprd2
racprd2: PRVG-2064 : There are no configured name servers in the file
'/etc/resolv.conf' on the nodes "racprd1,racprd2"
racprd1: PRVF-5636 : The DNS response time for an unreachable node exceeded
"15000" ms on following nodes: racprd1,racprd2
racprd1: PRVG-2064 : There are no configured name servers in the file
'/etc/resolv.conf' on the nodes "racprd1,racprd2"
Verifying RPM Package Manager database ...INFORMATION
PRVG-11250 : The check "RPM Package Manager database" was not performed because
it needs 'root' user privileges.
CVU operation performed: stage -pre crsinst
Date: Sep 26, 2026 5:28:04 PM
CVU home: /u01/app/grid/19c/grid_1/
User: oracle
[oracle@racprd1 grid_1]$
Each remaining failure is safe in this lab. virbr0 is the libvirt bridge at 192.168.122.1, not one of the cluster networks, and the Grid response file restricts the interface list to enp0s8 and enp0s9. The chrony result reflects the local-clock design above, and the memory and resolv.conf failures are why -ignorePrereqFailure is used later. Avahi, kmod, and cvuqdisk no longer appear, so those fixes worked.
The fixable failures are now resolved, so let's proceed to the next phase.
Oracle Grid Infrastructure Installation
Step 1: Prepare the response file for Grid Infrastructure Installation
Modify the response file as per your environment:
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ env|grep ORA
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/19c/grid_1
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ cd /u01/app/grid/19c/grid_1
[oracle@racprd1 grid_1]$ cd install/response/
[oracle@racprd1 response]$
[oracle@racprd1 response]$ ls -lrth
total 40K
-rw-r-----. 1 oracle oinstall 1.6K May 21 2016 sample.ccf
-rw-r-----. 1 oracle oinstall 36K Jan 19 2019 gridsetup.rsp
[oracle@racprd1 response]$ mv gridsetup.rsp gridsetup.rsp_bkp
[oracle@racprd1 response]$
[oracle@racprd1 response]$ vi gridsetup.rsp
[oracle@racprd1 response]$ ls -lrth
total 76K
-rw-r-----. 1 oracle oinstall 1.6K May 21 2016 sample.ccf
-rw-r-----. 1 oracle oinstall 36K Jan 19 2019 gridsetup.rsp_bkp
-rw-r--r--. 1 oracle oinstall 36K Sep 27 17:16 gridsetup.rsp
Modified parameters:
INVENTORY_LOCATION=/u01/app/oraInventory
oracle.install.option=CRS_CONFIG
ORACLE_BASE=/u01/app/grid
oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin
oracle.install.crs.config.scanType=LOCAL_SCAN
oracle.install.crs.config.gpnp.scanName=racprd-scan.oraeasy.com
oracle.install.crs.config.gpnp.scanPort=1521
oracle.install.crs.config.ClusterConfiguration=STANDALONE
oracle.install.crs.config.clusterName=racprd
oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.autoConfigureClusterNodeVIP=false
oracle.install.crs.config.clusterNodes=racprd1.oraeasy.com:racprd1-vip.oraeasy.com,racprd2.oraeasy.com:racprd2-vip.oraeasy.com
oracle.install.crs.config.networkInterfaceList=enp0s8:192.168.80.0:1,enp0s9:192.168.10.0:5
oracle.install.crs.configureGIMR=false
oracle.install.asm.configureGIMRDataDG=false
oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE
oracle.install.asm.SYSASMPassword=Oracle123
oracle.install.asm.diskGroup.name=CRS
oracle.install.asm.diskGroup.redundancy=EXTERNAL
oracle.install.asm.diskGroup.AUSize=4
oracle.install.asm.diskGroup.disks=/dev/oracleasm/disks/CRS1
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/oracleasm/disks/*
oracle.install.asm.monitorPassword=Oracle123
oracle.install.asm.configureAFD=false
oracle.install.crs.configureRHPS=false
oracle.install.config.managementOption=NONE
oracle.install.crs.rootconfig.executeRootScript=false
Two values need explaining beyond the table. Each networkInterfaceList entry ends with an interface type: 1 marks the public network and 5 marks a private network that also carries ASM traffic. diskDiscoveryString points at the ASMLib path created earlier, so the installer sees only disks labeled with oracleasm createdisk; only CRS1 is listed here, which is why DATA and FRA are created afterward.
Grid Infrastructure Response File Parameters
The following parameters were configured for the Oracle 19c two-node RAC environment.
| Parameter | Value | Description |
|---|---|---|
oracle.install.crs.config.ClusterConfiguration |
STANDALONE |
Configures the RAC cluster as a standard standalone cluster. |
oracle.install.crs.config.clusterName |
racprd |
Defines the name of the RAC cluster. |
oracle.install.crs.config.scanType |
LOCAL_SCAN |
Configures SCAN for this cluster itself instead of using a SCAN shared from another cluster. |
oracle.install.crs.config.gpnp.scanName |
racprd-scan.oraeasy.com |
Defines the SCAN name used by the RAC cluster. |
oracle.install.crs.config.gpnp.scanPort |
1521 |
Defines the port used by the SCAN listeners. |
oracle.install.crs.config.gpnp.configureGNS |
false |
Disables GNS because name resolution is handled through /etc/hosts. |
oracle.install.crs.config.autoConfigureClusterNodeVIP |
false |
Disables automatic VIP configuration because the VIPs are manually defined. |
oracle.install.crs.config.clusterNodes |
racprd1.oraeasy.com:racprd1-vip.oraeasy.com,racprd2.oraeasy.com:racprd2-vip.oraeasy.com |
Defines the RAC nodes and their corresponding VIPs. |
oracle.install.crs.config.networkInterfaceList |
enp0s8:192.168.80.0:1,enp0s9:192.168.10.0:5 |
Defines the public and private/ASM network interfaces used by the RAC cluster. |
oracle.install.crs.configureGIMR |
false |
Disables the Grid Infrastructure Management Repository (GIMR). |
oracle.install.asm.configureGIMRDataDG |
false |
Disables a separate ASM disk group for GIMR. |
oracle.install.crs.config.storageOption |
FLEX_ASM_STORAGE |
Enables Flex ASM, where ASM instances can serve database instances on other nodes, which is why a third, offline ASM slot appears later. |
oracle.install.asm.diskGroup.name |
CRS |
Defines the ASM disk group used for Grid Infrastructure OCR and voting files. |
oracle.install.asm.diskGroup.redundancy |
EXTERNAL |
Uses external redundancy for the CRS disk group. |
oracle.install.asm.diskGroup.AUSize |
4 |
Sets the ASM allocation unit size to 4 MB. |
oracle.install.asm.diskGroup.disks |
/dev/oracleasm/disks/CRS1 |
Specifies the ASM disk used for the CRS disk group. |
oracle.install.asm.diskGroup.diskDiscoveryString |
/dev/oracleasm/disks/* |
Defines the ASM disk discovery path for ASMLib-managed disks. |
oracle.install.asm.configureAFD |
false |
Disables ASM Filter Driver because ASMLib is used for ASM disk management. |
oracle.install.crs.configureRHPS |
false |
Disables Rapid Home Provisioning for this RAC environment. |
oracle.install.config.managementOption |
NONE |
Does not configure Enterprise Manager during Grid Infrastructure installation. |
oracle.install.crs.rootconfig.executeRootScript |
false |
Root configuration scripts are executed manually after the Grid installation. |
Step 2: Launch gridSetup.sh
With modified response file, let's launch the gridSetup.sh in silent mode:
[oracle@racprd1 ~]$ env|grep ORA
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/19c/grid_1
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ cd /u01/app/grid/19c/grid_1
[oracle@racprd1 grid_1]$ ls
addnode crs deinstall evm install jdk network ord perl racg root.sh.old slax tomcat wlm
assistants css demo gpnp instantclient jlib nls ords plsql rdbms root.sh.old.1 sqlpatch ucp wwg
bin cv diagnostics gridSetup.sh inventory ldap OPatch oss precomp relnotes rootupgrade.sh sqlplus usm xag
cha dbjava dmu has javavm lib opmn oui QOpatch rhp runcluvfy.sh srvm utl xdk
clone dbs env.ora hs jdbc md oracore owm qos root.sh sdk suptools welcome.html
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$ ./gridSetup.sh -silent -responseFile /u01/app/grid/19c/grid_1/install/response/gridsetup.rsp -ignorePrereqFailure
Launching Oracle Grid Infrastructure Setup Wizard...
[WARNING] [INS-32047] The location (/u01/app/oraInventory) specified for the central inventory is not empty.
ACTION: It is recommended to provide an empty location for the inventory.
[WARNING] [INS-13013] Target environment does not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /tmp/GridSetupActions2026-09-27_05-24-55PM/gridSetupActions2026-09-27_05-24-55PM.log
ACTION: Identify the list of failed prerequisite checks from the log: /tmp/GridSetupActions2026-09-27_05-24-55PM/gridSetupActions2026-09-27_05-24-55PM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.
The response file for this session can be found at:
/u01/app/grid/19c/grid_1/install/response/grid_2026-09-27_05-24-55PM.rsp
You can find the log of this install session at:
/tmp/GridSetupActions2026-09-27_05-24-55PM/gridSetupActions2026-09-27_05-24-55PM.log
As a root user, execute the following script(s):
1. /u01/app/oraInventory/orainstRoot.sh
2. /u01/app/grid/19c/grid_1/root.sh
Execute /u01/app/oraInventory/orainstRoot.sh on the following nodes:
[racprd1, racprd2]
Execute /u01/app/grid/19c/grid_1/root.sh on the following nodes:
[racprd1, racprd2]
Run the script on the local node first. After successful completion, you can start the script in parallel on all other nodes.
Successfully Setup Software with warning(s).
As install user, execute the following command to complete the configuration.
/u01/app/grid/19c/grid_1/gridSetup.sh -executeConfigTools -responseFile /u01/app/grid/19c/grid_1/install/response/gridsetup.rsp [-silent]
Moved the install session logs to:
/u01/app/oraInventory/logs/GridSetupActions2026-09-27_05-24-55PM
[oracle@racprd1 grid_1]$
The -ignorePrereqFailure flag is needed because the lab misses the 8GB memory requirement and the installer would otherwise stop. The two warnings are expected: INS-32047 only notes that the inventory location already holds files, and INS-13013 repeats the memory failure from CVU. "Successfully Setup Software with warning(s)" means the software was linked and copied to both nodes; the cluster is not configured until the root scripts run.
Step 3: Run the Root Scripts
These two scripts are what actually configure the clusterware and start it, so nothing before this point has touched the cluster's runtime state. Run them on Node 1 first and let it finish before starting Node 2's, because Node 1 creates the cluster, the ASM instance, and the CRS disk group that Node 2 then joins.
Node 1:
[root@racprd1 ~]# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
[root@racprd1 ~]#
[root@racprd1 ~]# /u01/app/grid/19c/grid_1/root.sh
Check /u01/app/grid/19c/grid_1/install/root_racprd1.oraeasy.com_2026-09-27_17-48-34-367635715.log for the output of root script
[root@racprd1 ~]# cat /u01/app/grid/19c/grid_1/install/root_racprd1.oraeasy.com_2026-09-27_17-48-34-367635715.log
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/grid/19c/grid_1
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Relinking oracle with rac_on option
Using configuration parameter file: /u01/app/grid/19c/grid_1/crs/install/crsconfig_params
The log of current session can be found at:
/u01/grid/crsdata/racprd1/crsconfig/rootcrs_racprd1_2026-09-27_05-49-17PM.log
2026/09/27 17:50:02 CLSRSC-594: Executing installation step 1 of 19: 'SetupTFA'.
2026/09/27 17:50:02 CLSRSC-594: Executing installation step 2 of 19: 'ValidateEnv'.
2026/09/27 17:50:02 CLSRSC-363: User ignored prerequisites during installation
2026/09/27 17:50:02 CLSRSC-594: Executing installation step 3 of 19: 'CheckFirstNode'.
2026/09/27 17:50:09 CLSRSC-594: Executing installation step 4 of 19: 'GenSiteGUIDs'.
2026/09/27 17:50:12 CLSRSC-594: Executing installation step 5 of 19: 'SetupOSD'.
2026/09/27 17:50:12 CLSRSC-594: Executing installation step 6 of 19: 'CheckCRSConfig'.
2026/09/27 17:50:15 CLSRSC-594: Executing installation step 7 of 19: 'SetupLocalGPNP'.
2026/09/27 17:52:13 CLSRSC-594: Executing installation step 8 of 19: 'CreateRootCert'.
2026/09/27 17:52:15 CLSRSC-4002: Successfully installed Oracle Trace File Analyzer (TFA) Collector.
2026/09/27 17:52:27 CLSRSC-594: Executing installation step 9 of 19: 'ConfigOLR'.
2026/09/27 17:52:51 CLSRSC-594: Executing installation step 10 of 19: 'ConfigCHMOS'.
2026/09/27 17:52:51 CLSRSC-594: Executing installation step 11 of 19: 'CreateOHASD'.
2026/09/27 17:53:10 CLSRSC-594: Executing installation step 12 of 19: 'ConfigOHASD'.
2026/09/27 17:53:12 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'
2026/09/27 17:57:04 CLSRSC-594: Executing installation step 13 of 19: 'InstallAFD'.
2026/09/27 17:57:25 CLSRSC-594: Executing installation step 14 of 19: 'InstallACFS'.
2026/09/27 18:01:09 CLSRSC-594: Executing installation step 15 of 19: 'InstallKA'.
2026/09/27 18:01:22 CLSRSC-594: Executing installation step 16 of 19: 'InitConfig'.
ASM has been created and started successfully.
[DBT-30001] Disk groups created successfully. Check /u01/grid/cfgtoollogs/asmca/asmca-260927PM060227.log for details.
2026/09/27 18:04:05 CLSRSC-482: Running command: '/u01/app/grid/19c/grid_1/bin/ocrconfig -upgrade oracle oinstall'
CRS-4256: Updating the profile
Successful addition of voting disk 25cf8b6f07634f6ebfba1b6134f4eaee.
Successfully replaced voting disk group with +CRS.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 25cf8b6f07634f6ebfba1b6134f4eaee (/dev/oracleasm/disks/CRS1) [CRS]
Located 1 voting disk(s).
2026/09/27 18:08:09 CLSRSC-594: Executing installation step 17 of 19: 'StartCluster'.
2026/09/27 18:10:10 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/09/27 18:10:10 CLSRSC-594: Executing installation step 18 of 19: 'ConfigNode'.
2026/09/27 18:16:46 CLSRSC-594: Executing installation step 19 of 19: 'PostConfig'.
2026/09/27 18:18:28 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
[root@racprd1 ~]#
Node 2:
[root@racprd2 ~]# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
[root@racprd2 ~]#
[root@racprd2 ~]# /u01/app/grid/19c/grid_1/root.sh
Check /u01/app/grid/19c/grid_1/install/root_racprd2.oraeasy.com_2026-09-27_18-19-16-614398068.log for the output of root script
[root@racprd2 ~]# cat /u01/app/grid/19c/grid_1/install/root_racprd2.oraeasy.com_2026-09-27_18-19-16-614398068.log
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/grid/19c/grid_1
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Relinking oracle with rac_on option
Using configuration parameter file: /u01/app/grid/19c/grid_1/crs/install/crsconfig_params
The log of current session can be found at:
/u01/grid/crsdata/racprd2/crsconfig/rootcrs_racprd2_2026-09-27_06-20-14PM.log
2026/09/27 18:20:45 CLSRSC-594: Executing installation step 1 of 19: 'SetupTFA'.
2026/09/27 18:20:46 CLSRSC-594: Executing installation step 2 of 19: 'ValidateEnv'.
2026/09/27 18:20:46 CLSRSC-363: User ignored prerequisites during installation
2026/09/27 18:20:46 CLSRSC-594: Executing installation step 3 of 19: 'CheckFirstNode'.
2026/09/27 18:20:47 CLSRSC-594: Executing installation step 4 of 19: 'GenSiteGUIDs'.
2026/09/27 18:20:48 CLSRSC-594: Executing installation step 5 of 19: 'SetupOSD'.
2026/09/27 18:20:48 CLSRSC-594: Executing installation step 6 of 19: 'CheckCRSConfig'.
2026/09/27 18:20:51 CLSRSC-594: Executing installation step 7 of 19: 'SetupLocalGPNP'.
2026/09/27 18:20:53 CLSRSC-594: Executing installation step 8 of 19: 'CreateRootCert'.
2026/09/27 18:20:53 CLSRSC-594: Executing installation step 9 of 19: 'ConfigOLR'.
2026/09/27 18:21:01 CLSRSC-594: Executing installation step 10 of 19: 'ConfigCHMOS'.
2026/09/27 18:21:01 CLSRSC-594: Executing installation step 11 of 19: 'CreateOHASD'.
2026/09/27 18:21:04 CLSRSC-594: Executing installation step 12 of 19: 'ConfigOHASD'.
2026/09/27 18:21:05 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'
2026/09/27 18:21:40 CLSRSC-4002: Successfully installed Oracle Trace File Analyzer (TFA) Collector.
2026/09/27 18:23:32 CLSRSC-594: Executing installation step 13 of 19: 'InstallAFD'.
2026/09/27 18:23:35 CLSRSC-594: Executing installation step 14 of 19: 'InstallACFS'.
2026/09/27 18:25:34 CLSRSC-594: Executing installation step 15 of 19: 'InstallKA'.
2026/09/27 18:25:36 CLSRSC-594: Executing installation step 16 of 19: 'InitConfig'.
2026/09/27 18:25:55 CLSRSC-594: Executing installation step 17 of 19: 'StartCluster'.
2026/09/27 18:26:56 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/09/27 18:26:56 CLSRSC-594: Executing installation step 18 of 19: 'ConfigNode'.
2026/09/27 18:27:26 CLSRSC-594: Executing installation step 19 of 19: 'PostConfig'.
2026/09/27 18:27:38 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
[root@racprd2 ~]#
The timestamps show how different the two runs are. Node 1 takes about 30 minutes (17:49 to 18:18) because it creates ASM, the CRS disk group, and the voting file, while Node 2 finishes in under 10 minutes since it only joins the cluster. CLSRSC-363 records that prerequisites were ignored, and the voting disk line confirms a single file in +CRS with external redundancy.
Step 4: Verify the Grid Installation
A running ASM pmon process and an active clusterware stack on both nodes are the two direct confirmations that Grid Infrastructure came up correctly in a silent install, where no installer screen reports the result:
Node 1:
[oracle@racprd1 grid_1]$ ps -ef|grep pmon
oracle 25507 1 0 18:09 ? 00:00:00 asm_pmon_+ASM1
oracle 28160 2134 0 18:53 pts/0 00:00:00 grep --color=auto pmon
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$ ps -ef|grep tns
root 22 2 0 17:05 ? 00:00:00 [netns]
oracle 28207 2134 0 18:53 pts/0 00:00:00 grep --color=auto tns
oracle 28594 1 0 18:14 ? 00:00:01 /u01/app/grid/19c/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
oracle 29379 1 0 18:15 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr LISTENER_SCAN2 -no_crs_notify -inherit
oracle 29410 1 0 18:15 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr LISTENER_SCAN3 -no_crs_notify -inherit
oracle 31990 1 0 18:17 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$ ps -ef|grep d.bin
root 24301 1 3 18:08 ? 00:01:26 /u01/app/grid/19c/grid_1/bin/ohasd.bin reboot BLOCKING_STACK_LOCALE_OHAS=AMERICAN_AMERICA.AL32UTF8
oracle 24856 1 0 18:08 ? 00:00:10 /u01/app/grid/19c/grid_1/bin/mdnsd.bin
oracle 24858 1 1 18:08 ? 00:00:29 /u01/app/grid/19c/grid_1/bin/evmd.bin
oracle 24887 1 0 18:08 ? 00:00:12 /u01/app/grid/19c/grid_1/bin/gpnpd.bin
oracle 24959 1 1 18:08 ? 00:00:28 /u01/app/grid/19c/grid_1/bin/gipcd.bin
root 24992 1 3 18:08 ? 00:01:40 /u01/app/grid/19c/grid_1/bin/osysmond.bin
oracle 25065 1 2 18:08 ? 00:00:55 /u01/app/grid/19c/grid_1/bin/ocssd.bin -S 1
root 25310 1 0 18:08 ? 00:00:26 /u01/app/grid/19c/grid_1/bin/octssd.bin reboot
root 25600 1 3 18:09 ? 00:01:25 /u01/app/grid/19c/grid_1/bin/crsd.bin reboot
oracle 28355 2134 0 18:53 pts/0 00:00:00 grep --color=auto d.bin
[oracle@racprd1 grid_1]$
[oracle@racprd1 grid_1]$ cd bin
[oracle@racprd1 bin]$
[oracle@racprd1 bin]$ ./crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
[oracle@racprd1 bin]$ ./crsctl check has
CRS-4638: Oracle High Availability Services is online
[oracle@racprd1 bin]$ ./crsctl check cluster -all
**************************************************************
racprd1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racprd2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[oracle@racprd1 bin]$
Node 2:
[oracle@racprd2 ~]$ ps -ef|grep pmon
oracle 60698 1 0 18:09 ? 00:00:00 asm_pmon_+ASM2
oracle 112997 6780 0 18:54 pts/0 00:00:00 grep --color=auto pmon
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ ps -ef|grep tns
root 5 2 0 18:18 ? 00:00:00 [netns]
oracle 38973 1 0 18:18 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit
oracle 39132 1 0 18:18 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit
oracle 39143 1 0 18:18 ? 00:00:00 /u01/app/grid/19c/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
oracle 113061 6780 0 18:54 pts/0 00:00:00 grep --color=auto tns
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ ps -ef|grep d.bin
root 54768 1 2 18:09 ? 00:00:40 /u01/app/grid/19c/grid_1/bin/ohasd.bin reboot BLOCKING_STACK_LOCALE_OHAS=AMERICAN_AMERICA.AL32UTF8
oracle 54988 1 0 18:09 ? 00:00:09 /u01/app/grid/19c/grid_1/bin/evmd.bin
oracle 54990 1 0 18:09 ? 00:00:05 /u01/app/grid/19c/grid_1/bin/mdnsd.bin
oracle 54030 1 0 18:09 ? 00:00:07 /u01/app/grid/19c/grid_1/bin/gpnpd.bin
oracle 54089 1 0 18:09 ? 00:00:16 /u01/app/grid/19c/grid_1/bin/gipcd.bin
oracle 54191 1 0 18:09 ? 00:00:19 /u01/app/grid/19c/grid_1/bin/ocssd.bin -S 2
root 54537 1 2 18:09 ? 00:00:45 /u01/app/grid/19c/grid_1/bin/osysmond.bin
root 57812 1 1 18:09 ? 00:00:32 /u01/app/grid/19c/grid_1/bin/crsd.bin reboot
root 114755 26733 0 18:54 pts/1 00:00:00 grep --color=auto d.bin
[oracle@racprd2 ~]
[oracle@racprd2 ~]$ cd /u01/app/grid/19c/grid_1/bin
[oracle@racprd2 bin]$
[oracle@racprd2 bin]$ ./crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
[oracle@racprd2 bin]$
[oracle@racprd2 bin]$ ./crsctl check has
CRS-4638: Oracle High Availability Services is online
[oracle@racprd2 bin]$
[oracle@racprd2 bin]$ ./crsctl check cluster -all
**************************************************************
racprd1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racprd2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[oracle@racprd2 bin]$
The three SCAN listeners are spread across the nodes, two on Node 1 and one on Node 2, and the d.bin processes (ohasd, ocssd, crsd, and others) are the clusterware daemons themselves. crsctl check cluster -all is the quickest single confirmation because it reports both nodes from one session.
Step 5: Create the Remaining ASM Diskgroups
Only CRS was created during the Grid install; DATA and FRA still need creating before a database can be built. They are created here with SQL*Plus connected as sysasm, which suits a silent build:
[oracle@racprd1 bin]$ sqlplus / as sysasm
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 19:00:31 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SELECT NAME, STATE, TYPE, TOTAL_MB, FREE_MB
FROM V$ASM_DISKGROUP
ORDER BY NAME;
NAME STATE TYPE TOTAL_MB FREE_MB
------------------------------ ----------- ------ ---------- ----------
CRS MOUNTED EXTERN 10236 9900
SQL> CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/DATA1' ATTRIBUTE 'au_size'='4M';
Diskgroup created.
SQL> CREATE DISKGROUP FRA EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/FRA1' ATTRIBUTE 'au_size'='4M';
Diskgroup created.
SQL> SELECT NAME, STATE, TYPE, TOTAL_MB, FREE_MB
FROM V$ASM_DISKGROUP
ORDER BY NAME;
NAME STATE TYPE TOTAL_MB FREE_MB
------------------------------ ----------- ------ ---------- ----------
CRS MOUNTED EXTERN 10236 9900
DATA MOUNTED EXTERN 35840 35760
FRA MOUNTED EXTERN 15360 15280
SQL> SELECT INST_ID,
NAME,
ROUND(TOTAL_MB/1024,2) TOTAL_GB,
ROUND(FREE_MB/1024,2) FREE_GB,
ROUND((TOTAL_MB-FREE_MB)/1024,2) USED_GB,
ROUND((FREE_MB/NULLIF(TOTAL_MB,0))*100,2) FREE_PER
FROM GV$ASM_DISKGROUP
ORDER BY INST_ID, NAME;
INST_ID NAME TOTAL_GB FREE_GB USED_GB FREE_PER
---------- ------------------------------ ---------- ---------- ---------- ----------
1 CRS 10 9.67 .33 96.72
1 DATA 35 34.92 .08 99.78
1 FRA 15 14.92 .08 99.48
2 CRS 10 9.67 .33 96.72
2 DATA 0 0 0
2 FRA 0 0 0
6 rows selected.
SQL>
Each CREATE DISKGROUP uses external redundancy and a 4M allocation unit to match the CRS group. No compatible.asm attribute was supplied, which is the root cause of the DBCA failure described near the end. The last query shows DATA and FRA as zeros for instance 2 because the groups are mounted only on Node 1 so far.
Step 6: Mount the diskgroup on Node 2
A disk group created from one ASM instance is not mounted automatically on the others, so Node 2 reports DATA and FRA as DISMOUNTED. Once mounted, the global view lists all three groups for both instances with the same totals, confirming both see the same shared disks.
[oracle@racprd2 bin]$ sqlplus / as sysasm
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 19:07:07 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SELECT NAME, STATE, TYPE, TOTAL_MB, FREE_MB
FROM V$ASM_DISKGROUP
ORDER BY NAME;
NAME STATE TYPE TOTAL_MB FREE_MB
------------------------------ ----------- ------ ---------- ----------
CRS MOUNTED EXTERN 10236 9900
DATA DISMOUNTED 0 0
FRA DISMOUNTED 0 0
SQL> ALTER DISKGROUP DATA MOUNT;
Diskgroup altered.
SQL> ALTER DISKGROUP FRA MOUNT;
Diskgroup altered.
SQL> SELECT NAME, STATE, TYPE, TOTAL_MB, FREE_MB
FROM V$ASM_DISKGROUP
ORDER BY NAME;
NAME STATE TYPE TOTAL_MB FREE_MB
------------------------------ ----------- ------ ---------- ----------
CRS MOUNTED EXTERN 10236 9900
DATA MOUNTED EXTERN 35840 35716
FRA MOUNTED EXTERN 15360 15236
SQL>
SQL> SELECT INST_ID,
NAME,
ROUND(TOTAL_MB/1024,2) TOTAL_GB,
ROUND(FREE_MB/1024,2) FREE_GB,
ROUND((TOTAL_MB-FREE_MB)/1024,2) USED_GB,
ROUND((FREE_MB/NULLIF(TOTAL_MB,0))*100,2) FREE_PER
FROM GV$ASM_DISKGROUP
ORDER BY INST_ID, NAME;
INST_ID NAME TOTAL_GB FREE_GB USED_GB FREE_PER
---------- ------------------------------ ---------- ---------- ---------- ----------
1 CRS 10 9.67 .33 96.72
1 DATA 35 34.92 .08 99.78
1 FRA 15 14.92 .08 99.48
2 CRS 10 9.67 .33 96.72
2 DATA 35 34.92 .08 99.78
2 FRA 15 14.92 .08 99.48
6 rows selected.
SQL>
Oracle Grid Infrastructure is now complete, so let's move on to the next phase.
Oracle Database Software Installation
Step 1: Unzip the Database Software
Like the Grid Home, the Database Home software is unzipped directly into its dedicated, empty target directory:
[oracle@racprd1 software]$ pwd
/home/oracle/software
[oracle@racprd1 software]$ ls -lrth
total 2.9G
-rw-r--r--. 1 oracle oinstall 2.9G Sep 27 19:12 LINUX.X64_193000_db_home.zip
[oracle@racprd1 software]$
[oracle@racprd1 software]$ unzip LINUX.X64_193000_db_home.zip -d /u01/app/oracle/19c/db_1
Step 2: Prepare the response file for Oracle Database Software Installation
Modify the response file as per your environment:
[oracle@racprd1 software]$ cd /u01/app/oracle/19c/db_1/install/response/
[oracle@racprd1 response]$
[oracle@racprd1 response]$ ls
db_install.rsp
[oracle@racprd1 response]$ mv db_install.rsp db_install.rsp_bkp
[oracle@racprd1 response]$ vi db_install.rsp
[oracle@racprd1 response]$ ls
db_install.rsp db_install.rsp_bkp
Modified parameters:
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/19c/dbhome_1
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.CLUSTER_NODES=racprd1,racprd2
The group parameters reuse the OS groups created by the preinstall package, so no extra groups are needed. CLUSTER_NODES tells the installer to copy the home to Node 2, and INSTALL_DB_SWONLY leaves database creation to DBCA.
Oracle Database Home Installation Parameters
The following parameters were configured for the Oracle 19c Database Home installation in the two-node RAC environment.
| Parameter | Value | Description |
|---|---|---|
oracle.install.option |
INSTALL_DB_SWONLY |
Installs only the Oracle Database software without creating a database. |
ORACLE_BASE |
/u01/app/oracle |
Defines the Oracle Base directory for the Oracle Database software. |
ORACLE_HOME |
/u01/app/oracle/19c/dbhome_1 |
Defines the Oracle Database Home directory. |
oracle.install.db.InstallEdition |
EE |
Installs Oracle Database Enterprise Edition. |
oracle.install.db.OSDBA_GROUP |
dba |
Operating system group for Oracle Database SYSDBA privileges. |
oracle.install.db.OSOPER_GROUP |
oper |
Operating system group for Oracle Database SYSOPER privileges. |
oracle.install.db.OSBACKUPDBA_GROUP |
backupdba |
Operating system group for SYSBACKUP privileges. |
oracle.install.db.OSDGDBA_GROUP |
dgdba |
Operating system group for Data Guard administrative privileges. |
oracle.install.db.OSKMDBA_GROUP |
kmdba |
Operating system group for Transparent Data Encryption and Key Management privileges. |
oracle.install.db.OSRACDBA_GROUP |
racdba |
Operating system group for Oracle RAC administrative privileges. |
oracle.install.db.CLUSTER_NODES |
racprd1,racprd2 |
Specifies the RAC nodes where the Database Home is installed. |
Step 2: Launch runInstaller
Let's launch the runInstaller with modified response file
[oracle@racprd1 ~]$ . .db_env
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ env|grep ORA
ORACLE_SID=racprdb1
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/19c/db_1
[oracle@racprd1 ~]$ cd /u01/app/oracle/19c/db_1
[oracle@racprd1 db_1]$ ./runInstaller -silent -responsefile /u01/app/oracle/19c/db_1/install/response/db_install.rsp -waitforcompletion -ignorePrereqFailure
Launching Oracle Database Setup Wizard...
[WARNING] [INS-13013] Target environment does not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /u01/app/oraInventory/logs/InstallActions2026-09-27_07-52-27PM/installActions2026-09-27_07-52-27PM.log
ACTION: Identify the list of failed prerequisite checks from the log: /u01/app/oraInventory/logs/InstallActions2026-09-27_07-52-27PM/installActions2026-09-27_07-52-27PM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.
The response file for this session can be found at:
/u01/app/oracle/19c/db_1/install/response/db_2026-09-27_07-52-27PM.rsp
You can find the log of this install session at:
/u01/app/oraInventory/logs/InstallActions2026-09-27_07-52-27PM/installActions2026-09-27_07-52-27PM.log
As a root user, execute the following script(s):
1. /u01/app/oracle/19c/db_1/root.sh
Execute /u01/app/oracle/19c/db_1/root.sh on the following nodes:
[racprd1, racprd2]
Successfully Setup Software with warning(s).
[oracle@racprd1 db_1]$
The -waitforcompletion option keeps the command in the foreground until the install finishes, so the shell returns only when the software is ready for root.sh. The same prerequisite warning appears as in the Grid install, for the same reason.
Step 4: Run root.sh on Both Nodes
Unlike the Grid scripts, the database root.sh only copies utilities to /usr/local/bin and does not touch the cluster, so it finishes quickly and can run on both nodes in any order.
Node 1:
[root@racprd1 ~]# /u01/app/oracle/19c/db_1/root.sh
Check /u01/app/oracle/19c/db_1/install/root_racprd1.oraeasy.com_2026-09-27_20-29-08-078098358.log for the output of root script
[root@racprd1 ~]#
[root@racprd1 ~]# cat /u01/app/oracle/19c/db_1/install/root_racprd1.oraeasy.com_2026-09-27_20-29-08-078098358.log
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/19c/db_1
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
[root@racprd1 ~]#
Node 2:
[root@racprd2 ~]# /u01/app/oracle/19c/db_1/root.sh
Check /u01/app/oracle/19c/db_1/install/root_racprd2.oraeasy.com_2026-09-27_20-29-47-908584264.log for the output of root script
[root@racprd2 ~]#
[root@racprd2 ~]# cat /u01/app/oracle/19c/db_1/install/root_racprd2.oraeasy.com_2026-09-27_20-29-47-908584264.log
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/19c/db_1
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
[root@racprd2 ~]#
Step 5: Verify installation Both Nodes
Node 1:
[oracle@racprd1 db_1]$ sqlplus -v
SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@racprd1 db_1]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 20:43:59 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to an idle instance.
SQL> def
DEFINE _DATE = "27-SEP-26" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "racprdb1" (CHAR)
DEFINE _USER = "SYS" (CHAR)
DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1903000000" (CHAR)
DEFINE _EDITOR = "vi" (CHAR)
DEFINE _O_VERSION = "" (CHAR)
DEFINE _O_RELEASE = "" (CHAR)
SQL>
Node 2:
[oracle@racprd2 ~]$ . .db_env
[oracle@racprd2 ~]$ sqlplus -v
SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@racprd2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 20:44:24 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to an idle instance.
SQL> def
DEFINE _DATE = "27-SEP-26" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "racprdb2" (CHAR)
DEFINE _USER = "SYS" (CHAR)
DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1903000000" (CHAR)
DEFINE _EDITOR = "vi" (CHAR)
DEFINE _O_VERSION = "" (CHAR)
DEFINE _O_RELEASE = "" (CHAR)
SQL>
"Connected to an idle instance" is the expected result here because no database exists yet. def shows _CONNECT_IDENTIFIER as racprdb1 and racprdb2, proving each node picked up the right ORACLE_SID from its environment file.
Database Home installation is complete, so let's move on to the next phase.
RAC Database Creation
Step 1: Prepare the response file for Database Creation
Modify the response file as per your environment:
[oracle@racprd1 db_1]$ pwd
/u01/app/oracle/19c/db_1
[oracle@racprd1 db_1]$ cd assistants/
[oracle@racprd1 assistants]$ ls
bin dbca dbua jlib mesg netca rconfig
[oracle@racprd1 assistants]$ cd dbca/
[oracle@racprd1 dbca]$ ls
dbca.rsp doc jlib templates
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$ mv dbca.rsp dbca.rsp_bkp
[oracle@racprd1 dbca]$ vi dbca.rsp
[oracle@racprd1 dbca]$ ls
dbca.rsp dbca.rsp_bkp
Modified parameters:
gdbName=racprdb
databaseConfigType=RAC
nodelist=racprd1,racprd2
templateName=General_Purpose.dbc
storageType=ASM
datafileDestination=+DATA
recoveryAreaDestination=+FRA
createAsContainerDatabase=false
These values tie back to earlier phases: nodelist creates one instance per node, datafileDestination and recoveryAreaDestination use the disk groups built in the Grid phase, and createAsContainerDatabase=false builds a non-CDB database. Creation depends on those groups being mounted on both nodes.
DBCA Response File Parameters
The following parameters were configured while creating the Oracle 19c RAC database using DBCA.
| Parameter | Value | Description |
|---|---|---|
gdbName |
racprdb |
Global database name for the RAC database. |
sid |
racprdb |
Database SID prefix used for the RAC instances. |
databaseConfigType |
RAC |
Creates the database as an Oracle RAC database. |
RACOneNodeServiceName |
|
Not used because this is a standard two-node RAC database. |
nodelist |
racprd1,racprd2 |
Defines the two RAC nodes on which the database instances are created. |
templateName |
General_Purpose.dbc |
Uses the General Purpose database template. |
storageType |
ASM |
Stores database files in Oracle ASM. |
datafileDestination |
+DATA |
ASM disk group used for database datafiles. |
recoveryAreaDestination |
+FRA |
ASM disk group used for the Fast Recovery Area. |
recoveryAreaSize |
Configured in DBCA | Defines the size of the Fast Recovery Area. |
characterSet |
AL32UTF8 |
Database character set used for the database. |
createAsContainerDatabase |
false |
Creates a non-CDB database without a pluggable database. |
databaseType |
MULTIPURPOSE |
Configures the database for general-purpose usage. |
automaticMemoryManagement |
Configured in DBCA | Controls automatic memory management for the database. |
listeners |
LISTENER |
Associates the RAC database with the Grid Infrastructure listener. |
Step 2: Launch DBCA on Node 1
Launch the DBCA with modified response file:
[oracle@racprd1 dbca]$ dbca -silent -createDatabase -responseFile /u01/app/oracle/19c/db_1/assistants/dbca/dbca.rsp -ignorePrereqFailure
Prepare for db operation
8% complete
Copying database files
33% complete
Creating and starting Oracle instance
34% complete
35% complete
39% complete
42% complete
45% complete
50% complete
Creating cluster database views
52% complete
67% complete
Completing Database Creation
71% complete
73% complete
75% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/u01/app/oracle/cfgtoollogs/dbca/racprdb.
Database Information:
Global Database Name:racprdb
System Identifier(SID) Prefix:racprdb
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/racprdb/racprdb.log" for further details.
[oracle@racprd1 dbca]$
If DBCA stops at the start with DBT-05802 instead of reaching these percentages, see the compatibility section near the end of this post. A successful run ends at 100% and writes its log under /u01/app/oracle/cfgtoollogs/dbca/racprdb.
Step 3: Verify the Database
Node 1:
[oracle@racprd1 dbca]$ srvctl config
racprdb
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$ srvctl config database -d racprdb
Database unique name: racprdb
Database name: racprdb
Oracle home: /u01/app/oracle/19c/db_1
Oracle user: oracle
Spfile: +DATA/RACPRDB/PARAMETERFILE/spfile.268.1245104519
Password file: +DATA/RACPRDB/PASSWORD/pwdracprdb.256.1245102217
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: FRA,DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: racprdb1,racprdb2
Configured nodes: racprd1,racprd2
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$ srvctl status database -d racprdb -v
Instance racprdb1 is running on node racprd1. Instance status: Open.
Instance racprdb2 is running on node racprd2. Instance status: Open.
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 22:46:40 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select distinct NAME,DATABASE_ROLE,OPEN_MODE,INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STARTUP_TIME,STATUS from gv$database,gv$instance;SQL> SQL> SQL>
NAME DATABASE_ROLE OPEN_MODE INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_T STATUS
--------- ---------------- --------------- --------------- ---------------- -------------------- ----------------- --------- ------------
RACPRDB PRIMARY READ WRITE 1 racprdb1 racprd1.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
RACPRDB PRIMARY READ WRITE 1 racprdb2 racprd2.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
SQL>
Node 2:
[oracle@racprd2 ~]$ srvctl config
racprdb
[oracle@racprd2 ~]$ srvctl config database -d racprdb
Database unique name: racprdb
Database name: racprdb
Oracle home: /u01/app/oracle/19c/db_1
Oracle user: oracle
Spfile: +DATA/RACPRDB/PARAMETERFILE/spfile.268.1245104519
Password file: +DATA/RACPRDB/PASSWORD/pwdracprdb.256.1245102217
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: FRA,DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: racprdb1,racprdb2
Configured nodes: racprd1,racprd2
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ srvctl status database -d racprdb -v
Instance racprdb1 is running on node racprd1. Instance status: Open.
Instance racprdb2 is running on node racprd2. Instance status: Open.
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$
[oracle@racprd2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 22:47:08 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select distinct NAME,DATABASE_ROLE,OPEN_MODE,INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STARTUP_TIME,STATUS from gv$database,gv$instance;SQL> SQL> SQL>
NAME DATABASE_ROLE OPEN_MODE INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_T STATUS
--------- ---------------- --------------- --------------- ---------------- -------------------- ----------------- --------- ------------
RACPRDB PRIMARY READ WRITE 1 racprdb1 racprd1.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
RACPRDB PRIMARY READ WRITE 1 racprdb2 racprd2.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
SQL>
In the srvctl config output, Type: RAC and Database is administrator managed show the cluster database registered correctly, Disk Groups: FRA,DATA lists the groups clusterware mounts first, and racprdb1,racprdb2 are the instances. The SQL query reads global views, so it returns one row per instance, and both are READ WRITE.
All installation and configuration is now complete, so let's proceed to the final verification phase.
Post-Installation Verification
Step 1: Verify Cluster and Database Services
Let's first bounce the database using srvctl and then verify all services:
Stop database:
[oracle@racprd1 dbca]$ srvctl stop database -d racprdb
[oracle@racprd1 dbca]$
[oracle@racprd1 dbca]$ srvctl status database -d racprdb -v
Instance racprdb1 is not running on node racprd1
Instance racprdb2 is not running on node racprd2
[oracle@racprd1 dbca]$
Start database:
[oracle@racprd1 dbca]$ srvctl start database -d racprdb
[oracle@racprd1 dbca]$ srvctl status database -d racprdb -v
Instance racprdb1 is running on node racprd1. Instance status: Open.
Instance racprdb2 is running on node racprd2. Instance status: Open.
[oracle@racprd1 dbca]$
Now verify Database:
[oracle@racprd1 dbca]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 22:51:49 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select distinct NAME,DATABASE_ROLE,OPEN_MODE,INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STARTUP_TIME,STATUS from gv$database,gv$instance;
NAME DATABASE_ROLE OPEN_MODE INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_T STATUS
--------- ---------------- --------------- --------------- ---------------- -------------------- ----------------- --------- ------------
RACPRDB PRIMARY READ WRITE 1 racprdb1 racprd1.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
RACPRDB PRIMARY READ WRITE 1 racprdb2 racprd2.oraeasy.com 19.0.0.0.0 27-SEP-26 OPEN
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@racprd1 dbca]$
Now verify Cluster services:
[oracle@racprd1 ~]$ . .grid_env
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ $ORACLE_HOME/bin/./crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ $ORACLE_HOME/bin/./crsctl check has
CRS-4638: Oracle High Availability Services is online
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ $ORACLE_HOME/bin/./crsctl check cluster -all
**************************************************************
racprd1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racprd2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[oracle@racprd1 ~]$
[oracle@racprd1 ~]$ $ORACLE_HOME/bin/./crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racprd1 STABLE
ONLINE ONLINE racprd2 STABLE
ora.chad
ONLINE ONLINE racprd1 STABLE
ONLINE ONLINE racprd2 STABLE
ora.net1.network
ONLINE ONLINE racprd1 STABLE
ONLINE ONLINE racprd2 STABLE
ora.ons
ONLINE ONLINE racprd1 STABLE
ONLINE ONLINE racprd2 STABLE
ora.proxy_advm
OFFLINE OFFLINE racprd1 STABLE
OFFLINE OFFLINE racprd2 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racprd1 STABLE
2 ONLINE ONLINE racprd2 STABLE
3 OFFLINE OFFLINE STABLE
ora.CRS.dg(ora.asmgroup)
1 ONLINE ONLINE racprd1 STABLE
2 ONLINE ONLINE racprd2 STABLE
3 OFFLINE OFFLINE STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racprd1 STABLE
2 ONLINE ONLINE racprd2 STABLE
3 OFFLINE OFFLINE STABLE
ora.FRA.dg(ora.asmgroup)
1 ONLINE ONLINE racprd1 STABLE
2 ONLINE ONLINE racprd2 STABLE
3 OFFLINE OFFLINE STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racprd2 STABLE
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE racprd1 STABLE
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE racprd1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racprd1 Started,STABLE
2 ONLINE ONLINE racprd2 Started,STABLE
3 OFFLINE OFFLINE STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racprd1 STABLE
2 ONLINE ONLINE racprd2 STABLE
3 OFFLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE racprd1 STABLE
ora.qosmserver
1 ONLINE ONLINE racprd1 STABLE
ora.racprd1.vip
1 ONLINE ONLINE racprd1 STABLE
ora.racprd2.vip
1 ONLINE ONLINE racprd2 STABLE
ora.racprdb.db
1 ONLINE ONLINE racprd1 Open,HOME=/u01/app/o
racle/19c/db_1,STABL
E
2 ONLINE ONLINE racprd2 Open,HOME=/u01/app/o
racle/19c/db_1,STABL
E
ora.scan1.vip
1 ONLINE ONLINE racprd2 STABLE
ora.scan2.vip
1 ONLINE ONLINE racprd1 STABLE
ora.scan3.vip
1 ONLINE ONLINE racprd1 STABLE
--------------------------------------------------------------------------------
[oracle@racprd1 ~]$
Stopping the database with srvctl takes down both instances in one command, and starting it brings them back, confirming clusterware can manage them together. In the resource table, ora.proxy_advm offline is expected because no ADVM or ACFS is configured, and the third offline ASM slot reflects the Flex ASM default of three instances on a two-node cluster.
Step 2: Reference Commands for Managing the RAC Environment
The table below collects the day-to-day crsctl, srvctl, and cluvfy commands used to check, start, and stop the cluster, ASM, listeners, and database instances going forward.
| Description | Command |
|---|---|
| Check cluster status across all nodes | crsctl check cluster -all |
| Display all cluster resources in tabular format | crsctl stat res -t |
| Verify Oracle Clusterware stack status | crsctl check crs |
| Check Oracle High Availability Services (OHAS) status | crsctl check has |
| List all cluster nodes with node numbers | olsnodes -n |
| Display node status | olsnodes -s |
| Display ASM disk groups and free space | asmcmd lsdg |
| Show ASM instance status | srvctl status asm |
| Display ASM configuration | srvctl config asm |
| Check RAC database status | srvctl status database -d <DB_NAME> |
| Display RAC database configuration | srvctl config database -d <DB_NAME> |
| Start RAC database (All nodes) | srvctl start database -d <DB_NAME> |
| Stop RAC database (All nodes) | srvctl stop database -d <DB_NAME> |
| Check listener status | srvctl status listener |
| Display listener configuration | srvctl config listener |
| Display SCAN configuration | srvctl config scan |
| Check SCAN listener status | srvctl status scan_listener |
| Run cluster health check | cluvfy comp healthcheck |
| Validate node connectivity | cluvfy comp nodecon -n all -verbose |
| Check the status of all RAC instances | srvctl status instance -d <DB_NAME> |
| Display the configuration of RAC instances | srvctl config database -d <DB_NAME> |
| Start a specific RAC instance | srvctl start instance -d <DB_NAME> -i <INSTANCE_NAME> |
| Stop a specific RAC instance | srvctl stop instance -d <DB_NAME> -i <INSTANCE_NAME> |
| Start multiple RAC instances | srvctl start instance -d <DB_NAME> -i <INSTANCE1>,<INSTANCE2> |
| Stop multiple RAC instances | srvctl stop instance -d <DB_NAME> -i <INSTANCE1>,<INSTANCE2> |
DBCA Failure Due to ASM Disk Group Compatibility
During Oracle 19c RAC database creation, DBCA failed because the ASM disk group's compatible.asm attribute was set to 11.2.0.2.0. The password file creation required ASM compatibility of at least 12.1.0.0.0.
[oracle@racprd1 dbca]$ dbca -silent -createDatabase -responseFile /u01/app/oracle/19c/db_1/assistants/dbca/dbca.rsp -ignorePrereqFailure
[FATAL] [DBT-05802] Creating password file on diskgroup (DATA) would fail since it requires compatible.asm of version (12.1.0.0.0) or higher. Current compatible.asm version is '11.2.0.2.0'.
ACTION: Choose a diskgroup with correct value for compatible.asm attribute.
[oracle@racprd1 dbca]$
During silent installation, the DATA and FRA disk groups were created manually using SQL*Plus without explicitly setting the compatible.asm attribute, so it remained at the default value of 11.2.0.2.0.
This failure is specific to how this build was done: the CRS group was created by the Grid installer at 19.0.0.0.0 compatibility, while DATA and FRA, created by hand, kept 11.2.0.2.0. ASM stores the database password file inside the disk group, which is why DBCA checks compatible.asm first.
We followed below steps to resolve this
Step 1: Check ASM Disk Group Attributes
Verify the current attributes using ASMCMD and SQL
ASMCMD:
[oracle@racprd1 dbca]$ asmcmd lsattr -G DATA -l
Name Value
access_control.enabled FALSE
access_control.umask 066
au_size 4194304
cell.smart_scan_capable FALSE
compatible.asm 11.2.0.2.0
compatible.rdbms 10.1.0.0.0
disk_repair_time 12.0h
idp.boundary auto
idp.type dynamic
sector_size 512
[oracle@racprd1 dbca]$ asmcmd lsattr -G FRA -l
Name Value
access_control.enabled FALSE
access_control.umask 066
au_size 4194304
cell.smart_scan_capable FALSE
compatible.asm 11.2.0.2.0
compatible.rdbms 10.1.0.0.0
disk_repair_time 12.0h
idp.boundary auto
idp.type dynamic
sector_size 512
SQLPLUS:
[oracle@racprd1 ~]$ . .grid_env
[oracle@racprd1 ~]$ sqlplus / as sysasm
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 27 21:28:30 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SELECT name, compatibility, database_compatibility FROM v$asm_diskgroup;
NAME COMPATIBILITY DATABASE_COMPATIBILITY
------------------------------ ------------------------------------------------------------ ------------------------------------------------------------
CRS 19.0.0.0.0 10.1.0.0.0
DATA 11.2.0.2.0 10.1.0.0.0
FRA 11.2.0.2.0 10.1.0.0.0
Step 3: Update ASM Disk Group Compatibility
We updated both compatible.asm and compatible.rdbms for the DATA and FRA disk groups to 19.0.0.0.0.
SQL> def
DEFINE _DATE = "27-SEP-26" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "+ASM1" (CHAR)
DEFINE _USER = "SYS" (CHAR)
DEFINE _PRIVILEGE = "AS SYSASM" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1903000000" (CHAR)
DEFINE _EDITOR = "vi" (CHAR)
DEFINE _O_VERSION = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0" (CHAR)
DEFINE _O_RELEASE = "1903000000" (CHAR)
SQL>
SQL> ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.asm' = '19.0.0.0.0';
Diskgroup altered.
SQL> ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0.0';
Diskgroup altered.
SQL> ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.asm' = '19.0.0.0.0';
Diskgroup altered.
SQL> ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0.0';
Diskgroup altered.
ASMCMD:
SQL> SELECT name, compatibility, database_compatibility FROM v$asm_diskgroup;
NAME COMPATIBILITY DATABASE_COMPATIBILITY
----------- ----------------- ------------------------
CRS 19.0.0.0.0 10.1.0.0.0
DATA 19.0.0.0.0 19.0.0.0.0
FRA 19.0.0.0.0 19.0.0.0.0
The query confirmed that the DATA and FRA disk groups had the updated compatibility settings. The next step is to rerun DBCA and verify that database creation completes successfully.
Raising an ASM compatibility attribute is a one-way change and cannot be lowered later, so advance it only to the version you need. Next time, set both attributes in the ATTRIBUTE clause of CREATE DISKGROUP and this failure never appears.
How This Post Compares to the 26ai RAC Installation
Both guides build a two-node RAC cluster with the same node, VIP, and SCAN layout, so the cluster design carries over. Use this post for 19.3 on Oracle Linux 7.3 with ASMLib, and the 26ai RAC installation post for that release. The compatible.asm failure above comes from creating the disk groups by hand without attributes, so check whether you hit it before running DBCA.
Thank you for reading!
I hope this content has been helpful to you. Your feedback and suggestions are always welcome, so feel free to leave a comment or reach out with any queries.
Abhishek Shrivastava
Oracle DBA with hands-on experience managing production Data Guard, RAC, GoldenGate, and APEX environments. I write practical, tested installation and troubleshooting guides based on real deployment work.
















Comments
Post a Comment