Overview
In the relentless pursuit of high availability, scalability, and robust performance for mission-critical applications, Oracle Real Application Clusters (RAC) stands as a cornerstone technology. As a senior technology writer at TechNews Venture, I've witnessed firsthand the transformative power of RAC across diverse enterprise landscapes, particularly within the Oracle Peoplesoft ecosystem where uptime and responsiveness are paramount. This article delves into the intricate process of setting up a two-node Oracle RAC 19c cluster on Oracle Linux 8 (OEL 8) using Grid Infrastructure 19c.
Oracle RAC allows multiple instances of an Oracle database to access a single database stored on shared storage. This architecture provides unparalleled fault tolerance, as the failure of one node does not bring down the entire database; other nodes can continue to serve requests. Furthermore, it offers linear scalability, enabling you to add more nodes to increase processing power and handle larger workloads without application changes. Oracle 19c, the "long-term support" release, brings enhanced performance, security, and manageability features, making it an ideal choice for modern enterprise deployments.
Oracle Linux 8, optimized and engineered specifically for Oracle products, provides a stable, secure, and high-performance foundation for your RAC cluster. Its integration with Unbreakable Enterprise Kernel (UEK) and systemd offers significant advantages in terms of resource management and system startup. Grid Infrastructure 19c, the prerequisite for RAC, encompasses Oracle Clusterware and Automatic Storage Management (ASM). Clusterware manages the cluster resources, monitors node health, and ensures high availability, while ASM provides a portable, high-performance, and easy-to-manage storage solution, abstracting the underlying physical disk complexities.
This guide aims to provide a comprehensive, step-by-step walkthrough, complete with real-world commands and configurations, to empower database administrators and architects to confidently deploy a resilient Oracle RAC 19c environment.
Prerequisites
A successful RAC deployment hinges on meticulous planning and preparation. Neglecting any of these prerequisites can lead to significant hurdles during installation or operational issues later. For our two-node cluster, let's assume the following configuration:
- Nodes:
racnode1.technews.localandracnode2.technews.local - Operating System: Oracle Linux 8 (64-bit)
- Shared Storage: iSCSI LUNs (for ASM disk groups)
- Software:
- Oracle Grid Infrastructure 19c (19.3.0.0.0)
- Oracle Database 19c (19.3.0.0.0)
Hardware Requirements (Minimum per Node)
- CPU: 2 vCPUs
- RAM: 8 GB (for Grid Infrastructure and one database instance)
- Disk Space:
- OS: 50 GB
- Oracle Grid Infrastructure Home: 20 GB
- Oracle Database Home: 20 GB
- Network Interfaces:
- One Public Network Interface (e.g.,
enp0s3) - One Private Interconnect Network Interface (e.g.,
enp0s8)
- One Public Network Interface (e.g.,
Network Configuration
Each node requires at least two network interfaces: one for public client access and VIPs, and another for private cluster interconnect communication. A highly available DNS setup is recommended for SCAN resolution, but for this guide, we'll use /etc/hosts for simplicity.
| Name | IP Address | Purpose | Node |
|---|---|---|---|
| racnode1-public | 192.168.1.101 | Public IP | racnode1 |
| racnode1-private | 10.0.0.1 | Private Interconnect | racnode1 |
| racnode1-vip | 192.168.1.102 | Virtual IP (Managed by Clusterware) | racnode1 |
| racnode2-public | 192.168.1.111 | Public IP | racnode2 |
| racnode2-private | 10.0.0.2 | Private Interconnect | racnode2 |
| racnode2-vip | 192.168.1.112 | Virtual IP (Managed by Clusterware) | racnode2 |
| rac-scan | 192.168.1.120, 192.168.1.121, 192.168.1.122 | Single Client Access Name (3 IPs required for HA) | Cluster-wide |
Operating System Preparation (on both nodes)
- Install OEL 8: Perform a minimal installation.
- Disable Firewall and SELinux (for simplicity in lab, enable and configure for production):
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config sudo reboot - Install Pre-install RPM: This package configures kernel parameters, creates necessary users/groups, and installs dependencies.
sudo dnf install -y oracle-database-preinstall-19cThis RPM creates the
oracleandgridusers, and groups likeoinstall,dba,asmadmin,asmdba,asmoper. Theoracleuser will be the primary for database software, andgridfor Grid Infrastructure. - Configure
/etc/hosts(on both nodes):sudo vi /etc/hostsAdd the following entries, replacing with your actual IPs and hostnames:
127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain # Public IPs 192.168.1.101 racnode1.technews.local racnode1 192.168.1.111 racnode2.technews.local racnode2 # Private Interconnect IPs 10.0.0.1 racnode1-priv.technews.local racnode1-priv 10.0.0.2 racnode2-priv.technews.local racnode2-priv # Virtual IPs (Managed by Clusterware) 192.168.1.102 racnode1-vip.technews.local racnode1-vip 192.168.1.112 racnode2-vip.technews.local racnode2-vip # SCAN IPs (Managed by Clusterware) 192.168.1.120 rac-scan.technews.local rac-scan 192.168.1.121 rac-scan.technews.local rac-scan 192.168.1.122 rac-scan.technews.local rac-scan - Set Passwords for
gridandoracleusers:sudo passwd grid sudo passwd oracle - Configure SSH Equivalency (for
griduser on both nodes):As
griduser:su - grid ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa ssh-copy-id racnode1.technews.local ssh-copy-id racnode2.technews.localTest SSH equivalency from
racnode1toracnode2and vice-versa, and from each node to itself, without password prompts.ssh racnode1 date ssh racnode2 date - Create Installation Directories:
sudo mkdir -p /u01/app/19.0.0/grid sudo mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 sudo chown -R grid:oinstall /u01/app/19.0.0/grid sudo chown -R oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1 sudo chown -R oracle:oinstall /u01/app/oracle # This is for ORACLE_BASE sudo chmod -R 775 /u01/app - NTP Configuration: Ensure time synchronization across cluster nodes.
sudo dnf install -y ntp sudo systemctl enable ntpd sudo systemctl start ntpd sudo ntpdate -u pool.ntp.orgVerify synchronization:
ntpq -p
Shared Storage (iSCSI Configuration)
For this setup, we'll simulate shared storage using iSCSI. You would typically have a dedicated iSCSI target server or SAN providing these LUNs. For our example, let's assume three LUNs are presented:
/dev/sdb(1 GB - for OCR/Voting Disks)/dev/sdc(50 GB - for DATA disk group)/dev/sdd(20 GB - for FRA disk group)
On both nodes, configure iSCSI initiator:
sudo dnf install -y iscsi-initiator-utils
sudo systemctl enable iscsid
sudo systemctl start iscsid
Discover and log in to iSCSI target (replace <ISCSI_TARGET_IP> with your iSCSI server IP):
sudo iscsiadm -m discovery -t st -p <ISCSI_TARGET_IP>
sudo iscsiadm -m node -L all
Verify that the disks /dev/sdb, /dev/sdc, /dev/sdd are visible using lsblk or fdisk -l.
Configure Oracle ASM Filter Driver (ASMFD) for persistent device naming: Oracle recommends ASMFD for 19c. This simplifies ASM disk management and ensures consistent device paths across reboots.
As grid user:
su - grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
$ORACLE_HOME/bin/asmcmd afd_label DATA /dev/sdc --init
$ORACLE_HOME/bin/asmcmd afd_label FRA /dev/sdd --init
$ORACLE_HOME/bin/asmcmd afd_label OCR /dev/sdb --init
Verify labels on both nodes:
$ORACLE_HOME/bin/asmcmd afd_lslbl /dev/sd*
You should see output similar to:
--------------------------------------------------------------------------------
Label Duplicate Path
================================================================================
OCR NO /dev/sdb
DATA NO /dev/sdc
FRA NO /dev/sdd
ASMFD will automatically create persistent device names under /dev/oracle/asm/. You can list them:
ls -l /dev/oracle/asm/
Step-by-step Implementation
1. Grid Infrastructure Installation
Download the Oracle Grid Infrastructure 19c software (LINUX.X64_193000_grid_home.zip) from Oracle Support or eDelivery and place it in a temporary location, e.g., /tmp.
On racnode1 as grid user:
su - grid
unzip /tmp/LINUX.X64_193000_grid_home.zip -d /u01/app/19.0.0/grid
cd /u01/app/19.0.0/grid
./gridSetup.sh
The Oracle Universal Installer (OUI) GUI will launch. Follow these steps:
- Select Configuration Option: "Configure and Install Grid Infrastructure for a Cluster".
- Select Cluster Type: "Oracle Flex Cluster" (default for 19c, even for 2 nodes).
- Grid Infrastructure Management Repository: "Do not configure GIMR".
- Cluster Node Information:
- Add both nodes:
racnode1.technews.localandracnode2.technews.local. - Verify SSH connectivity.
- Add both nodes:
- Network Interface Usage:
- Public: Select your public interface (e.g.,
enp0s3) and set as "Public". - Private: Select your private interface (e.g.,
enp0s8) and set as "Private".
- Public: Select your public interface (e.g.,
- ASM Disk Group:
- For OCR and Voting Disks, select "CREATE NEW" and choose the ASMFD disk for OCR (e.g.,
/dev/oracle/asm/ocr). - Disk Group Name:
+OCR_VOTE(or similar). - Redundancy: "External Redundancy" (since we have only one disk for this guide; for production, use "Normal" with at least 3 disks or "High" with 5 disks).
- For OCR and Voting Disks, select "CREATE NEW" and choose the ASMFD disk for OCR (e.g.,
- ASM Password: Set a strong password for ASM SYS and ASMSNMP users.
- Failure Isolation: Leave default.
- Management Options: Leave default (no Cloud Control integration for now).
- Installation Location:
- Oracle Base:
/u01/app/grid - Software Location:
/u01/app/19.0.0/grid
- Oracle Base:
- Operating System Groups:
- Oracle ASM Administrator Group:
asmadmin - Oracle ASM DBA Group:
asmdba - Oracle ASM Operator Group:
asmoper
- Oracle ASM Administrator Group:
- Root script execution: Select "Automatically run configuration scripts". Provide
rootpassword. - Prerequisite Checks: Resolve any warnings (e.g., NTP configuration, swap space if not handled by preinstall RPM).
- Summary: Review all selections and click "Install".
The installer will copy files, configure Clusterware, and run the root scripts on both nodes. This process can take a significant amount of time.
After installation, verify Grid Infrastructure status on both nodes:
su - grid
crsctl status resource -t
You should see all resources (ora.cssd, ora.diskmon, ora.evmd, ora.asm, ora.cluster_interconnect, ora.scan, ora.scanlistener, ora.net, ora.ons, ora.listeners, ora.proxy_advm, ora.registry.acfs, ora.gns - if configured) online and running.
crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.asm
1 ONLINE ONLINE racnode1 Started
2 ONLINE ONLINE racnode2 Started
ora.DATA.dg
1 ONLINE ONLINE racnode1 Mounted
2 ONLINE ONLINE racnode2 Mounted
...
ora.scan1.vip
1 ONLINE ONLINE racnode1 Started
ora.scan2.vip
1 ONLINE ONLINE racnode2 Started
ora.scan3.vip
1 ONLINE ONLINE racnode1 Started
...
ora.racnode1.vip
1 ONLINE ONLINE racnode1 Started
ora.racnode2.vip
1 ONLINE ONLINE racnode2 Started
--------------------------------------------------------------------------------
Create DATA and FRA Disk Groups using ASMCMD (as grid user):
su - grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
asmcmd -p
ASMCMD> mkdg -i -p HIGH -o DATA --init-attr compatible.asm='19.0.0.0.0' /dev/oracle/asm/data
ASMCMD> mkdg -i -p HIGH -o FRA --init-attr compatible.asm='19.0.0.0.0' /dev/oracle/asm/fra
ASMCMD> ls -lt
This will create the +DATA and +FRA disk groups. Note: -p HIGH is for high redundancy, requiring at least 3 failure groups. For our lab, where we might use external redundancy for simplicity, omit -p HIGH and ensure your mkdg command matches your intended redundancy. If you only have one disk for DATA and one for FRA, you must use EXTERNAL redundancy.
ASMCMD> mkdg -i -p EXTERNAL -o DATA --init-attr compatible.asm='19.0.0.0.0' /dev/oracle/asm/data
ASMCMD> mkdg -i -p EXTERNAL -o FRA --init-attr compatible.asm='19.0.0.0.0' /dev/oracle/asm/fra
2. Oracle Database Software Installation
Download the Oracle Database 19c software (LINUX.X64_193000_db_home.zip) and place it in a temporary location, e.g., /tmp.
On racnode1 as oracle user:
su - oracle
unzip /tmp/LINUX.X64_193000_db_home.zip -d /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
./runInstaller
The OUI GUI will launch. Follow these steps:
- Select Configuration Option: "Set Up Software Only".
- Database Installation Option: "Oracle Real Application Clusters database installation".
- Database Edition: "Enterprise Edition".
- Oracle Home User: "Use existing Oracle Home User" (
oracle). - Installation Location:
- Oracle Base:
/u01/app/oracle - Software Location:
/u01/app/oracle/product/19.0.0/dbhome_1
- Oracle Base:
- Operating System Groups:
- Database Administrator Group:
dba - Database Backup and Recovery Group:
backupdba(ordba) - Database Data Guard Administrative Group:
dgdba(ordba) - Database KM Administrator Group:
kmdba(ordba) - Real Application Clusters Group:
racdba(ordba)
- Database Administrator Group:
- Prerequisite Checks: Resolve any warnings.
- Summary: Review and click "Install".
After the file copying, the installer will prompt you to run the root script.
Execute root.sh as root on both nodes:
On racnode1:
sudo /u01/app/oracle/product/19.0.0/dbhome_1/root.sh
On racnode2:
sudo /u01/app/oracle/product/19.0.0/dbhome_1/root.sh
3. Database Creation
Now, let's create our Oracle RAC database using DBCA.
On racnode1 as oracle user:
su - oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
dbca
The Database Configuration Assistant (DBCA) GUI will launch. Follow these steps:
- Database Operation: "Create Database".
- Creation Mode: "Advanced configuration".
- Database Deployment Type: "Oracle Real Application Clusters database". Select both nodes.
- Database Type: "General Purpose or Transaction Processing".
- Database Identifiers:
- Global Database Name:
MYRACDB.technews.local - Oracle SID Prefix:
MYRACDB - Check "Create as Container database" and "Create a pluggable database".
- Global Database Name:
- Storage Type: "Automatic Storage Management (ASM)".
- Database Storage Attributes:
- Use Oracle-Managed Files.
- Specify Fast Recovery Area: Select
+FRAdisk group. - Data Storage: Select
+DATAdisk group.
- Database Options: Leave defaults or customize as needed.
- Initialization Parameters: Set memory, character sets, etc. For a lab, 800MB SGA and 400MB PGA per instance is a good start. Character set: AL32UTF8.
- Creation Options: Select "Create Database".
- Summary: Review and click "Finish".
DBCA will create the database, configure instances on both nodes, and set up services. This will take some time.
After database creation, verify status:
su - oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
srvctl status database -d MYRACDB
Expected output:
Instance MYRACDB1 is running on node racnode1
Instance MYRACDB2 is running on node racnode2
Also, check listener status:
lsnrctl status LISTENER_SCAN1
And individual node listeners:
lsnrctl status LISTENER
Connect to the database from a client using the SCAN name:
sqlplus sys/oracle@rac-scan:1521/MYRACDB.technews.local as sysdba
4. Post-Installation Checks and Basic Tests
It's crucial to perform sanity checks to ensure everything is functioning as expected.
- Check Clusterware health:
crsctl check cluster -all - Verify ASM disk groups:
su - grid export ORACLE_HOME=/u01/app/19.0.0/grid export PATH=$ORACLE_HOME/bin:$PATH asmcmd lsdg - Test Failover:
From
racnode1, stop the instance onracnode2:srvctl stop instance -d MYRACDB -i MYRACDB2Verify that
MYRACDB1is still running and accessible. Then restartMYRACDB2.srvctl start instance -d MYRACDB -i MYRACDB2Alternatively, you can simulate a node failure by rebooting one node and observing how the cluster handles it. The VIPs and SCAN listeners should float to the surviving node, and the database instance on the failed node should be relocated or recovered.
A Note on Redundancy: In a production environment, you would never use "External Redundancy" for OCR/Voting Disks with a single disk. Oracle requires at least three voting disks for "Normal Redundancy" and five for "High Redundancy" to maintain quorum and protect against split-brain scenarios. Similarly, your DATA and FRA disk groups should ideally use "Normal" or "High" redundancy with multiple physical disks across different failure groups.
Security Considerations
Deploying a RAC cluster involves multiple layers of security considerations, from the operating system to the database itself. Neglecting these can expose your critical data and applications to significant risks.
- Operating System Hardening:
- Firewall: For production, do NOT disable