Skip to main content

Oracle Database 26ai RAC Installation and Configuration Guide


  • Introduction: This article provides a step by step guide for installing Oracle Database 26ai RAC in a two node cluster environment. It covers essential prerequisites, Grid Infrastructure installation, ASM configuration, RAC database creation, and post-installation verification steps to help you successfully deploy and validate a functional Oracle RAC setup.

  • Prerequisites: Below are the minimum requirements for Linux environment.
    1. For each node:
      • OS - Linux 8/9
      • CPU - 2core
      • RAM - 8GB
      • SWAP - 8GB
      • Disk space - 50GB (/u01)
      • Must have root user or sudo access.
      • Disable the firewall.
      • 2 Network cards (NIC).
    2. For whole setup:
      • Raw Disk storage - 80GB (For ASM disks)
      • Grid and Database binary. Download here.

  • Scenario: This setup is for learning and testing purposes only. So a lightweight Oracle RAC 26ai lab environment will be built using limited hardware resources. Each node will be configured with 5 GB RAM instead of the recommended 8 GB+, name resolution will be managed through /etc/hosts instead of a DNS server, and ASM shared storage will be created using raw virtual disks rather than a dedicated storage server.

  • Environment:
    1. Network details for each node:
      Server Node 1 Node 2
      Public Hostname rac1.oraeasy.com rac2.oraeasy.com
      Private Hostname rac1-priv.oraeasy.com rac2-priv.oraeasy.com
      Virtual Hostname rac1-vip.oraeasy.com rac2-vip.oraeasy.com
      Scan Hostname rac-scan.oraeasy.com rac-scan.oraeasy.com

    2. Global details for each node:
      VM Tool Oracle VitualBox 7.2
      OS OL 9
      CPU 2 core
      RAM 5GB
      SWAP 5 GB
      Grid/Database Version 26ai (23.26.1)
      Grid Home /u01/app/grid/26ai/grid_1
      Database Home /u01/app/oracle/26ai/db_1
      Grid/Database OS user oracle
      Database Name raccdb

  • Summary of activities: At top level, we will be doing RAC installation in below phases.
    1. Node Preparation.
    2. ASM Disks Configurations.
    3. Oracle Cluster Verification Utility (CVU) Validation.
    4. Oracle Grid Infrastructure Installation.
    5. Oracle Database Software Installation.
    6. RAC Database Creation.
    7. Post-Installation Verification.

  • Now let's proceed to install the Oracle RAC setup step by step:

Node Preparation:

1. First create a machine with required configuration and attach a single network card for internet connectivity. We will add/modify the Network card later for setup . Here we have created our first machine with name "rac1".

[root@rac1 ~]# hostname
rac1.oraeasy.com
[root@rac1 ~]#
[root@rac1 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           2.2G     0  2.2G   0% /dev/shm
tmpfs           893M  9.3M  884M   2% /run
/dev/sda2        15G  5.9G  9.2G  40% /
/dev/sda6        54G  418M   54G   1% /u01
/dev/sda1      1014M  355M  660M  35% /boot
/dev/sda5       5.0G   69M  5.0G   2% /tmp
tmpfs           447M   96K  447M   1% /run/user/1000
[root@rac1 ~]#
[root@rac1 ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           4.4Gi       1.1Gi       2.9Gi        21Mi       616Mi       3.3Gi
Swap:          5.0Gi          0B       5.0Gi

[root@rac1 ~]# ping google.com
PING google.com (172.217.26.110) 56(84) bytes of data.
64 bytes from tzdelb-bj-in-f14.1e100.net (172.217.26.110): icmp_seq=1 ttl=118 time=7.22 ms
64 bytes from tzdelb-bj-in-f14.1e100.net (172.217.26.110): icmp_seq=2 ttl=118 time=5.95 ms
64 bytes from tzdelb-bj-in-f14.1e100.net (172.217.26.110): icmp_seq=3 ttl=118 time=8.93 ms
64 bytes from tzdelb-bj-in-f14.1e100.net (172.217.26.110): icmp_seq=4 ttl=118 time=5.94 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 5.941/7.008/8.928/1.223 ms
[root@rac1 ~]#

2. Now we need to install required prerequisites for Oracle 26ai RAC installation.

[root@rac1 ~]# dnf -y install oracle-ai-database-preinstall-26ai
Oracle Linux 9 BaseOS Latest (x86_64)                                                                          59 kB/s | 120 MB     34:28
Oracle Linux 9 Application Stream Packages (x86_64)                                                            51 kB/s |  89 MB     29:24    
Oracle Linux 9 UEK Release 7 (x86_64)                                                                         110 kB/s | 101 MB     15:38
Last metadata expiration check: 0:00:20 ago on Sat 02 May 2026 11:38:24 AM IST.
Dependencies resolved.
==============================================================================================================================================
 Package                                             Architecture            Version                 Repository                          Size
==============================================================================================================================================
Installing:
 oracle-ai-database-preinstall-26ai                  x86_64                  1.0-1.el9               ol9_appstream                       34 k
Installing dependencies:
 compat-openssl11                                    x86_64                  1:1.1.1k-5.el9_7.1      ol9_appstream                      1.5 M
 initscripts                                         x86_64                  10.11.8-4.0.1.el9       ol9_baseos_latest                  285 k
 ksh                                                 x86_64                  3:1.0.6-7.0.1.el9_6.2   ol9_appstream                      889 k

Transaction Summary
==============================================================================================================
Install  4 Packages

Total download size: 2.6 M
Installed size: 7.8 M
Downloading Packages:
(1/4): initscripts-10.11.8-4.0.1.el9.x86_64.rpm                               122 kB/s | 285 kB     00:02
(2/4): oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64.rpm                187 kB/s |  34 kB     00:00
(3/4): ksh-1.0.6-7.0.1.el9_6.2.x86_64.rpm                                      76 kB/s | 889 kB     00:11
(4/4): compat-openssl11-1.1.1k-5.el9_7.1.x86_64.rpm                           106 kB/s | 1.5 MB     00:14
--------------------------------------------------------------------------------------------------------------
Total                                                                         191 kB/s | 2.6 MB     00:14
Oracle Linux 9 BaseOS Latest (x86_64)                                         6.1 MB/s | 6.2 kB     00:00
Importing GPG key 0x8D8B756F:
 Userid     : "Oracle Linux (release key 1) "
 Fingerprint: 3E6D 826D 3FBA B389 C2F3 8E34 BC4D 06A0 8D8B 756F
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Key imported successfully
Importing GPG key 0x8B4EFBE6:
 Userid     : "Oracle Linux (backup key 1) "
 Fingerprint: 9822 3175 9C74 6706 5D0C E9B2 A7DD 0708 8B4E FBE6
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                          1/1
  Installing       : ksh-3:1.0.6-7.0.1.el9_6.2.x86_64                                                                         1/4
  Running scriptlet: ksh-3:1.0.6-7.0.1.el9_6.2.x86_64                                                                         1/4
  Installing       : compat-openssl11-1:1.1.1k-5.el9_7.1.x86_64                                                               2/4
  Installing       : initscripts-10.11.8-4.0.1.el9.x86_64                                                                     3/4
  Running scriptlet: initscripts-10.11.8-4.0.1.el9.x86_64                                                                     3/4
Created symlink /etc/systemd/system/sysinit.target.wants/import-state.service → /usr/lib/systemd/system/import-state.service.
Created symlink /etc/systemd/system/sysinit.target.wants/loadmodules.service → /usr/lib/systemd/system/loadmodules.service.

  Installing       : oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64                                                      4/4
  Running scriptlet: oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64                                                      4/4
  Verifying        : initscripts-10.11.8-4.0.1.el9.x86_64                                                                     1/4
  Verifying        : compat-openssl11-1:1.1.1k-5.el9_7.1.x86_64                                                               2/4
  Verifying        : ksh-3:1.0.6-7.0.1.el9_6.2.x86_64                                                                         3/4
  Verifying        : oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64                                                      4/4

Installed:
  compat-openssl11-1:1.1.1k-5.el9_7.1.x86_64  initscripts-10.11.8-4.0.1.el9.x86_64  ksh-3:1.0.6-7.0.1.el9_6.2.x86_64
  oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64

Complete!
[root@rac1 ~]#

3. Now configure the additional OS groups for "Oracle" user and change its password. We will be using "oracle" user for both Grid and Database Home.

[root@rac1 ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)
[root@rac1 ~]#
[root@rac1 ~]#
[root@rac1 ~]# groupadd -g 54331 asmadmin
[root@rac1 ~]# groupadd -g 54332 asmdba
[root@rac1 ~]# groupadd -g 54333 asmoper
[root@rac1 ~]# usermod -a -G asmadmin,asmdba,asmoper oracle
[root@rac1 ~]# 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@rac1 ~]#
[root@rac1 ~]# 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@rac1 ~]#

4. Now create directories for Grid & Database Home.

[root@rac1 ~]# mkdir -p /u01/app/grid/26ai/grid_1
[root@rac1 ~]# mkdir -p /u01/grid
[root@rac1 ~]# mkdir -p /u01/app/oracle/26ai/grid_1
[root@rac1 ~]# chown -R oracle:oinstall /u01
[root@rac1 ~]#
[root@rac1 ~]# chmod -R 775 /u01

5. Now configure SELINUX & Disable Firewall.

[root@rac1 ~]# cat /etc/selinux/config | grep SELINUX
# SELINUX= can take one of these three values:
# NOTE: In earlier Fedora kernel builds, SELINUX=disabled would also
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
SELINUXTYPE=targeted
[root@rac1 ~]#
[root@rac1 ~]# vi /etc/selinux/config
[root@rac1 ~]#
[root@rac1 ~]# cat /etc/selinux/config | grep SELINUX
# SELINUX= can take one of these three values:
# NOTE: In earlier Fedora kernel builds, SELINUX=disabled would also
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
SELINUXTYPE=targeted
[root@rac1 ~]#

[root@rac1 ~]# 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 Sat 2026-05-02 09:37:03 IST; 3h 17min ago
       Docs: man:firewalld(1)
   Main PID: 731 (firewalld)
      Tasks: 2 (limit: 28166)
     Memory: 42.0M
        CPU: 1.828s
     CGroup: /system.slice/firewalld.service
             └─731 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

May 02 09:36:52 rac1.oraeasy.com systemd[1]: Starting firewalld - dynamic firewall daemon...
May 02 09:37:03 rac1.oraeasy.com systemd[1]: Started firewalld - dynamic firewall daemon.
[root@rac1 ~]#
[root@rac1 ~]# systemctl stop firewalld
[root@rac1 ~]# systemctl disable firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@rac1 ~]#
[root@rac1 ~]# 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)

May 02 09:36:52 rac1.oraeasy.com systemd[1]: Starting firewalld - dynamic firewall daemon...
May 02 09:37:03 rac1.oraeasy.com systemd[1]: Started firewalld - dynamic firewall daemon.
May 02 12:54:25 rac1.oraeasy.com systemd[1]: Stopping firewalld - dynamic firewall daemon...
May 02 12:54:25 rac1.oraeasy.com systemd[1]: firewalld.service: Deactivated successfully.
May 02 12:54:25 rac1.oraeasy.com systemd[1]: Stopped firewalld - dynamic firewall daemon.
May 02 12:54:25 rac1.oraeasy.com systemd[1]: firewalld.service: Consumed 1.977s CPU time.
[root@rac1 ~]#
6. Now configure the /etc/hosts files and add the IPs details. These IPs set can be vary according to your setup.

[root@rac1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@rac1 ~]#
[root@rac1 ~]# vi /etc/hosts
[root@rac1 ~]#
[root@rac1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# Public
192.168.80.11    rac1.oraeasy.com        rac1
192.168.80.12    rac2.oraeasy.com        rac2

# Virtual
192.168.80.21    rac1-vip.oraeasy.com    rac1-vip
192.168.80.22    rac2-vip.oraeasy.com    rac2-vip


# SCAN
192.168.80.31    rac-scan.oraeasy.com    rac-scan
192.168.80.32    rac-scan.oraeasy.com    rac-scan
192.168.80.33    rac-scan.oraeasy.com    rac-scan


# Private
192.168.10.11    rac1-priv.oraeasy.com   rac1-priv
192.168.10.12    rac2-priv.oraeasy.com   rac2-priv
[root@rac1 ~]#

7. Now switch to "oracle" user and create environment files for Grid & Database Home.

For Grid Home:

[oracle@rac1 ~]$ vi .grid.env
[oracle@rac1 ~]$ 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/26ai/grid_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH

[oracle@rac1 ~]$ chmod 775 .grid.env
[oracle@rac1 ~]$ . .grid.env
[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/26ai/grid_1
ORACLE_SID=+ASM1
[oracle@rac1 ~]$

For Database Home:

[oracle@rac1 ~]$ vi .db_env
[oracle@rac1 ~]$ cat .db_env
# Environment variables for Database - DB Home
ORACLE_SID=raccdb1; export ORACLE_SID
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/26ai/db_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH

[oracle@rac1 ~]$ chmod 775 .db_env
[oracle@rac1 ~]$ . .db_env
[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/26ai/db_1
ORACLE_SID=raccdb1
[oracle@rac1 ~]$

8. Now we need to add the Network cards to the machine. So shutdown the machine & follow below steps.

In the machine setting, go to Network Section. Check the box "Enable Network Adapater", in "Attached To" select "Internal Network" and last give the name "Pubnet (Public Network)". Leave the rest things as default and click OK.

Similarly add for the "Privnet (Private Network)".

Now we can view the attached Network Cards. You can see the one extra Network Card, which was added during machine creation for Internet.

9. Now start the machine and confgiure the IPs by following below steps.

Inside the machine, go to Setting --> Network. Click on the setting icon for first Ethernet.

Now in IPv4 section, select "IPv4 Method" as "Manual". Then provide the "Address", "Netmask" and "Gateway" details. Last click OK. We are using this as for Public Network. Please note these details are as per my setup and you can have different as per your setup.

Similarly edit the configuration for Private Network.

Now enable the radio button and connect all the Networks.

Now verify all the IPs.

[root@rac1 ~]# ifconfig
enp0s3: flags=4163  mtu 1500
        inet 192.168.80.11  netmask 255.255.255.0  broadcast 192.168.80.255
        inet6 fe80::a00:27ff:fe25:7f8b  prefixlen 64  scopeid 0x20
        ether 08:00:27:25:7f:8b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 124  bytes 19407 (18.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163  mtu 1500
        inet 192.168.10.11  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::cc06:984:1b8f:e25c  prefixlen 64  scopeid 0x20
        ether 08:00:27:e5:5b:12  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 57  bytes 8210 (8.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s9: flags=4163  mtu 1500
        inet 192.168.1.41  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::3449:ab9d:607e:c035  prefixlen 64  scopeid 0x20
        ether 08:00:27:39:00:c7  txqueuelen 1000  (Ethernet)
        RX packets 522  bytes 54201 (52.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 327  bytes 36148 (35.3 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 1000  (Local Loopback)
        RX packets 317  bytes 20992 (20.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 317  bytes 20992 (20.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@rac1 ~]#

10. Now we will clone this machine and prepare the 2nd Node. So shutdown this machine and follow below steps.

Right click on Machine and click Clone.

Provide the machine name as "rac2" and select its location. Leave the rest as default and click Finish.

Monitor the progress.

Once completed, you can view the new machine.
11. Now start the 2nd machine and change its Hostname & IPs, and also edit the environment files with "oracle" user. You can refer the steps 5,6 & 8. Post that verify all the details.

[root@rac2 ~]# hostname
rac2.oraeasy.com
[root@rac2 ~]#
[root@rac2 ~]# ifconfig
enp0s3: flags=4163  mtu 1500
        inet 192.168.80.12  netmask 255.255.255.0  broadcast 192.168.80.255
        inet6 fe80::a00:27ff:fe9b:a7ae  prefixlen 64  scopeid 0x20
        ether 08:00:27:9b:a7:ae  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59  bytes 6064 (5.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163  mtu 1500
        inet 192.168.10.12  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::cc06:984:1b8f:e25c  prefixlen 64  scopeid 0x20
        ether 08:00:27:78:db:95  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59  bytes 6064 (5.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s9: flags=4163  mtu 1500
        inet 192.168.1.42  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::3449:ab9d:607e:c035  prefixlen 64  scopeid 0x20
        ether 08:00:27:06:30:39  txqueuelen 1000  (Ethernet)
        RX packets 4852  bytes 490496 (479.0 KiB)
        RX errors 3  dropped 0  overruns 0  frame 3
        TX packets 471  bytes 48984 (47.8 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 1000  (Local Loopback)
        RX packets 419  bytes 26218 (25.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 419  bytes 26218 (25.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@rac2 ~]#

[root@rac2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# Public
192.168.80.11    rac1.oraeasy.com        rac1
192.168.80.12    rac2.oraeasy.com        rac2

# Virtual
192.168.80.21    rac1-vip.oraeasy.com    rac1-vip
192.168.80.22    rac2-vip.oraeasy.com    rac2-vip


# SCAN
192.168.80.31    rac-scan.oraeasy.com    rac-scan
192.168.80.32    rac-scan.oraeasy.com    rac-scan
192.168.80.33    rac-scan.oraeasy.com    rac-scan


# Private
192.168.10.11    rac1-priv.oraeasy.com   rac1-priv
192.168.10.12    rac2-priv.oraeasy.com   rac2-priv
[root@rac2 ~]#

For Grid Home:

[oracle@rac2 ~]$ vi .grid.env
[oracle@rac2 ~]$ 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/26ai/grid_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@rac2 ~]$
[oracle@rac2 ~]$ . .grid.env
[oracle@rac2 ~]$
[oracle@rac2 ~]$ env|grep ORA
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/26ai/grid_1
ORACLE_SID=+ASM2

For Database Home:

[oracle@rac2 ~]$ vi .db_env
[oracle@rac2 ~]$ cat .db_env
# Environment variables for Database - DB Home
ORACLE_SID=raccdb2; export ORACLE_SID
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/26ai/db_1; export ORACLE_HOME
JAVA_HOME=/usr/bin/java; export JAVA_HOME
PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:$PATH:.
export PATH
[oracle@rac2 ~]$
[oracle@rac2 ~]$ . .db_env
[oracle@rac2 ~]$ env|grep ORA
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/26ai/db_1
ORACLE_SID=raccdb2
[oracle@rac2 ~]$

12. Now our both nodes has been configured for installation, so let's keep running both the machines and check the connectivity between them for Public & Private networks.

From Node 1 to Node 2:

[root@rac1 ~]# ping rac2 -c 3
PING rac2.oraeasy.com (192.168.80.12) 56(84) bytes of data.
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=1 ttl=64 time=0.744 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=2 ttl=64 time=1.07 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=3 ttl=64 time=0.485 ms

--- rac2.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2035ms
rtt min/avg/max/mdev = 0.485/0.766/1.070/0.239 ms
[root@rac1 ~]#
[root@rac1 ~]#
[root@rac1 ~]# ping rac2-priv -c 3
PING rac2-priv.oraeasy.com (192.168.10.12) 56(84) bytes of data.
64 bytes from rac2-priv.oraeasy.com (192.168.10.12): icmp_seq=1 ttl=64 time=0.643 ms
64 bytes from rac2-priv.oraeasy.com (192.168.10.12): icmp_seq=2 ttl=64 time=0.933 ms
64 bytes from rac2-priv.oraeasy.com (192.168.10.12): icmp_seq=3 ttl=64 time=1.15 ms

--- rac2-priv.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2065ms
rtt min/avg/max/mdev = 0.643/0.908/1.150/0.207 ms
[root@rac1 ~]#

From Node 2 to Node 1:

[root@rac2 ~]# ping rac1 -c 3
PING rac1.oraeasy.com (192.168.80.11) 56(84) bytes of data.
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=1 ttl=64 time=0.586 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=2 ttl=64 time=1.10 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=3 ttl=64 time=1.04 ms

--- rac1.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2144ms
rtt min/avg/max/mdev = 0.586/0.909/1.104/0.230 ms
[root@rac2 ~]#
[root@rac2 ~]# ping rac1-priv -c 3
PING rac1-priv.oraeasy.com (192.168.10.11) 56(84) bytes of data.
64 bytes from rac1-priv.oraeasy.com (192.168.10.11): icmp_seq=1 ttl=64 time=0.792 ms
64 bytes from rac1-priv.oraeasy.com (192.168.10.11): icmp_seq=2 ttl=64 time=0.913 ms
64 bytes from rac1-priv.oraeasy.com (192.168.10.11): icmp_seq=3 ttl=64 time=0.980 ms

--- rac1-priv.oraeasy.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2271ms
rtt min/avg/max/mdev = 0.792/0.895/0.980/0.077 ms
[root@rac2 ~]#
[root@rac2 ~]#


==> Now our both nodes have been prepared for further installation, so let's move forward for next phase.

ASM Disks configurations:

1. Now we need to add a raw disk for ASM disks to machine.

View the current attached hard disk on Node 1.

[root@rac1 ~]# fdisk -l
Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa653ae

Device     Boot    Start       End   Sectors Size Id Type
/dev/sda1  *        2048   2099199   2097152   1G 83 Linux
/dev/sda2        2099200  33556479  31457280  15G 83 Linux
/dev/sda3       33556480  44042239  10485760   5G 82 Linux swap / Solaris
/dev/sda4       44042240 167772159 123729920  59G  f W95 Ext'd (LBA)
/dev/sda5       44044288  54530047  10485760   5G 83 Linux
/dev/sda6       54532096 167772159 113240064  54G 83 Linux
[root@rac1 ~]#

2. Now shutdown both the machines and follow below steps.

In left panel, click on Media icon. Then in Hard disk section, click on Create.

Now Provide disk name & size, select the Hard disk type: VDI, and select Pre-Allocate, as it will be used as ASM storage. Click Finish.

Monitor the Progess.

Once completed, Hard disk can be viewed. Now make its Type from Normal to Shareable. Then click Apply.

Now select the 1st machine and then click on Storage. In controller SATA section, click on Add Hard disk.

Select the disk name and click Choose.

Last click OK.

Do similar steps for Node 2.

Now in Storage, you can see the added hard disk.

3. Now start both the machines and view the new attached hard disk.

Node 1:

[root@rac1 ~]# fdisk -l
Disk /dev/sdb: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
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: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa653ae

Device     Boot    Start       End   Sectors Size Id Type
/dev/sda1  *        2048   2099199   2097152   1G 83 Linux
/dev/sda2        2099200  33556479  31457280  15G 83 Linux
/dev/sda3       33556480  44042239  10485760   5G 82 Linux swap / Solaris
/dev/sda4       44042240 167772159 123729920  59G  f W95 Ext'd (LBA)
/dev/sda5       44044288  54530047  10485760   5G 83 Linux
/dev/sda6       54532096 167772159 113240064  54G 83 Linux
[root@rac1 ~]#

Node 2:

[root@rac2 ~]# fdisk -l
Disk /dev/sdb: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
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: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa653ae

Device     Boot    Start       End   Sectors Size Id Type
/dev/sda1  *        2048   2099199   2097152   1G 83 Linux
/dev/sda2        2099200  33556479  31457280  15G 83 Linux
/dev/sda3       33556480  44042239  10485760   5G 82 Linux swap / Solaris
/dev/sda4       44042240 167772159 123729920  59G  f W95 Ext'd (LBA)
/dev/sda5       44044288  54530047  10485760   5G 83 Linux
/dev/sda6       54532096 167772159 113240064  54G 83 Linux
[root@rac2 ~]#
4. Now we need to make the partition for new hard disk. So let's procced for this on Node 1.

[root@rac1 ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.37.4).
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.
Created a new DOS disklabel with disk identifier 0x666322ba.

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-167772159, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-167772159, default 167772159): +45G

Created a new partition 1 of type 'Linux' and of size 45 GiB.

--> Do same for next two partition:

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (2-4, default 2):
First sector (94373888-167772159, default 94373888):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (94373888-167772159, default 167772159): +25G

Created a new partition 2 of type 'Linux' and of size 25 GiB.

Command (m for help): n
Partition type
   p   primary (2 primary, 0 extended, 2 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (3,4, default 3):
First sector (146802688-167772159, default 146802688):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (146802688-167772159, default 167772159):

Created a new partition 3 of type 'Linux' and of size 10 GiB.

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@rac1 ~]# fdisk -l
Disk /dev/sdb: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x666322ba

Device     Boot     Start       End  Sectors Size Id Type
/dev/sdb1            2048  94373887 94371840  45G 83 Linux
/dev/sdb2        94373888 146802687 52428800  25G 83 Linux
/dev/sdb3       146802688 167772159 20969472  10G 83 Linux

Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa653ae

Device     Boot    Start       End   Sectors Size Id Type
/dev/sda1  *        2048   2099199   2097152   1G 83 Linux
/dev/sda2        2099200  33556479  31457280  15G 83 Linux
/dev/sda3       33556480  44042239  10485760   5G 82 Linux swap / Solaris
/dev/sda4       44042240 167772159 123729920  59G  f W95 Ext'd (LBA)
/dev/sda5       44044288  54530047  10485760   5G 83 Linux
/dev/sda6       54532096 167772159 113240064  54G 83 Linux
[root@rac1 ~]#

Node 2:

[root@rac2 ~]# fdisk -l
Disk /dev/sdb: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x666322ba

Device     Boot     Start       End  Sectors Size Id Type
/dev/sdb1            2048  94373887 94371840  45G 83 Linux
/dev/sdb2        94373888 146802687 52428800  25G 83 Linux
/dev/sdb3       146802688 167772159 20969472  10G 83 Linux

Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa653ae

Device     Boot    Start       End   Sectors Size Id Type
/dev/sda1  *        2048   2099199   2097152   1G 83 Linux
/dev/sda2        2099200  33556479  31457280  15G 83 Linux
/dev/sda3       33556480  44042239  10485760   5G 82 Linux swap / Solaris
/dev/sda4       44042240 167772159 123729920  59G  f W95 Ext'd (LBA)
/dev/sda5       44044288  54530047  10485760   5G 83 Linux
/dev/sda6       54532096 167772159 113240064  54G 83 Linux
[root@rac2 ~]#


==> Now we will configure ASM disks. For this we will use udev (Userspace Device or Userpace /dev)

UDEV: It is the Linux device manager used to manage hardware devices dynamically. In Oracle RAC, it helps create persistent permissions and device mappings for ASM disks under /dev. Using udev, it ensures disks keep the same ownership and access settings even after reboot. On OL8/OL9, udev is commonly preferred over ASMLib because it is built into Linux and easier to maintain.

5. Now we need to fetch ID_SERIAL or PART_ENTRY_UUID of our newly created partitions. Then we will use one of them in configuration whichever is unique in all.

[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb1 | grep ID_SERIAL
E: ID_SERIAL=VBOX_HARDDISK_VB016a3ff1-5d1e937c
E: ID_SERIAL_SHORT=VB016a3ff1-5d1e937c
[root@rac1 ~]#
[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb2 | grep ID_SERIAL
E: ID_SERIAL=VBOX_HARDDISK_VB016a3ff1-5d1e937c
E: ID_SERIAL_SHORT=VB016a3ff1-5d1e937c
[root@rac1 ~]#
[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb3 | grep ID_SERIAL
E: ID_SERIAL=VBOX_HARDDISK_VB016a3ff1-5d1e937c
E: ID_SERIAL_SHORT=VB016a3ff1-5d1e937c
[root@rac1 ~]#
[root@rac1 ~]#
[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb1 | grep PART_ENTRY_UUID
E: ID_PART_ENTRY_UUID=666322ba-01
[root@rac1 ~]#
[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb2 | grep PART_ENTRY_UUID
E: ID_PART_ENTRY_UUID=666322ba-02
[root@rac1 ~]#
[root@rac1 ~]# udevadm info --query=all --name=/dev/sdb3 | grep PART_ENTRY_UUID
E: ID_PART_ENTRY_UUID=666322ba-03
[root@rac1 ~]#


==> As per above output PART_ENTRY_UUID value is unique so will use that in configuration.

6. Now create custom udev rules file used to define persistent ASM disk permissions and ownership for Oracle ASM environments.

[root@rac1 ~]# vi /etc/udev/rules.d/99-oracle-asm.rules
[root@rac1 ~]# cat /etc/udev/rules.d/99-oracle-asm.rules
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-01", SYMLINK+="asm-data1", OWNER="oracle", GROUP="asmdba", MODE="0660"
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-02", SYMLINK+="asm-fra1",  OWNER="oracle", GROUP="asmdba", MODE="0660"
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-03", SYMLINK+="asm-crs1",  OWNER="oracle", GROUP="asmdba", MODE="0660"

7. Now transfer this file to Node 2 and verify.

[root@rac1 ~]# scp /etc/udev/rules.d/99-oracle-asm.rules root@rac2:/etc/udev/rules.d/
The authenticity of host 'rac2 (192.168.80.12)' can't be established.
ED25519 key fingerprint is SHA256:2CH2fx4xpcQBVTKO/W+6utc3T81pa7JcFmKngApPvDs.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'rac2' (ED25519) to the list of known hosts.
root@rac2's password:
99-oracle-asm.rules                 100%  354   156.3KB/s   00:00
[root@rac1 ~]#

Node 2:

[root@rac2 ~]#  cat /etc/udev/rules.d/99-oracle-asm.rules
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-01", SYMLINK+="asm-data1", OWNER="oracle", GROUP="asmdba", MODE="0660"
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-02", SYMLINK+="asm-fra1",  OWNER="oracle", GROUP="asmdba", MODE="0660"
KERNEL=="sd*", ENV{ID_PART_ENTRY_UUID}=="666322ba-03", SYMLINK+="asm-crs1",  OWNER="oracle", GROUP="asmdba", MODE="0660"
[root@rac2 ~]#

8. Now need to enable the rules for ASM disks. Run this on both Nodes.

Node 1:

[root@rac1 ~]# ls -l /dev/asm-*
ls: cannot access '/dev/asm-*': No such file or directory
[root@rac1 ~]# udevadm control --reload-rules
[root@rac1 ~]#
[root@rac1 ~]# udevadm trigger
[root@rac1 ~]#
[root@rac1 ~]# ls -l /dev/asm-*
lrwxrwxrwx. 1 root root 4 May  4 21:35 /dev/asm-crs1 -> sdb3
lrwxrwxrwx. 1 root root 4 May  4 21:35 /dev/asm-data1 -> sdb1
lrwxrwxrwx. 1 root root 4 May  4 21:35 /dev/asm-fra1 -> sdb2
[root@rac1 ~]#
[root@rac1 ~]# ls -l /dev/sdb1 /dev/sdb2 /dev/sdb3
brw-rw----. 1 oracle asmdba 8, 17 May  4 21:35 /dev/sdb1
brw-rw----. 1 oracle asmdba 8, 18 May  4 21:35 /dev/sdb2
brw-rw----. 1 oracle asmdba 8, 19 May  4 21:35 /dev/sdb3

Node 2:

[root@rac2 ~]# udevadm control --reload-rules
[root@rac2 ~]#
[root@rac2 ~]# udevadm trigger
[root@rac2 ~]#
[root@rac2 ~]#  ls -l /dev/asm-*
lrwxrwxrwx. 1 root root 4 May  4 21:36 /dev/asm-crs1 -> sdb3
lrwxrwxrwx. 1 root root 4 May  4 21:36 /dev/asm-data1 -> sdb1
lrwxrwxrwx. 1 root root 4 May  4 21:36 /dev/asm-fra1 -> sdb2
[root@rac2 ~]#
[root@rac2 ~]# ls -l /dev/sdb1 /dev/sdb2 /dev/sdb3
brw-rw----. 1 oracle asmdba 8, 17 May  4 21:36 /dev/sdb1
brw-rw----. 1 oracle asmdba 8, 18 May  4 21:36 /dev/sdb2
brw-rw----. 1 oracle asmdba 8, 19 May  4 21:36 /dev/sdb3
[root@rac2 ~]#


==> Now ASM disks configuration has been completed, so let's move forward for next phase.

Oracle Cluster Verification Utility (CVU) Validation:

We need to run runcluvfy.pl script which will be in Grid Home software. It is the Oracle Cluster Verification Utility (CVU) script used to validate Oracle RAC environment readiness. Prior to run this script , we need to configure the password less connectivity between nodes. So let's proceed for that.

1. First generate an RSA 2048-bit SSH key pair using the ssh-keygen command.

Node 1:

[oracle@rac1 scripts]$ rm -f ~/.ssh/id_rsa*
[oracle@rac1 scripts]$ ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /home/oracle/.ssh/id_rsa
Your public key has been saved in /home/oracle/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Yc40248z+X3eTRk/WLgTsu/KHrtS1SxoTQkbm8VUcPs oracle@rac1.oraeasy.com
The key's randomart image is:
+---[RSA 2048]----+
|           o+++o |
|            *+. .|
|        =  ++ o. |
|       = = o +.o.|
|        S o..o.oE|
|           =o = +|
|          *o.+ oo|
|         ..++...=|
|          o*=o.o+|
+----[SHA256]-----+
[oracle@rac1 scripts]$

Node 2:

[oracle@rac2 ~]$ rm -f ~/.ssh/id_rsa*
[oracle@rac2 ~]$ ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /home/oracle/.ssh/id_rsa
Your public key has been saved in /home/oracle/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:bI06DzYzwSKee70ksdJ8wPfuKV1vKpVaYvhoOm+vWdQ oracle@rac2.oraeasy.com
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|   . . . +       |
|  . = +.S E.     |
| . = *.*o =      |
|  + =.@=o* .     |
|   oo=*@=.  o    |
|  ...*=**..o     |
+----[SHA256]-----+
[oracle@rac2 ~]$

2. Now on Node 1 place and unzip the Grid Home software.

[oracle@rac1 software]$ pwd
/home/oracle/software
[oracle@rac1 software]$ ls -lrth LINUX.X64_2326100_grid_home.zip
-rw-r--r--. 1 oracle oinstall 1.1G May  4 21:43 LINUX.X64_2326100_grid_home.zip
[oracle@rac1 software]$ unzip LINUX.X64_2326100_grid_home.zip -d /u01/app/grid/26ai/grid_1

3. Now run sshUserSetup.sh script to configure the password less connectivity.
Syntax: ./sshUserSetup.sh -user "username" -hosts "node1 node2" -noPromptPassphrase -confirm -advanced


[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/26ai/grid_1
ORACLE_SID=+ASM1
[oracle@rac1 ~]$ ll $ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh
-rwxr-x---. 1 oracle oinstall 33333 Jan  7  2015 /u01/app/grid/26ai/grid_1/oui/prov/resources/scripts/sshUserSetup.sh
[oracle@rac1 ~]$
[oracle@rac1 ~]$ cd $ORACLE_HOME/oui/prov/resources/scripts
[oracle@rac1 scripts]$ ./sshUserSetup.sh -user oracle -hosts "rac1 rac2" -noPromptPassphrase -confirm -advanced
The output of this script is also logged into /tmp/sshUserSetup_2026-05-05-20-04-28.log
Hosts are rac1 rac2
user is oracle
Platform:- Linux
Checking if the remote hosts are reachable
PING rac1.oraeasy.com (192.168.80.11) 56(84) bytes of data.
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=4 ttl=64 time=0.062 ms
64 bytes from rac1.oraeasy.com (192.168.80.11): icmp_seq=5 ttl=64 time=0.058 ms

--- rac1.oraeasy.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms
rtt min/avg/max/mdev = 0.022/0.055/0.070/0.017 ms
PING rac2.oraeasy.com (192.168.80.12) 56(84) bytes of data.
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=1 ttl=64 time=0.549 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=2 ttl=64 time=1.54 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=3 ttl=64 time=1.08 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=4 ttl=64 time=1.42 ms
64 bytes from rac2.oraeasy.com (192.168.80.12): icmp_seq=5 ttl=64 time=1.42 ms

--- rac2.oraeasy.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4157ms
rtt min/avg/max/mdev = 0.549/1.202/1.540/0.360 ms
Remote host reachability check succeeded.
The following hosts are reachable: rac1 rac2.
The following hosts are not reachable: .
All hosts are reachable. Proceeding further...
firsthost rac1
numhosts 2
The script will setup SSH connectivity from the host rac1.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 rac1.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 rac1
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 rac1. 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 rac1.
Warning: Permanently added 'rac1' (ED25519) to the list of known hosts.
oracle@rac1's password:
Done with creating .ssh directory and setting permissions on remote host rac1.
Creating .ssh directory and setting permissions on remote host rac2
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 rac2. 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 rac2.
Warning: Permanently added 'rac2' (ED25519) to the list of known hosts.
oracle@rac2's password:
Done with creating .ssh directory and setting permissions on remote host rac2.
Copying local host public key to the remote host rac1
The user may be prompted for a password or passphrase here since the script would be using SCP for host rac1.
oracle@rac1's password:
Done copying local host public key to the remote host rac1
Copying local host public key to the remote host rac2
The user may be prompted for a password or passphrase here since the script would be using SCP for host rac2.
oracle@rac2's password:
Done copying local host public key to the remote host rac2
Creating keys on remote host rac1 if they do not exist already. This is required to setup SSH on host rac1.

Creating keys on remote host rac2 if they do not exist already. This is required to setup SSH on host rac2.

Updating authorized_keys file on remote host rac1
Updating known_hosts file on remote host rac1
Updating authorized_keys file on remote host rac2
Updating known_hosts file on remote host rac2
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.
------------------------------------------------------------------------
--rac1:--
Running /usr/bin/ssh -x -l oracle rac1 date to verify SSH connectivity has been setup from local host to rac1.
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.
Tue May  5 08:05:01 PM IST 2026
------------------------------------------------------------------------
--rac2:--
Running /usr/bin/ssh -x -l oracle rac2 date to verify SSH connectivity has been setup from local host to rac2.
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.
Tue May  5 08:05:02 PM IST 2026
------------------------------------------------------------------------
------------------------------------------------------------------------
Verifying SSH connectivity has been setup from rac1 to rac1
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.
Tue May  5 08:05:03 PM IST 2026
------------------------------------------------------------------------
------------------------------------------------------------------------
Verifying SSH connectivity has been setup from rac1 to rac2
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.
Tue May  5 08:05:04 PM IST 2026
------------------------------------------------------------------------
-Verification from complete-
SSH verification complete.
[oracle@rac1 scripts]$

4. Now verify the password less connectivity.

Node 1:

[oracle@rac1 scripts]$ ssh rac2
Last login: Tue May  5 20:03:46 2026 from 192.168.1.36
[oracle@rac2 ~]$

Node 2:

[oracle@rac2 ~]$ ssh rac1
Last login: Tue May  5 18:09:14 2026 from 192.168.1.36
[oracle@rac1 ~]$

5. Now run the runcluvfy.pl script.

[oracle@rac1 ~]$ . .grid.env
[oracle@rac1 ~]$
[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/26ai/grid_1
ORACLE_SID=+ASM1
[oracle@rac1 ~]$ cd $ORACLE_HOME/bin
[oracle@rac1 bin]$ ./runcluvfy.pl stage -pre crsinst -n rac1,rac2 -verbose
-bash: ./runcluvfy.pl: Permission denied
[oracle@rac1 bin]$ ll ./runcluvfy.pl
-rw-r-----. 1 oracle oinstall 3181 Aug 24  2017 ./runcluvfy.pl
[oracle@rac1 bin]$ chmod +x $ORACLE_HOME/bin/runcluvfy.pl
[oracle@rac1 bin]$
[oracle@rac1 bin]$ ./runcluvfy.pl stage -pre crsinst -n rac1,rac2 -verbose

Initializing ...

Performing following verification checks ...

  Physical Memory ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          4.3578GB (4569516.0KB)    8GB (8388608.0KB)         failed
    rac1          4.3578GB (4569516.0KB)    8GB (8388608.0KB)         failed
  Physical Memory ...FAILED (PRVF-7530)
  Available Physical Memory ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          3.8115GB (3996652.0KB)    50MB (51200.0KB)          passed
    rac1          2.6638GB (2793212.0KB)    50MB (51200.0KB)          passed
  Available Physical Memory ...PASSED
  Swap Size ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          5GB (5242876.0KB)         4.3578GB (4569516.0KB)    passed
    rac1          5GB (5242876.0KB)         4.3578GB (4569516.0KB)    passed
  Swap Size ...PASSED
  Free Space: rac2:/usr,rac2:/var,rac2:/etc,rac2:/sbin ...
    Path              Node Name     Mount point   Available     Required      Status
    ----------------  ------------  ------------  ------------  ------------  ------------
    /usr              rac2          /             8.624GB       25MB          passed
    /var              rac2          /             8.624GB       5MB           passed
    /etc              rac2          /             8.624GB       25MB          passed
    /sbin             rac2          /             8.624GB       10MB          passed

    rac1          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".

Physical Memory ...FAILED
rac2: PRVF-7530 : Sufficient physical memory is not available on node "rac2"
      [Required physical memory = 8GB (8388608.0KB)]

rac1: PRVF-7530 : Sufficient physical memory is not available on node "rac1"
      [Required physical memory = 8GB (8388608.0KB)]

Package: policycoreutils-3.5-1 ...FAILED
rac2: PRVF-7533 : Proper version of package "policycoreutils" is not found on
      node "rac2" [Required = "policycoreutils-3.5-1" ; Found =
      "policycoreutils-3.4-4.el9"].

rac1: PRVF-7533 : Proper version of package "policycoreutils" is not found on
      node "rac1" [Required = "policycoreutils-3.5-1" ; Found =
      "policycoreutils-3.4-4.el9"].

Package: policycoreutils-python-utils-3.5-1 ...FAILED
rac2: PRVF-7533 : Proper version of package "policycoreutils-python-utils" is
      not found on node "rac2" [Required = "policycoreutils-python-utils-3.5-1"
      ; Found = "policycoreutils-python-utils-3.4-4.el9"].

rac1: PRVF-7533 : Proper version of package "policycoreutils-python-utils" is
      not found on node "rac1" [Required = "policycoreutils-python-utils-3.5-1"
      ; Found = "policycoreutils-python-utils-3.4-4.el9"].

resolv.conf Integrity ...FAILED
rac2: PRVG-10048 : Name "rac2" was not resolved to an address of the specified
      type by name servers "38.254.163.4".
rac2: PRVG-10048 : Name "rac2" was not resolved to an address of the specified
      type by name servers "139.5.241.15".

rac1: PRVG-10048 : Name "rac1" was not resolved to an address of the specified
      type by name servers "38.254.163.4".
rac1: PRVG-10048 : Name "rac1" was not resolved to an address of the specified
      type by name servers "139.5.241.15".

Daemon "avahi-daemon" not configured and running ...FAILED
rac2: PRVG-1359 : Daemon process "avahi-daemon" is configured on node "rac2"
rac2: PRVG-1360 : Daemon process "avahi-daemon" is running on node "rac2"

rac1: PRVG-1359 : Daemon process "avahi-daemon" is configured on node "rac1"
rac1: PRVG-1360 : Daemon process "avahi-daemon" is running on node "rac1"

Refer to My Oracle Support notes "2625498.1" for more details regarding errors
PRVG-1359".

RPM Package Manager database ...INFORMATION
PRVG-11250 : The check "RPM Package Manager database" was not performed because
it needs 'root' user privileges.

Refer to My Oracle Support notes "2548970.1" for more details regarding errors
PRVG-11250".

cgroup OS compatibility ...INFORMATION
PRVG-11250 : The check "cgroup OS compatibility" was not performed because it
needs 'root' user privileges.

Refer to My Oracle Support notes "2548970.1" for more details regarding errors
PRVG-11250".

ORAchk health score ...INFORMATION
PRVH-1507 : ORAchk/EXAchk checks are skipped.

CVU operation performed:      stage -pre crsinst
Date:                         May 5, 2026, 8:25:41 PM
CVU version:                  23.26.1.0.0 (010926x8664)
CVU home:                     /u01/app/grid/26ai/grid_1
User:                         oracle
Operating system:             Linux5.15.0-3.60.5.1.el9uek.x86_64
[oracle@rac1 bin]$


6. Now we have got some precheck failed. From above we can ignore the "Physical Memory" & "resolv.conf Integrity" as we are doing a test setup. So let's proceed to fix the other failures. Start with Node 1.

avahi-daemon:

[root@rac1 ~]# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
     Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2026-05-05 17:59:11 IST; 3h 5min ago
TriggeredBy: ● avahi-daemon.socket
   Main PID: 697 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 28166)
     Memory: 2.2M
        CPU: 435ms
     CGroup: /system.slice/avahi-daemon.service
             ├─697 "avahi-daemon: running [rac1.local]"
             └─720 "avahi-daemon: chroot helper"

May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: Registering new address record for fe80::a00:27ff:fe25:7f8b on enp0s3.*.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: Joining mDNS multicast group on interface enp0s8.IPv6 with address fe80::cc06:984:1b8f:e25c.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: New relevant interface enp0s8.IPv6 for mDNS.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: Registering new address record for fe80::cc06:984:1b8f:e25c on enp0s8.*.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: Joining mDNS multicast group on interface enp0s9.IPv6 with address fe80::3449:ab9d:607e:c035.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: New relevant interface enp0s9.IPv6 for mDNS.
May 05 17:59:16 rac1.oraeasy.com avahi-daemon[697]: Registering new address record for fe80::3449:ab9d:607e:c035 on enp0s9.*.
May 05 17:59:17 rac1.oraeasy.com avahi-daemon[697]: Joining mDNS multicast group on interface enp0s9.IPv4 with address 192.168.1.41.
May 05 17:59:17 rac1.oraeasy.com avahi-daemon[697]: New relevant interface enp0s9.IPv4 for mDNS.
May 05 17:59:17 rac1.oraeasy.com avahi-daemon[697]: Registering new address record for 192.168.1.41 on enp0s9.IPv4.
[root@rac1 ~]#
[root@rac1 ~]# systemctl stop avahi-daemon
Warning: Stopping avahi-daemon.service, but it can still be activated by:
  avahi-daemon.socket
[root@rac1 ~]#
[root@rac1 ~]# systemctl disable avahi-daemon
Removed "/etc/systemd/system/multi-user.target.wants/avahi-daemon.service".
Removed "/etc/systemd/system/sockets.target.wants/avahi-daemon.socket".
Removed "/etc/systemd/system/dbus-org.freedesktop.Avahi.service".
[root@rac1 ~]#
[root@rac1 ~]# 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 Tue 2026-05-05 21:04:38 IST; 12s ago
   Duration: 3h 5min 27.297s
TriggeredBy: ● avahi-daemon.socket
   Main PID: 697 (code=exited, status=0/SUCCESS)
     Status: "avahi-daemon 0.8 starting up."
        CPU: 448ms

May 05 21:04:38 rac1.oraeasy.com systemd[1]: Stopping Avahi mDNS/DNS-SD Stack...
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface enp0s8.IPv6 with address fe80::cc06:984:1b8f:e25c.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface enp0s8.IPv4 with address 192.168.10.11.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface enp0s3.IPv6 with address fe80::a00:27ff:fe25:7f8b.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface enp0s3.IPv4 with address 192.168.80.11.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface lo.IPv6 with address ::1.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: Leaving mDNS multicast group on interface lo.IPv4 with address 127.0.0.1.
May 05 21:04:38 rac1.oraeasy.com avahi-daemon[697]: avahi-daemon 0.8 exiting.
May 05 21:04:38 rac1.oraeasy.com systemd[1]: avahi-daemon.service: Deactivated successfully.
May 05 21:04:38 rac1.oraeasy.com systemd[1]: Stopped Avahi mDNS/DNS-SD Stack.
[root@rac1 ~]#

policycoreutils package:

[root@rac1 ~]# dnf install -y policycoreutils policycoreutils-python-utils
Last metadata expiration check: 2:02:11 ago on Tue 05 May 2026 07:04:31 PM IST.


......
......
......

Upgraded:
  libselinux-3.6-3.el9.x86_64  libselinux-utils-3.6-3.el9.x86_64  libsemanage-3.6-5.el9_6.x86_64   libsepol-3.6-3.el9.x86_64
  policycoreutils-3.6-3.el9.x86_64   policycoreutils-devel-3.6-3.el9.x86_64  policycoreutils-python-utils-3.6-3.el9.noarch   
  python3-libselinux-3.63.el9.x86_64 python3-libsemanage-3.6-5.el9_6.x86_64    python3-policycoreutils-3.6-3.el9.noarch
Installed:
  python3-distro-1.5.0-7.el9.noarch

Complete!
[root@rac1 ~]#

[root@rac1 ~]# rpm -qa|grep polic
crypto-policies-20220815-1.git0fbe86f.el9.noarch
checkpolicy-3.4-1.el9.x86_64
selinux-policy-34.1.43-1.0.1.el9.noarch
selinux-policy-targeted-34.1.43-1.0.1.el9.noarch
crypto-policies-scripts-20220815-1.git0fbe86f.el9.noarch
selinux-policy-devel-34.1.43-1.0.1.el9.noarch
policycoreutils-3.6-3.el9.x86_64
python3-policycoreutils-3.6-3.el9.noarch
policycoreutils-python-utils-3.6-3.el9.noarch
policycoreutils-devel-3.6-3.el9.x86_64
[root@rac1 ~]#

7. Repeat the same steps on Node 2 and verify.

avahi-daemon:

[root@rac2 ~]# 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 Tue 2026-05-05 21:06:21 IST; 10s ago
   Duration: 2h 5min 55.235s
TriggeredBy: ● avahi-daemon.socket
   Main PID: 689 (code=exited, status=0/SUCCESS)
     Status: "avahi-daemon 0.8 starting up."
        CPU: 634ms

May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface enp0s9.IPv4 with address 192.168.1.42.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface enp0s8.IPv6 with address fe80::81c:acfb:97df:d0d.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface enp0s8.IPv4 with address 192.168.10.12.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface enp0s3.IPv6 with address fe80::a00:27ff:fe9b:a7ae.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface enp0s3.IPv4 with address 192.168.80.12.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface lo.IPv6 with address ::1.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: Leaving mDNS multicast group on interface lo.IPv4 with address 127.0.0.1.
May 05 21:06:21 rac2.oraeasy.com avahi-daemon[689]: avahi-daemon 0.8 exiting.
May 05 21:06:21 rac2.oraeasy.com systemd[1]: avahi-daemon.service: Deactivated successfully.
May 05 21:06:21 rac2.oraeasy.com systemd[1]: Stopped Avahi mDNS/DNS-SD Stack.
[root@rac2 ~]#

policycoreutils package:

[root@rac2 ~]# rpm -qa|grep polic
crypto-policies-20220815-1.git0fbe86f.el9.noarch
selinux-policy-34.1.43-1.0.1.el9.noarch
selinux-policy-targeted-34.1.43-1.0.1.el9.noarch
crypto-policies-scripts-20220815-1.git0fbe86f.el9.noarch
policycoreutils-devel-3.4-4.el9.x86_64
selinux-policy-devel-34.1.43-1.0.1.el9.noarch
policycoreutils-python-utils-3.6-3.el9.noarch
policycoreutils-3.6-3.el9.x86_64
checkpolicy-3.6-1.el9.x86_64
python3-policycoreutils-3.6-3.el9.noarch
[root@rac2 ~]#

8. As we fixed the failures, so let's re-run the runcluvfy.pl script.

[oracle@rac1 bin]$ ./runcluvfy.pl stage -pre crsinst -n rac1,rac2 -verbose

Initializing ...

Performing following verification checks ...

  Physical Memory ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          4.3578GB (4569516.0KB)    8GB (8388608.0KB)         failed
    rac1          4.3578GB (4569516.0KB)    8GB (8388608.0KB)         failed
  Physical Memory ...FAILED (PRVF-7530)
  Available Physical Memory ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          3.0613GB (3210048.0KB)    50MB (51200.0KB)          passed
    rac1          2.6131GB (2740044.0KB)    50MB (51200.0KB)          passed
  Available Physical Memory ...PASSED
  Swap Size ...
    Node Name     Available                 Required                  Status
    ------------  ------------------------  ------------------------  ----------
    rac2          5GB (5242876.0KB)         4.3578GB (4569516.0KB)    passed
    rac1          5GB (5242876.0KB)         4.3578GB (4569516.0KB)    passed
  Swap Size ...PASSED
  

..............
..............
..............
..............
  

Pre-check for cluster services setup was unsuccessful on all the nodes.

Failures were encountered during execution of CVU verification request "stage -pre crsinst".

Physical Memory ...FAILED
rac2: PRVF-7530 : Sufficient physical memory is not available on node "rac2"
      [Required physical memory = 8GB (8388608.0KB)]

rac1: PRVF-7530 : Sufficient physical memory is not available on node "rac1"
      [Required physical memory = 8GB (8388608.0KB)]

resolv.conf Integrity ...FAILED
rac2: PRVG-10048 : Name "rac2" was not resolved to an address of the specified
      type by name servers "38.254.163.4".
rac2: PRVG-10048 : Name "rac2" was not resolved to an address of the specified
      type by name servers "139.5.241.15".

rac1: PRVG-10048 : Name "rac1" was not resolved to an address of the specified
      type by name servers "38.254.163.4".
rac1: PRVG-10048 : Name "rac1" was not resolved to an address of the specified
      type by name servers "139.5.241.15".

RPM Package Manager database ...INFORMATION
PRVG-11250 : The check "RPM Package Manager database" was not performed because
it needs 'root' user privileges.

Refer to My Oracle Support notes "2548970.1" for more details regarding errors
PRVG-11250".

cgroup OS compatibility ...INFORMATION
PRVG-11250 : The check "cgroup OS compatibility" was not performed because it
needs 'root' user privileges.

Refer to My Oracle Support notes "2548970.1" for more details regarding errors
PRVG-11250".

ORAchk health score ...INFORMATION
PRVH-1507 : ORAchk/EXAchk checks are skipped.

CVU operation performed:      stage -pre crsinst
Date:                         May 5, 2026, 10:47:46 PM
CVU version:                  23.26.1.0.0 (010926x8664)
CVU home:                     /u01/app/grid/26ai/grid_1
User:                         oracle
Operating system:             Linux5.15.0-3.60.5.1.el9uek.x86_64
[oracle@rac1 bin]$


==> Now our earlier failures have been resolved, so let's proceed for the next phase.

Oracle Grid Infrastructure Installation:

1. Now we will run the gridSetup.sh to install the Oracle Grid Infrastructure. We will do this on Node 1.

[oracle@rac1 ~]$ . .grid.env
[oracle@rac1 ~]$
[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/grid
ORACLE_HOME=/u01/app/grid/26ai/grid_1
ORACLE_SID=+ASM1
[oracle@rac1 ~]$
[oracle@rac1 ~]$ cd /u01/app/grid/26ai/grid_1
[oracle@rac1 grid_1]$ ls
addnode     crs     dbs          env.ora       has        jdbc  lib        network  oracore  plsql    QOpatch   rhp             sdk       srvm  welcome.html
assistants  crypto  deinstall    evm           install    jdk   md         nls      oss      precomp  racg      root.sh         slax      ucp   xag
bin         css     demo         gpnp          inventory  jlib  META-INF   OPatch   oui      pylib    rdbms     rootupgrade.sh  sqlpatch  usm   xdk
clone       cv      diagnostics  gridSetup.sh  javavm     ldap  micronaut  opmn     perl     python   relnotes  runcluvfy.sh    sqlplus   utl
[oracle@rac1 grid_1]$
[oracle@rac1 grid_1]$ ./gridSetup.sh
Launching Oracle Grid Infrastructure Setup Wizard...

The response file for this session can be found at:
 /u01/app/grid/26ai/grid_1/install/response/grid_2026-05-06_09-15-24AM.rsp

You can find the log of this install session at:
 /tmp/GridSetupActions2026-05-06_09-15-24AM/gridSetupActions2026-05-06_09-15-24AM.log
Moved the install session logs to:
 /u01/oraInventory/logs/GridSetupActions2026-05-06_09-15-24AM


2. Now a GUI installer window will open. Follow the below steps.

Select Configure Oracle Grid for New Cluster and click Next.

Select Configure Cluster to Manage RAC Database and click Next.

Provide Cluster, SCAN Name & Port and click Next.

Now we need to add the 2nd Node here, so click on Add.

Provide Public & Virtual Hostname and click OK.

Now click SSH Connectivity , provide "oracle" user & its password. Then click Test.

Once testing gets successful, you will get below message. Click OK and then click Next.

Select Network type and click Next. Here Public interface is for Public & Private is for Private & ASM. The last one is showing for Internet, added during machine creation.

Select Oracle Flex ASM for storage and click Next.

Provide the diskgroup name as CRS, select Redundancy as External and select Disk Name "/dev/sdb3". Click Next.
(Note: We will create other diskgroups later.)

Provide the password of SYS user for ASM instance and click Next.

Check Enable Automatic Self Correction and click Next.

Select Do not use Intelligent and click Next.

Click Next.

Provide the OS user group and click Next.

Provide Grid Base and click Next.

Provide Inventrory location and click Next.

We will execute root script manually so click Next.

It will check for Prerequisities.

Check on Ignore and click Next.

Review and click Install.

Monitor the progress.

Run the provided script with root user on both Nodes. Then click OK.


Node 1: 

[root@rac1 ~]# /u01/oraInventory/orainstRoot.sh
Changing permissions of /u01/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/oraInventory to oinstall.
The execution of the script is complete.
[root@rac1 ~]#
[root@rac1 ~]# /u01/app/grid/26ai/grid_1/root.sh
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/grid/26ai/grid_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
   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.
RAC option enabled on: Linux
Executing command '/u01/app/grid/26ai/grid_1/perl/bin/perl -I/u01/app/grid/26ai/grid_1/perl/lib -I/u01/app/grid/26ai/grid_1/crs/install /u01/app/grid/26ai/grid_1/crs/install/rootcrs.pl '
Using configuration parameter file: /u01/app/grid/26ai/grid_1/crs/install/crsconfig_params
The log of current session can be found at:
  /u01/grid/crsdata/rac1/crsconfig/rootcrs_rac1_2026-05-06_10-08-30AM.log
2026/05/06 10:08:49 CLSRSC-594: Executing installation step 1 of 18: 'ValidateEnv'.
2026/05/06 10:08:50 CLSRSC-594: Executing installation step 2 of 18: 'CheckRootCert'.
2026/05/06 10:08:51 CLSRSC-594: Executing installation step 3 of 18: 'GenSiteGUIDs'.
2026/05/06 10:08:54 CLSRSC-594: Executing installation step 4 of 18: 'SetupOSD'.
Redirecting to /bin/systemctl restart rsyslog.service
2026/05/06 10:08:56 CLSRSC-594: Executing installation step 5 of 18: 'CheckCRSConfig'.
2026/05/06 10:08:56 CLSRSC-594: Executing installation step 6 of 18: 'SetupLocalGPNP'.
2026/05/06 10:09:07 CLSRSC-594: Executing installation step 7 of 18: 'CreateRootCert'.
2026/05/06 10:09:45 CLSRSC-594: Executing installation step 8 of 18: 'ConfigOLR'.
2026/05/06 10:09:58 CLSRSC-594: Executing installation step 9 of 18: 'ConfigCHMOS'.
2026/05/06 10:09:58 CLSRSC-594: Executing installation step 10 of 18: 'CreateOHASD'.
2026/05/06 10:10:02 CLSRSC-594: Executing installation step 11 of 18: 'ConfigOHASD'.
2026/05/06 10:10:33 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'
2026/05/06 10:11:00 CLSRSC-594: Executing installation step 12 of 18: 'SetupTFA'.
2026/05/06 10:11:00 CLSRSC-594: Executing installation step 13 of 18: 'InstallACFS'.
2026/05/06 10:11:06 CLSRSC-594: Executing installation step 14 of 18: 'CheckFirstNode'.
2026/05/06 10:11:08 CLSRSC-594: Executing installation step 15 of 18: 'InitConfig'.
CRS-4256: Updating the profile
Successful addition of voting disk 214fe17305a34f85bf3badbe9642ef69.
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   214fe17305a34f85bf3badbe9642ef69 (/dev/sdb3) [CRS]
Located 1 voting disk(s).
2026/05/06 10:20:20 CLSRSC-4002: Successfully installed Oracle Autonomous Health Framework (AHF).
2026/05/06 10:21:36 CLSRSC-594: Executing installation step 16 of 18: 'StartCluster'.
2026/05/06 10:22:51 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/05/06 10:23:08 CLSRSC-594: Executing installation step 17 of 18: 'ConfigNode'.
clscfg: EXISTING configuration version 23 detected.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
2026/05/06 10:25:31 CLSRSC-594: Executing installation step 18 of 18: 'PostConfig'.

2026/05/06 10:29:07 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
[root@rac1 ~]#

Node 2: 

[root@rac2 ~]# /u01/oraInventory/orainstRoot.sh
Changing permissions of /u01/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/oraInventory to oinstall.
The execution of the script is complete.
[root@rac2 ~]#
[root@rac2 ~]#
[root@rac2 ~]#
[root@rac2 ~]# /u01/app/grid/26ai/grid_1/root.sh
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/grid/26ai/grid_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
   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.
RAC option enabled on: Linux
Executing command '/u01/app/grid/26ai/grid_1/perl/bin/perl -I/u01/app/grid/26ai/grid_1/perl/lib -I/u01/app/grid/26ai/grid_1/crs/install /u01/app/grid/26ai/grid_1/crs/install/rootcrs.pl '
Using configuration parameter file: /u01/app/grid/26ai/grid_1/crs/install/crsconfig_params
The log of current session can be found at:
  /u01/grid/crsdata/rac2/crsconfig/rootcrs_rac2_2026-05-06_10-08-57AM.log
2026/05/06 10:09:18 CLSRSC-594: Executing installation step 1 of 18: 'ValidateEnv'.
2026/05/06 10:09:20 CLSRSC-594: Executing installation step 2 of 18: 'CheckRootCert'.
2026/05/06 10:09:23 CLSRSC-766: The execution of root script on this node rac2 is awaiting the progress of root script on the installer node rac1 to make initial configuration data available to this node
2026/05/06 10:09:46 CLSRSC-594: Executing installation step 3 of 18: 'GenSiteGUIDs'.
2026/05/06 10:09:46 CLSRSC-594: Executing installation step 4 of 18: 'SetupOSD'.
Redirecting to /bin/systemctl restart rsyslog.service
2026/05/06 10:09:47 CLSRSC-594: Executing installation step 5 of 18: 'CheckCRSConfig'.
2026/05/06 10:09:48 CLSRSC-594: Executing installation step 6 of 18: 'SetupLocalGPNP'.
2026/05/06 10:09:48 CLSRSC-594: Executing installation step 7 of 18: 'CreateRootCert'.
2026/05/06 10:09:48 CLSRSC-594: Executing installation step 8 of 18: 'ConfigOLR'.
2026/05/06 10:10:02 CLSRSC-594: Executing installation step 9 of 18: 'ConfigCHMOS'.
2026/05/06 10:10:02 CLSRSC-594: Executing installation step 10 of 18: 'CreateOHASD'.
2026/05/06 10:10:06 CLSRSC-594: Executing installation step 11 of 18: 'ConfigOHASD'.
2026/05/06 10:10:34 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'
2026/05/06 10:11:00 CLSRSC-594: Executing installation step 12 of 18: 'SetupTFA'.
2026/05/06 10:11:00 CLSRSC-594: Executing installation step 13 of 18: 'InstallACFS'.
2026/05/06 10:11:07 CLSRSC-594: Executing installation step 14 of 18: 'CheckFirstNode'.
2026/05/06 10:11:10 CLSRSC-764: The execution of root script on this node rac2 is awaiting the progress of root script on the installer node rac1 to reach the Grid Infrastructure stack startup on that node
2026/05/06 10:15:32 CLSRSC-4002: Successfully installed Oracle Autonomous Health Framework (AHF).
2026/05/06 10:23:09 CLSRSC-594: Executing installation step 15 of 18: 'InitConfig'.
2026/05/06 10:23:38 CLSRSC-594: Executing installation step 16 of 18: 'StartCluster'.
2026/05/06 10:25:51 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/05/06 10:25:51 CLSRSC-594: Executing installation step 17 of 18: 'ConfigNode'.
2026/05/06 10:25:51 CLSRSC-594: Executing installation step 18 of 18: 'PostConfig'.
2026/05/06 10:26:21 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
[root@rac2 ~]#


Monitor the progress.

Click OK.

Installation has been completed, we can ignore those failures. Click Next.

Click Yes.

Click Close.

3. Now verify the Grid installation.

Node 1:

[oracle@rac1 ~]$ . .grid.env
[oracle@rac1 ~]$
[oracle@rac1 ~]$ olsnodes
rac1
rac2

[oracle@rac1 ~]$ ps -ef|grep pmon
oracle     32810       1  0 10:22 ?        00:00:00 asm_pmon_+ASM1
oracle     73816    6014  0 10:52 pts/0    00:00:00 grep --color=auto pmon
[oracle@rac1 ~]$
[oracle@rac1 ~]$ ps -ef|grep tns
root           5       2  0 08:27 ?        00:00:00 [netns]
oracle     35905       1  0 10:25 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit
oracle     36088       1  0 10:25 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit
oracle     36089       1  0 10:25 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN2 -no_crs_notify -inherit
oracle     36108       1  0 10:25 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
oracle     73888    6014  0 10:52 pts/0    00:00:00 grep --color=auto tns
[oracle@rac1 ~]$

[root@rac1 ~]# ps -ef|grep d.bin
root       31563       1  1 10:21 ?        00:00:35 /u01/app/grid/26ai/grid_1/bin/ohasd.bin reboot BLOCKING_STACK_LOCALE_OHAS=AMERICAN_AMERICA.AL32UTF8;CRS_AUX_DATA=CRS_AUXD_FASTCSS=yes
oracle     31816       1  0 10:21 ?        00:00:09 /u01/app/grid/26ai/grid_1/bin/evmd.bin
oracle     31818       1  0 10:21 ?        00:00:05 /u01/app/grid/26ai/grid_1/bin/mdnsd.bin
oracle     31851       1  0 10:21 ?        00:00:06 /u01/app/grid/26ai/grid_1/bin/gpnpd.bin
oracle     31895       1  0 10:21 ?        00:00:14 /u01/app/grid/26ai/grid_1/bin/gipcd.bin
oracle     32028       1  1 10:21 ?        00:00:35 /u01/app/grid/26ai/grid_1/bin/onmd.bin  -S 1 -F
oracle     32030       1  1 10:21 ?        00:00:20 /u01/app/grid/26ai/grid_1/bin/ocssd.bin  -S 1 -F
root       32341       1  2 10:22 ?        00:00:42 /u01/app/grid/26ai/grid_1/bin/osysmond.bin
root       33341       1  3 10:22 ?        00:01:01 /u01/app/grid/26ai/grid_1/bin/crsd.bin reboot
root       74951   13642  0 10:54 pts/1    00:00:00 grep --color=auto d.bin
[root@rac1 ~]#
[root@rac1 ~]# cd /u01/app/grid/26ai/grid_1/bin
[root@rac1 bin]# ./crsctl check css
CRS-4529: Cluster Synchronization Services is online
[root@rac1 bin]#
[root@rac1 bin]# ./crsctl check has
CRS-4638: Oracle High Availability Services is online
[root@rac1 bin]#

Node 2:

[oracle@rac2 ~]$ ps -ef|grep pmon
oracle     60698       1  0 10:26 ?        00:00:00 asm_pmon_+ASM2
oracle    112997    6780  0 10:53 pts/0    00:00:00 grep --color=auto pmon
[oracle@rac2 ~]$
[oracle@rac2 ~]$ ps -ef|grep tns
root           5       2  0 08:28 ?        00:00:00 [netns]
oracle     58973       1  0 10:25 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit
oracle     59132       1  0 10:26 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN3 -no_crs_notify -inherit
oracle     59143       1  0 10:26 ?        00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
oracle    113061    6780  0 10:54 pts/0    00:00:00 grep --color=auto tns
[oracle@rac2 ~]$


[root@rac2 ~]# ps -ef|grep d.bin
root       55768       1  2 10:23 ?        00:00:40 /u01/app/grid/26ai/grid_1/bin/ohasd.bin reboot BLOCKING_STACK_LOCALE_OHAS=AMERICAN_AMERICA.AL32UTF8
oracle     55988       1  0 10:23 ?        00:00:09 /u01/app/grid/26ai/grid_1/bin/evmd.bin
oracle     55990       1  0 10:23 ?        00:00:05 /u01/app/grid/26ai/grid_1/bin/mdnsd.bin
oracle     56030       1  0 10:23 ?        00:00:07 /u01/app/grid/26ai/grid_1/bin/gpnpd.bin
oracle     56089       1  0 10:23 ?        00:00:16 /u01/app/grid/26ai/grid_1/bin/gipcd.bin
oracle     56189       1  1 10:23 ?        00:00:33 /u01/app/grid/26ai/grid_1/bin/onmd.bin  -S 2
oracle     56191       1  0 10:23 ?        00:00:19 /u01/app/grid/26ai/grid_1/bin/ocssd.bin  -S 2
root       56537       1  2 10:23 ?        00:00:45 /u01/app/grid/26ai/grid_1/bin/osysmond.bin
root       57812       1  1 10:25 ?        00:00:32 /u01/app/grid/26ai/grid_1/bin/crsd.bin reboot
root      114755   26733  0 10:56 pts/1    00:00:00 grep --color=auto d.bin
[root@rac2 ~]#
[root@rac2 ~]# cd /u01/app/grid/26ai/grid_1/bin/
[root@rac2 bin]#
[root@rac2 bin]# ./crsctl check css
CRS-4529: Cluster Synchronization Services is online
[root@rac2 bin]#
[root@rac2 bin]# ./crsctl check has
CRS-4638: Oracle High Availability Services is online
[root@rac2 bin]#

4. Now let's create the remaining ASM diskgroups using ASMCA.

[oracle@rac1 grid_1]$ asmca

5. Now a GUI window will open. Follow the below steps.

Click on Disk Groups.

Click on Create from bottom section.

Provide the Disk Group name as "DATA", its path and other options. Click OK.

Similarly create FRA Disk Group and click OK.

Now required Disk Groups have been created.
6. Now let's verify the Disk Groups via SQLPLUS.

[oracle@rac1 grid_1]$ sqlplus / as sysasm

SQL*Plus: Release 23.26.1.0.0 - Production on Wed May 6 11:13:00 2026
Version 23.26.1.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

SQL> def
DEFINE _DATE           = "06-MAY-26" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "+ASM1" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSASM" (CHAR)
DEFINE _SQLPLUS_RELEASE = "2326010000" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0" (CHAR)
DEFINE _O_RELEASE      = "2326010000" (CHAR)
SQL>
SQL> select INST_ID,NAME,TOTAL_MB/(1024) TOTAL_GB,FREE_MB/1024 FREE_GB,(TOTAL_MB-FREE_MB)/1024 USED_GB,(FREE_MB/TOTAL_MB)*100 FREE_PER 
     from gv$asm_diskgroup order by 1;

   INST_ID NAME                             TOTAL_GB    FREE_GB    USED_GB   FREE_PER
---------- ------------------------------ ---------- ---------- ---------- ----------
         1 CRS                            9.99609375 9.65234375     .34375 96.5611567
         1 DATA                                   45 44.8632813  .13671875 99.6961806
         1 FRA                                    25 24.8632813  .13671875  99.453125
         2 CRS                            9.99609375 9.65234375     .34375 96.5611567
         2 DATA                                   45 44.8632813  .13671875 99.6961806
         2 FRA                                    25 24.8632813  .13671875  99.453125

6 rows selected.

SQL>


==> Now Oracle Grid Infrastructure has been completed, so let's move forward for next phase.

Oracle Database Software Installation:


1. Now we will install the Database Home software. So first unzip the software on Node 1.

[oracle@rac1 software]$ pwd
/home/oracle/software
[oracle@rac1 software]$
[oracle@rac1 software]$ ls -lrth
total 3.3G
-rw-r--r--. 1 oracle oinstall 1.1G May  4 21:43 LINUX.X64_2326100_grid_home.zip
-rw-r--r--. 1 oracle oinstall 2.3G May  6 11:18 LINUX.X64_2326100_db_home.zip
[oracle@rac1 software]$
[oracle@rac1 software]$ unzip LINUX.X64_2326100_db_home.zip -d /u01/app/oracle/26ai/db_1
2. Now start the Oracle Database Software Installation.

oracle@rac1 ~]$ . .db_env
[oracle@rac1 ~]$
[oracle@rac1 ~]$ env|grep ORA
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/26ai/db_1
ORACLE_SID=raccdb1
[oracle@rac1 ~]$
[oracle@rac1 ~]$ cd /u01/app/oracle/26ai/db_1
[oracle@rac1 db_1]$
[oracle@rac1 db_1]$ ls
addnode     crypto  dbs          env.ora        inventory  ldap      mgw      oml4py   ords   precomp  rdbms          sdk       sqlplus   utl
assistants  css     deinstall    has            javavm     lib       network  OPatch   oss    python   relnotes       slax      srvm      xdk
bin         ctx     demo         hs             jdbc       log       nls      opmn     oui    QOpatch  root.sh        sqlcl     suptools
clone       cv      diagnostics  install        jdk        md        odbc     oracore  perl   R        runInstaller   sqlj      ucp
crs         data    dv           instantclient  jlib       META-INF  olap     ord      plsql  racg     schagent.conf  sqlpatch  usm
[oracle@rac1 db_1]$
[oracle@rac1 db_1]$ ./runInstaller
Launching Oracle AI Database Setup Wizard...

The response file for this session can be found at:
 /u01/app/oracle/26ai/db_1/install/response/db_2026-05-06_11-31-20AM.rsp

You can find the log of this install session at:
 /u01/oraInventory/logs/InstallActions2026-05-06_11-31-20AM/installActions2026-05-06_11-31-20AM.log
[oracle@rac1 db_1]$

3. Now a GUI installer window will open. Follow the below steps.

Select Set up RAC Software only and click Next.

Select Oracle Real Application Cluster and click Next.

Select both Nodes and click Next.

Click Next.

Provide OS group and click Next.

We will run root script manually, so click Next.

It will check for Prerequisities.

Check on Ignore All and click Next.

Verify the details and click Install.

Monitor the progress.

Run the script on both nodes with root user and click OK.

Node 1:

[root@rac1 ~]# /u01/app/oracle/26ai/db_1/root.sh
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/oracle/26ai/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The contents of "dbhome" have not changed. No need to overwrite.
The contents of "oraenv" have not changed. No need to overwrite.
The contents of "coraenv" have not changed. No need to overwrite.

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@rac1 ~]#
[root@rac1 ~]#

Node 2:

[root@rac2 ~]# /u01/app/oracle/26ai/db_1/root.sh
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/oracle/26ai/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The contents of "dbhome" have not changed. No need to overwrite.
The contents of "oraenv" have not changed. No need to overwrite.
The contents of "coraenv" have not changed. No need to overwrite.

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@rac2 ~]#

Now installation has been completed. Click Close.

==> Now Database Home installation has been completed, so let's move forward for next phase.

RAC Database Creation:

Note: Since the physical memory (RAM) in our setup is limited, we will create the database using only Node 1. After the database creation is completed, Node 2 will be added to the database configuration using srvctl. This approach helps to avoid DBCA issues caused by insufficient memory. Therefore, shutdown Node 2 and increase Node 1 RAM allocation if possible.

1. Now let's create the database with DBCA on Node 1.

[oracle@rac1 ~]$ free -g
               total        used        free      shared  buff/cache   available
Mem:               7           3           2           1           2           3
Swap:              4           0           4
[oracle@rac1 ~]$
[oracle@rac1 ~]$ . .db_env
[oracle@rac1 ~]$
[oracle@rac1 ~]$ dbca


2. Now a GUI window will open. Follow the below steps.

Select Create Database and click Next.

Select Advanced and click Next.

Select General Purpose and click Next.

Select the Node and click Next.

==> If we use both Nodes for DBCA then only this step's output will be changed like below.
Rest steps are same.


Provide Database, SID and PDB name. Click Next.

Select Storage option as ASM. Click Next.

Provide FRA options and click Next.

Click Next.

Provide SGA & PGA value. Click Next.

Click Next.

Provide sys/system user password. Click Next.

Click Next.

Check on Ignore All and click Next.

Review the details and click Finish.

Monitor the progress.


Now Database has been created. Click Close.

3. Now verify the database.

[oracle@rac1 ~]$ srvctl config
raccdb

[oracle@rac1 ~]$ srvctl config database -d raccdb
Database unique name: raccdb
Database name: raccdb
Oracle home: /u01/app/oracle/26ai/db_1
Oracle user: oracle
Spfile: +DATA/RACCDB/PARAMETERFILE/spfile.305.1232622609
Password file: +DATA/RACCDB/PASSWORD/pwdraccdb.291.1232621481
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: raccdb_orclpdb
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: asmoper
Database instances: raccdb1
Configured nodes: rac1
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl status database -d raccdb -v
Instance raccdb1 is running on node rac1 with online services raccdb_orclpdb. Instance status: Open,HOME=/u01/app/oracle/26ai/db_1.
[oracle@rac1 ~]$
[oracle@rac1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.26.1.0.0 - Production on Thu May 7 11:27:43 2026
Version 23.26.1.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

SQL>
SQL> def
DEFINE _DATE           = "07-MAY-26" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "raccdb1" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "2326010000" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0" (CHAR)
DEFINE _O_RELEASE      = "2326010000" (CHAR)
SQL>
SQL> select name,open_mode,database_role from v$database;

NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
RACCDB    READ WRITE           PRIMARY

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/RACCDB/PARAMETERFILE/spf
                                                 ile.305.1232622609
SQL>

4. Now proceed to add the Node 2 in database configuration.

[oracle@rac1 ~]$ ssh rac2 date
Thu May  7 12:01:13 PM IST 2026
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl config database -d raccdb
Database unique name: raccdb
Database name: raccdb
Oracle home: /u01/app/oracle/26ai/db_1
Oracle user: oracle
Spfile: +DATA/RACCDB/PARAMETERFILE/spfile.305.1232622609
Password file: +DATA/RACCDB/PASSWORD/pwdraccdb.291.1232621481
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: raccdb_orclpdb
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: asmoper
Database instances: raccdb1
Configured nodes: rac1
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl add instance -d raccdb -i raccdb2 -n rac2
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl config database -d raccdb
Database unique name: raccdb
Database name: raccdb
Oracle home: /u01/app/oracle/26ai/db_1
Oracle user: oracle
Spfile: +DATA/RACCDB/PARAMETERFILE/spfile.305.1232622609
Password file: +DATA/RACCDB/PASSWORD/pwdraccdb.291.1232621481
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: raccdb_orclpdb
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: asmoper
Database instances: raccdb1,raccdb2
Configured nodes: rac1,rac2
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl status database -d raccdb -v
Instance raccdb1 is running on node rac1 with online services raccdb_orclpdb. Instance status: Open,HOME=/u01/app/oracle/26ai/db_1.
Instance raccdb2 is not running on node rac2

Create Redo log & undo tablespace for Node 2:

SQL> create undo tablespace UNDOTBS2 datafile '+DATA'
     size 200m autoextend on

SQL> select group#,thread# from v$log;

    GROUP#    THREAD#
---------- ----------
         1          1
         2          1
         3          1

SQL> alter database add logfile thread 2 group 4 ('+DATA') size 200m;  2

Database altered.

SQL> alter database add logfile thread 2 group 5 ('+DATA') size 200m;  2

Database altered.

SQL> alter database add logfile thread 2 group 6 ('+DATA') size 200m;

Database altered.

SQL> select group#,thread# from v$log;

    GROUP#    THREAD#
---------- ----------
         1          1
         2          1
         3          1
         4          2
         5          2
         6          2

6 rows selected.

Run below to update instance, thread number & undo tablespace:

SQL> alter system set instance_number=1 sid='raccdb1' scope=spfile;

System altered.

SQL> alter system set instance_number=2 sid='raccdb2' scope=spfile;

System altered.

SQL> alter system set thread=1 sid='raccdb1' scope=spfile;

System altered.

SQL> alter system set thread=2 sid='raccdb2' scope=spfile;

System altered.

SQL> alter system set undo_tablespace='UNDOTBS1' sid='raccdb1' scope=spfile;

System altered.

SQL> alter database enable public thread 2;

Database altered.

5. Now shutdown the database and then do startup with srvctl.

SQL> shut immediate

Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
SQL> exit
Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

[oracle@rac1 ~]$ srvctl status database -d raccdb -v
Instance raccdb1 is not running on node rac1
Instance raccdb2 is not running on node rac2

[oracle@rac1 ~]$ srvctl start database -d raccdb
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl status database -d raccdb -v
Instance raccdb1 is running on node rac1 with online services raccdb_orclpdb. Instance status: Open,HOME=/u01/app/oracle/26ai/db_1.
Instance raccdb2 is running on node rac2. Instance status: Open,HOME=/u01/app/oracle/26ai/db_1.
[oracle@rac1 ~]$

==> Now we have completed all the installation & configuration. So let's proceed for last Verfication phase.

Post-Installation Verification:

1. Now verify the cluster & database services.

Cluster services:
[oracle@rac1 ~]$ . .grid_env [oracle@rac1 ~]$ cd /u01/app/grid/26ai/grid_1/bin [oracle@rac1 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@rac1 bin]$ ./crsctl check has CRS-4638: Oracle High Availability Services is online [oracle@rac1 bin]$ ./crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.LISTENER.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.chad ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.cvuadmin OFFLINE OFFLINE rac1 STABLE OFFLINE OFFLINE rac2 STABLE ora.helper OFFLINE OFFLINE rac1 IDLE,STABLE OFFLINE OFFLINE rac2 IDLE,STABLE ora.net1.network ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.CRS.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE STABLE ora.DATA.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.FRA.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac1 STABLE ora.LISTENER_SCAN2.lsnr 1 ONLINE ONLINE rac1 STABLE ora.LISTENER_SCAN3.lsnr 1 ONLINE ONLINE rac2 STABLE ora.asm(ora.asmgroup) 1 ONLINE ONLINE rac1 Started,STABLE 2 ONLINE ONLINE rac2 Started,STABLE ora.asmnet1.asmnetwork(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.cdp1.cdp 1 OFFLINE OFFLINE STABLE ora.cdp2.cdp 1 OFFLINE OFFLINE STABLE ora.cdp3.cdp 1 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac1 STABLE ora.cvuhelper 1 ONLINE ONLINE rac1 STABLE ora.rac1.vip 1 ONLINE ONLINE rac1 STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.raccdb.db 1 ONLINE ONLINE rac1 Open,HOME=/u01/app/o racle/26ai/db_1,STAB LE 2 ONLINE ONLINE rac2 Open,HOME=/u01/app/o racle/26ai/db_1,STAB LE ora.raccdb.orclpdb.pdb 2 ONLINE ONLINE rac1 READ WRITE,STABLE 3 ONLINE ONLINE rac2 READ WRITE,STABLE ora.raccdb.raccdb_orclpdb.svc 1 ONLINE ONLINE STABLE ora.rhpserver 1 OFFLINE OFFLINE STABLE ora.scan1.vip 1 ONLINE ONLINE rac1 STABLE ora.scan2.vip 1 ONLINE ONLINE rac1 STABLE ora.scan3.vip 1 ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- [oracle@rac1 bin]$ Node 1: [oracle@rac1 ~]$ ps -ef|grep pmon oracle 9432 1 0 11:37 ? 00:00:02 asm_pmon_+ASM1 oracle 76664 1 0 12:54 ? 00:00:00 ora_pmon_raccdb1 oracle 86981 6130 0 13:14 pts/0 00:00:00 grep --color=auto pmon [oracle@rac1 ~]$ [oracle@rac1 ~]$ ps -ef|grep tns root 5 2 0 11:30 ? 00:00:00 [netns] oracle 8075 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit oracle 8141 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN3 -no_crs_notify -inherit oracle 8155 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit oracle 87016 6130 0 13:14 pts/0 00:00:00 grep --color=auto tns [oracle@rac1 ~]$. .db_env [oracle@rac1 ~]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Thu May 7 13:08:20 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL> set lines 200 pages 1000 SQL> col open_mode for a15 SQL> col HOST_NAME for a15 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 --------- ---------------- --------------- --------------- ---------------- ---------------- ----------------- --------- ------------ RACCDB PRIMARY READ WRITE 1 raccdb1 rac1.oraeasy.com 23.0.0.0.0 07-MAY-26 OPEN RACCDB PRIMARY READ WRITE 2 raccdb2 rac2.oraeasy.com 23.0.0.0.0 07-MAY-26 OPEN SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL> Node 2: [oracle@rac2 ~]$ ps -ef|grep pmon oracle 5639 1 0 11:35 ? 00:00:02 asm_pmon_+ASM2 oracle 67087 1 0 12:54 ? 00:00:00 ora_pmon_raccdb2 oracle 77330 5250 0 13:14 pts/0 00:00:00 grep --color=auto pmon [oracle@rac2 ~]$ [oracle@rac2 ~]$ ps -ef|grep tns root 5 2 0 11:32 ? 00:00:00 [netns] oracle 6829 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit oracle 7041 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER -no_crs_notify -inherit oracle 7042 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN2 -no_crs_notify -inherit oracle 7045 1 0 11:36 ? 00:00:00 /u01/app/grid/26ai/grid_1/bin/tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit oracle 77349 5250 0 13:14 pts/0 00:00:00 grep --color=auto tns [oracle@rac2 ~]$ . .db_env [oracle@rac2 ~]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Thu May 7 13:09:13 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL> set lines 200 pages 1000 SQL> col open_mode for a15 SQL> col HOST_NAME for a15 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 --------- ---------------- --------------- --------------- ---------------- ---------------- ----------------- --------- ------------ RACCDB PRIMARY READ WRITE 1 raccdb1 rac1.oraeasy.com 23.0.0.0.0 07-MAY-26 OPEN RACCDB PRIMARY READ WRITE 2 raccdb2 rac2.oraeasy.com 23.0.0.0.0 07-MAY-26 OPEN SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL>

2. Below table will give you the required commands to manage the RAC database and its resources.

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>


Thank you for reading!

I hope this content has been helpful to you. Your feedback and suggestions are always welcome — feel free to leave a comment or reach out with any queries.

Abhishek Shrivastava

📧 Email: oraeasyy@gmail.com
🌐 Website: www.oraeasy.com

Follow Us

Comments