Failure scenarios
DocumentedMixedInference
Pick a layer, then a scenario. The model resets, the failure is injected at T+0, and the cluster timeline plays at simulated speed. Long waits (UPS runtime, disk timeouts) are fast-forwarded.
Two data halls and a quorum site, built to scale.
Oracle Real Application Clusters runs one database on several servers at the same time. Every server runs its own instance (memory and background processes), and all instances open the same datafiles on shared storage. Any instance can read and write any block. If a server dies, the others keep the database open, recover the dead instance's redo and carry on; clients reconnect to a surviving instance, often without noticing.
What makes this hard is keeping the separate buffer caches consistent. RAC does it with Cache Fusion: when instance 1 needs a block that instance 2 holds, the block is shipped across a private network (the interconnect) instead of being written to disk and re-read. The Global Resource Directory tracks which instance owns which block.
RAC needs a layer below the database that knows which servers are alive, decides who stays in the cluster when they disagree, and starts, stops and moves things. That is Oracle Clusterware. It keeps a heartbeat over the interconnect and to the voting files on shared storage, evicts a server that stops answering, and manages every cluster resource: VIPs, listeners, SCAN, ASM, databases and services. Since 11g Release 2 it ships together with ASM as Oracle Grid Infrastructure, installed in its own home and owned by its own OS user.
Oracle Parallel Server on VAX clusters. Shared disk, distributed locks; blocks move between nodes by disk writes ("pinging").
OPS on Unix clusters with vendor clusterware. Pinging still the cost of sharing.
Cache Fusion phase 1: read-consistent blocks shipped over the interconnect.
Renamed Real Application Clusters. Full Cache Fusion: modified blocks too.
Oracle's own clusterware (CRS) on every platform. ASM arrives.
Grid Infrastructure: SCAN, OCR and votes in ASM, GPnP, HAIP, rebootless restart.
Flex ASM, Application Continuity, multitenant on RAC; site-aware extended clusters.
Long-term release. Premier Support to 31 Dec 2029, Extended to 31 Dec 2032.
Long-term release replacing 23ai. Reached from 23ai by the October 2025 release update.
| Release | Year | Cluster layer | What changed for RAC and clusterware | Status |
|---|---|---|---|---|
| Oracle 6.2 | ~1990 | OS vendor cluster (VAXcluster) | Oracle Parallel Server: first multi-instance, shared-disk Oracle database; distributed lock manager; sharing a block meant writing it to disk | Historic |
| Oracle7 | 1992 | Vendor clusterware | OPS on Unix clusters; parallel cache management locks; disk pinging remained the bottleneck | Historic |
| Oracle8 / 8i | 1997 / 1999 | Vendor clusterware | Integrated lock manager; 8i Cache Fusion for consistent reads over the interconnect; write-write conflicts still went through disk | Historic |
| 9i | 2001 | Vendor clusterware; Oracle Cluster Manager on Linux and Windows | Renamed Real Application Clusters; full Cache Fusion (modified blocks over the interconnect, no pinging); Global Cache and Global Enqueue Services | Historic |
| 10g R1 | 2004 | Oracle Cluster Ready Services (CRS) | Oracle's own clusterware on all platforms; ASM introduced; OCR and voting disk on shared raw devices; services and FAN | Historic |
| 10g R2 | 2005 | Oracle Clusterware | Renamed Oracle Clusterware; multiple voting disks; clusterware usable for non-Oracle applications | Historic |
| 11g R1 | 2007 | Oracle Clusterware | ASM fast mirror resync and preferred read failure groups (key for extended clusters); ADR diagnostics | Historic |
| 11g R2 | 2009 | Grid Infrastructure (Clusterware + ASM in one home) | SCAN; OCR and voting files inside ASM; OLR; Grid Plug and Play; GNS; server pools; RAC One Node; ACFS. 11.2.0.2: HAIP and rebootless restart | Out of support |
| 12c R1 | 2013 | Grid Infrastructure | Flex ASM; Flex Cluster (hub and leaf nodes); multitenant on RAC; Application Continuity and Transaction Guard; Grid Infrastructure Management Repository | Out of support |
| 12c R2 | 2017 | Grid Infrastructure | Extended cluster as a configuration with sites; node weighting (css_critical); cluster domains and member clusters; image-based install with gridSetup.sh | Out of support |
| 18c | 2018 | Grid Infrastructure | First yearly release (12.2.0.2 code line); incremental RAC and GI improvements | Out of support |
| 19c | 2019 | Grid Infrastructure | Long-term release of the 12.2 family; the most widely deployed RAC version today | Premier to 31 Dec 2029, Extended to 31 Dec 2032 |
| 21c | 2021 | Grid Infrastructure | Innovation release with short support; its features carried into 23ai | Innovation only |
| 23ai | 2024 | Grid Infrastructure | Long-term release (renamed from 23c) | Replaced by 26ai |
| 26ai | 2025 | Grid Infrastructure | Long-term release that replaces 23ai; same 23 code line, reached by applying the October 2025 release update | Current |
Years are first general availability; on-premises dates can trail cloud dates. Support dates from Oracle's 2025 announcement as reported by The Register; always confirm against the Oracle Lifetime Support Policy.
Most production RAC estates run 19c, because it is the long-term release with the longest support. New builds and upgrades target 26ai, the current long-term release. 21c was never meant for long-term production, and 23ai users move to 26ai by applying a release update rather than upgrading.
| Property | What it means in RAC |
|---|---|
| Shared everything | Every instance opens every datafile; storage is visible to all nodes |
| Active-active | All instances read and write the same database at once; there is no standby to promote |
| Cache Fusion | Blocks move between caches over the interconnect instead of through disk |
| Membership and fencing | Clusterware heartbeats, voting files and eviction keep a split cluster from corrupting data |
| Services | Applications connect to services, not servers; services move between instances |
| Rolling maintenance | Patches are applied one node at a time while the database stays open |
| Scale-out | Add a node, add an instance; capacity grows without moving the database |
| Good fit | Why | Usually not a fit |
|---|---|---|
| Banking, payments, telecom billing | Node failures must not stop transactions | Small departmental apps: single instance plus Data Guard costs far less |
| ERP and core business systems | Rolling patching keeps them open through maintenance | Writes spread across continents: distributed databases fit better |
| Consolidation platforms (CDB with many PDBs) | Services place PDBs on chosen instances | Workloads that cannot tolerate interconnect latency on hot blocks |
| Two data centres close together (extended RAC) | Survives a whole site with zero data loss | Sites far apart: latency grows with distance; use Data Guard |
The trade-offs: the RAC option is licensed per processor on top of Enterprise Edition, the stack is complex, performance depends on a healthy interconnect, and RAC alone does not protect against logical corruption, a bad release or losing the region. For those you still need Data Guard and backups.
| Technology | Architecture | Nodes that write | What a node failure looks like | Main limit |
|---|---|---|---|---|
| Oracle RAC | Shared everything, active-active | All | Survivors reconfigure and recover the dead instance; sessions move | Licence cost, complexity, interconnect sensitivity |
| IBM Db2 pureScale | Shared disk, active-active with a central caching facility | All members | Members recover the failed member's work | Db2 only; smaller ecosystem |
| SQL Server failover cluster instance | Shared disk, active-passive | One | Instance restarts on another node, with crash recovery | No write scale-out; restart time |
| SQL Server Always On availability groups | Shared nothing, replicas | One primary | A synchronous secondary is promoted | Writes on one node only |
| PostgreSQL with Patroni | Streaming replication, primary and standbys | One | A standby is promoted by the HA manager | Writes on one node only |
| MySQL InnoDB Cluster / Galera | Replicated, single or multi-primary | One, or several with certification | Group reconfigures | Conflict rollbacks with multi-primary writes |
| Amazon Aurora | Shared distributed storage, one writer and readers | One | A reader is promoted | Cloud only; single writer |
| Distributed SQL (Spanner, CockroachDB, YugabyteDB) | Shared nothing, consensus replication | All, by partition | Leadership moves for affected ranges | Different consistency and latency trade-offs |
The comparison is a practitioner summary of each product's architecture, not a benchmark. Failover times depend heavily on configuration and are left out on purpose.
A single-instance Oracle database is one set of datafiles opened by one instance: one SGA, one set of background processes, on one server. RAC keeps the database singular and makes the instance plural. Two, four or more servers each run their own instance, with their own SGA, redo threads and background processes, and all of them open the same datafiles on shared storage at the same time.
That one sentence drives everything else in RAC. Because all instances write to the same files, they must agree on who holds which block, which is what Cache Fusion does. Because an instance can die while others carry on, the survivors must detect the death quickly and recover its redo, which is what Clusterware and instance recovery do. Because clients should not care which server they land on, there are services, VIPs and the SCAN.
| Component | Single instance | RAC |
|---|---|---|
| Datafiles, control files, SPFILE | One copy, local or shared storage | One copy, must be on storage every node can reach (ASM, certified NFS, cluster file system) |
| Redo log | One thread | One thread per instance (thread 1 for orcl1, thread 2 for orcl2 …); each thread has its own groups, all on shared storage so another instance can read them for recovery |
| Undo | One undo tablespace | One undo tablespace per instance (undo_tablespace set per instance in the SPFILE: orcl1.undo_tablespace='UNDOTBS1') |
| SGA | One | One per instance; buffer caches are kept coherent by Cache Fusion |
| Background processes | PMON, SMON, DBWn, LGWR, CKPT, … | The same, plus the global ones: LMSn, LMD0, LMON, LCK0, LMHB, RMSn, ACMS, GTX0 … |
| Instance identity | instance_name | instance_number, thread, instance_name, all per instance; cluster_database=TRUE |
A RAC node runs two Oracle homes owned by two OS users. The Grid Infrastructure home (owner grid) holds Oracle Clusterware and ASM. The database home (owner oracle) holds the RDBMS software. Clusterware starts first, finds the shared storage, forms the cluster, and only then starts ASM and the database instances as cluster resources.
Since 11g Release 2, Clusterware is organised in two stacks. The lower stack (OHASD, the "High Availability Services" stack) runs on each node on its own and needs nothing from any other node. The upper stack (CRSD, the "Cluster Ready Services" stack) runs only when the node is a member of the cluster, because it needs the OCR on shared storage.
| Process | Stack | Runs as | What it does |
|---|---|---|---|
| ohasd · Oracle High Availability Services | Lower | root | Started by systemd (oracle-ohasd.service). Reads the OLR, spawns the four agents below and restarts any lower-stack daemon that dies. Everything else hangs off it. |
| oraagent (ohasd) | Lower | grid | Agent that starts and monitors mdnsd, gpnpd, gipcd, evmd and ASM for OHASD. |
| orarootagent (ohasd) | Lower | root | Agent for root-owned resources: crsd, ctssd, diskmon, ACFS drivers, HAIP. |
| cssdagent, cssdmonitor | Lower | root | Two guards for ocssd. They run with real-time priority and watch for a hung node or a hung ocssd; if the node cannot keep its heartbeats for the configured time they fence it (reboot or, since 11.2.0.2, rebootless restart of the stack). They replaced the oprocd and oclsomon daemons of 10g/11.1. |
| mdnsd · multicast DNS | Lower | grid | Lets nodes discover each other on the private network before any configuration is read: this is why multicast must work on the interconnect. |
| gpnpd · Grid Plug and Play | Lower | grid | Serves the GPnP profile (section 5 below) to the other daemons and keeps it identical across nodes. |
| gipcd · Grid IPC | Lower | grid | The communication layer used by the Clusterware daemons over the private network; monitors the interconnect interfaces and drives HAIP failover. |
| ocssd · Cluster Synchronisation Services | Lower | grid | The heart of the cluster. Sends network heartbeats to every other node once a second and writes a disk heartbeat to every voting file. Decides membership, drives evictions and provides group services and locks to ASM and the database. |
| octssd · Cluster Time Synchronisation | Lower | root | Keeps clocks aligned across nodes. Runs in observer mode if NTP or chrony is active, active mode (adjusting the clock itself) if not. |
| evmd · Event Manager | Lower | grid | Publishes cluster events (node up/down, resource state changes) to subscribers, including the ONS/FAN path to clients. |
| osysmond, ologgerd · Cluster Health Monitor | Lower | root | Collect OS metrics every second on each node (osysmond) and store them centrally (ologgerd). Read with oclumon or through AHF. This is the data you look at after an eviction to see whether the node was CPU- or memory-starved. |
| crsd · Cluster Ready Services | Upper | root | Manages all cluster resources: reads the OCR, decides where each resource should run, starts/stops/relocates them through its agents, and runs the policy engine (server pools, cardinality, dependencies). |
| oraagent, orarootagent (crsd) | Upper | grid / root | The agents crsd uses: oraagent handles listeners, SCAN listeners, ASM disk groups, databases, services and ONS; orarootagent handles VIPs, SCAN VIPs, the network resource and GNS. |
| diskmon | Lower | root | Exadata I/O fencing; idle elsewhere. |
crsctl stat res -t -init # lower stack (OHASD-managed resources) crsctl stat res -t # upper stack (CRSD-managed resources) crsctl check cluster -all # CSS, CRS and EVM on every node ps -ef | grep -E 'ohasd|ocssd|crsd|evmd|gpnpd|gipcd|mdnsd|octssd'
The OCR (Oracle Cluster Registry) is the cluster's configuration database: every resource, its attributes, dependencies and placement policy, the node list, the networks, the ASM and database configuration that srvctl shows you. It lives on shared storage, inside an ASM disk group since 11.2, and crsd is the only writer. One crsd (the OCR master) takes an automatic backup every four hours and keeps a rolling set (daily, weekly); you can also export it manually. Up to five OCR locations can be configured for redundancy, though with ASM redundancy one or two is usual.
The OLR (Oracle Local Registry) exists because of a chicken-and-egg problem: OHASD must start before the cluster is formed, so it cannot read the OCR on shared storage. The OLR is a small local copy on each node ($GRID_HOME/cdata/<hostname>.olr) holding what the lower stack needs: the GPnP profile location, the local resources, the ASM discovery details. Lose the OLR and the node cannot even start OHASD; it can be restored from its own backup or re-created with rootcrs.sh.
ocrcheck # integrity and size of the OCR ocrcheck -local # the OLR ocrconfig -showbackup # automatic 4-hourly / daily / weekly backups ocrconfig -manualbackup ocrconfig -export /backup/ocr_$(date +%F).dmp
The Grid Plug and Play profile is a small signed XML file, $GRID_HOME/gpnp/<hostname>/profiles/peer/profile.xml, with a cluster-wide copy under gpnp/profiles/peer/. It carries the few facts a node needs to find the cluster, as opposed to the OCR, which describes the cluster once found:
The boot sequence shows why it matters: OHASD starts gpnpd, gpnpd reads the profile, ocssd takes the discovery string from the profile and scans those disks for voting files (the voting file location is stored in the disk header, not in any file), and ASM learns its SPFILE location the same way. This is how a node can join a cluster before ASM or the OCR is available. When you change the interconnect with oifcfg setif, it is the GPnP profile that is updated, which is why the change needs a stack restart.
gpnptool get 2>/dev/null | xmllint --format - # read the profile gpnptool verify -p=profile.xml -w=... -wu=peer # verify the signature oifcfg getif # interfaces and roles (from the profile)
Every node sends a network heartbeat to every other node each second over the private interconnect, and writes a disk heartbeat to every voting file each second. The voting file is therefore two things: a second heartbeat path that still works when the network is gone, and a place where nodes record who they can and cannot see.
| Parameter | Default | Meaning |
|---|---|---|
misscount | 30 s (Linux) | Network heartbeat tolerance. A node unseen for this long is declared dead and a reconfiguration starts. |
disktimeout | 200 s | Disk heartbeat tolerance. A voting file not written for this long is marked offline on that node. Set long on purpose so a SAN path failover does not evict nodes. |
reboottime | 3 s | Grace period for a node that has decided to leave to actually reboot. |
| Short disk I/O timeout | = misscount | Used while a reconfiguration is in progress, when the disk vote must be quick. |
css_critical | no | 12.2+ node (or database/service) weighting: in a tie, the cohort with the critical resource survives. |
Why an odd number. A node must be able to read and write a majority of the voting files to stay in the cluster: 2 of 3, or 3 of 5. With one voting file, losing it kills the cluster; with two, losing one still kills it (one is not a majority of two). So you configure one, three or five. In an ASM disk group the number is fixed by the redundancy: external → 1, normal → 3, high → 5, and each copy must be in a different failure group. An extended cluster uses a quorum failure group on a third site (usually a small NFS share) to hold the third vote.
Split-brain and the tie-break. If the interconnect fails between two halves of the cluster, both halves are still alive and both can still write to the voting files. Each node writes into the voting file the list of nodes it can see; by reading everyone else's list, a node learns the cohorts. The rule since 12.2 (and in effect before) is: the larger cohort survives; if the cohorts are equal, the one containing the lowest node number survives, unless css_critical tips the balance. The losers get CRS-1607 / CRS-1608 and fence themselves. Since 11.2.0.2 fencing is usually a rebootless restart: ocssd kills the I/O-capable processes and restarts the stack rather than rebooting the OS; it reboots only if that cannot be done quickly enough.
Why fencing is non-negotiable. A node that has lost the cluster but still holds datafiles open could write a stale block. Eviction is RAC's guarantee that this cannot happen: the node is removed before the survivors recover its redo and take ownership of its blocks.
crsctl query css votedisk crsctl get css misscount ; crsctl get css disktimeout crsctl set server css_critical yes # 12.2+, then restart the stack on that node # where to look after an eviction: ocssd.trc, alert.log (GI), CHM data via oclumon / ahf
Before 9i, if instance 2 needed a block that instance 1 had modified, instance 1 had to write it to disk and instance 2 read it back: "disk pinging", and the reason Oracle Parallel Server was slow for anything but partitioned workloads. Cache Fusion replaced that disk round-trip with a memory-to-memory transfer over the interconnect, handled by the Global Cache Service (GCS) and tracked in the Global Resource Directory (GRD).
The GRD. For every block (strictly, every resource) in use, one instance is the master and keeps the authoritative record: which instances hold the block, in what mode (null, shared, exclusive) and in what role (local, when only one instance has it; global, when copies exist in several caches). Mastership is spread across instances by hash, and Dynamic Resource Mastering (DRM) moves the mastership of an object to the instance that uses it most, so that most requests become local.
Block transfers. When instance A needs a block it does not hold, its foreground asks the master. If the master itself holds the block, it ships it: a 2-way transfer. If a third instance holds it, the master forwards the request and that instance ships the block to A: a 3-way transfer, which is why Cache Fusion never needs more than three hops however many nodes there are. The block arrives either as a current block (the latest version, for a write) or as a consistent-read (CR) block built by the holder at the requested SCN. The LMS processes do the shipping; a sending instance that gives up a current block keeps a past image (PI) until the block is written to disk, so that recovery can rebuild it.
Enqueues (row locks, table locks, library cache locks) go through the parallel Global Enqueue Service (GES), handled by LMD0 and LCK0.
| Process | Service | Role |
|---|---|---|
| LMSn · Global Cache Service process | GCS | Ships current and CR blocks between instances; the single most important RAC process. Count set by gcs_server_processes; should run at high priority and never be starved of CPU. |
| LMD0 · Global Enqueue Service daemon | GES | Handles remote enqueue requests and deadlock detection across instances. |
| LMON · Global Enqueue Service monitor | GCS/GES | Monitors instance membership and runs reconfiguration when an instance joins or leaves: redistributes the GRD among survivors. |
| LCK0 · Instance enqueue | GES | Non-Cache-Fusion locks: library cache, row cache, cross-instance calls. |
| LMHB | — | Heartbeat monitor for LMON, LMD and LMS: kills the instance if one of them hangs, so the cluster does not hang on it. |
| RMSn | — | RAC management: creates resources when an instance is added, and so on. |
| ACMS | — | Atomic Control-file to Memory Service: makes SGA updates that must be all-or-nothing across instances behave that way. |
| GTX0-j | — | Global transaction processes for XA transactions spanning instances. |
| PING | — | Measures interconnect latency between instances (what gv$instance_ping shows). |
What you see in AWR. gc cr block 2-way, gc current block 3-way are normal Cache Fusion waits; healthy values are well under a millisecond on a good interconnect. gc buffer busy acquire/release means several sessions on several nodes want the same block (right-growing indexes, sequence-less keys). gc cr block lost / gc current block lost mean the interconnect dropped packets: a network problem, not a database problem. gcs log flush sync is LGWR on the sending side flushing redo before a current block can be shipped: a slow redo disk shows up as a Cache Fusion wait.
select * from gv$instance_ping; -- latency between instances select * from gv$cr_block_server; -- CR block serving stats select inst_id, name, value from gv$sysstat where name like 'gc%lost%'; -- AWR: RAC Statistics section, Global Cache Load Profile, Top timed events
When an instance dies, Clusterware evicts the node if needed, then LMON on a surviving instance runs reconfiguration: the GRD entries mastered by the dead instance are remastered, and blocks it held are frozen until recovery. SMON on one surviving instance reads the dead instance's online redo thread from shared storage and applies it: first the cache recovery (roll forward, using PIs where present), then undo is rolled back as usual. The database stays open throughout; only the blocks needing recovery are unavailable, briefly. This is the difference from a failover cluster, which must mount and open the whole database on the standby node.
Clients never connect to an instance; they connect to a service, a named workload that runs on a chosen set of instances. The SCAN is one DNS name for the whole cluster; its listeners hand each connection to the least-loaded instance offering the requested service. Each node has a VIP that moves to another node when the node dies, so clients get an immediate error instead of a TCP timeout. The Network tab covers each of these in depth.
Automatic Storage Management is Oracle's volume manager and file system for database files, running as an instance (+ASM1) alongside the database on each node, or as three instances in the cluster with Flex ASM. It stripes every file across all disks of a disk group and mirrors at the extent level across failure groups. The voting files, OCR and ASM SPFILE live inside it. The Storage tab covers it in depth.
ADVM (ASM Dynamic Volume Manager) carves general-purpose volumes out of an ASM disk group and presents them to Linux as /dev/asm/<volume>-<n>. ACFS (ASM Cluster File System) is a POSIX cluster file system formatted on an ADVM volume and mounted on every node at once. It gives you: a shared place for anything that is not a datafile (application files, exports, GoldenGate trail files, shared Oracle homes); read-only and read-write snapshots; replication to another cluster; tagging, encryption and auditing; and it is managed as Clusterware resources (ora.<dg>.<vol>.acfs) so it mounts in the right order at startup. Database files on ACFS are supported since 11.2.0.3/12c but are uncommon; ASM directly is the norm. It needs kernel drivers (oracleacfs, oracleadvm, oracleoks) loaded by ora.drivers.acfs, which is why a kernel update can break ACFS until the matching drivers are installed.
asmcmd volcreate -G DATA -s 100G appvol mkfs -t acfs /dev/asm/appvol-123 srvctl add filesystem -device /dev/asm/appvol-123 -path /u02/app -user oracle acfsutil snap create -w before_release /u02/app acfsutil info fs /u02/app
| Release | Architectural change | Why it mattered |
|---|---|---|
| 10g R1/R2 | Oracle's own Clusterware (CRS) and ASM. OCR and voting disks on raw devices or a cluster file system. Services, FAN, TAF. | No more vendor clusterware; the same stack everywhere. |
| 11g R1 | ASM fast mirror resync and preferred read failure groups. ADR. | Made extended (stretched) clusters practical. |
| 11g R2 | Grid Infrastructure: Clusterware and ASM in one home. OCR and voting files inside ASM. OLR, GPnP, GNS, SCAN. Server pools and policy-managed databases. RAC One Node. ACFS/ADVM. 11.2.0.2: HAIP, rebootless restart, cssdagent/cssdmonitor. | The architecture still in use today. Nodes can be added without touching every client. |
| 12c R1 | Flex ASM (ASM runs on a subset of nodes; databases connect to a remote ASM instance). Flex Cluster with hub and leaf nodes. GIMR (the -MGMTDB repository for CHM data). Application Continuity and Transaction Guard. Multitenant on RAC. | Decoupled ASM from the node; replay of in-flight work for applications. |
| 12c R2 | Extended clusters as a declared configuration with sites (crsctl query cluster site), Cluster domains with member clusters, Rapid Home Provisioning (now Fleet Patching and Provisioning), css_critical node weighting, reader nodes, default AU size 4 MB, flex and extended ASM redundancy, preferred_read.enabled, Autonomous Health Framework / ORAchk. | Site awareness built into the cluster rather than configured by hand. |
| 18c | Transparent Application Continuity (TAC). Zero-downtime GI patching groundwork. Shadow lost-write protection. | Application Continuity without changing the application. |
| 19c | Long-term release. GIMR becomes optional at install. Leaf nodes deprecated. Zero-Downtime Oracle Grid Infrastructure Patching (out-of-place with -switchGridHome). Automatic resolution of some Cache Fusion hot blocks via colocation tagging. Standard Edition RAC removed. | Most of the estate runs here. |
| 21c | Innovation release. Leaf nodes desupported. Cluster Health Advisor improvements. Blockchain tables, native JSON (not RAC-specific). | Features flowed into 23ai. |
| 23ai / 26ai | Long-term release (26ai is the same code line as 23ai, reached via the October 2025 RU). GIMR desupported, CHM data kept locally. Two-stage rolling updates and local rolling database maintenance for lower-impact patching. Smart Flash Cache style features aside, the RAC core (Cache Fusion, CSS, services) is unchanged; most new capability is in the database (AI Vector Search, JSON duality) and runs unchanged on RAC. | Patching and operability rather than new cluster mechanics. |
Version details above are summarised from Oracle's documentation and release notes as understood at the time of writing; confirm against the release notes for your exact release update, and label anything you rely on in production as documented or inferred, as this site does.
systemd starts oracle-ohasd; ohasd reads the OLR and starts its four agents.CRS-1601: CSSD Reconfiguration complete.Section 5's Grid & CRS lab tab plays this sequence on two nodes with the matching log lines.
A RAC node is on at least two networks and usually four. Each has a different job, a different failure behaviour and different rules.
| Network | Who uses it | Addresses on it | Routed? | Must be |
|---|---|---|---|---|
| Public | Clients, application servers, DBAs | Node host IP, node VIP, the three SCAN VIPs, GNS VIP if used | Yes | One subnet shared by every node; in an extended cluster a layer-2 VLAN stretched across both sites |
| Private interconnect | CSS heartbeats, Cache Fusion, GES, ASM metadata | Private IPs (e.g. 192.168.201.x) plus HAIP link-local 169.254.x.x | No | Dedicated, non-routed, same subnet on all nodes, low latency, jumbo frames end to end, multicast enabled, redundant |
| Storage | Database I/O | FC: none (WWNs). iSCSI/NFS: dedicated IPs | FC: n/a; IP storage: preferably not | Separate from the interconnect; redundant paths |
| Management | ILOM/iDRAC/BMC, backup, monitoring | BMC addresses | Yes | Independent of everything above, so you can power a fenced node back on |
The names "public interconnect" and "private interconnect" are sometimes used, but Oracle's terms are public network and private interconnect (or cluster interconnect). Only the private one is an interconnect in the RAC sense: it connects instances to each other.
Three kinds of address live on the public subnet, and understanding why each exists is most of RAC networking.
Host IP. The server's own address (node1 → 10.20.10.11). Used for SSH, for the installer's inter-node copying, and as the HOST in the node's local listener endpoint alongside the VIP. Clients should never use it directly.
Node VIP. Each node has a virtual IP (node1-vip → 10.20.10.21) managed by Clusterware as ora.node1.vip. While the node is healthy the VIP sits on its public interface as a secondary address. When the node fails, Clusterware brings the same VIP up on a surviving node. On that node nothing listens for database connections on the failed node's VIP, so a client that tries to connect gets an immediate connection refused and moves to its next address, instead of waiting out a TCP connect timeout, which can be minutes on some platforms. That is the whole purpose of the VIP: fast failure, not failover. When the node comes back the VIP returns to it.
SCAN. The Single Client Access Name (11.2+) is one DNS name for the whole cluster, rac-scan.corp.example, resolving round-robin to three addresses on the public subnet (or served by GNS). Each address is a SCAN VIP with a SCAN listener on top, and the three pairs are spread across nodes by Clusterware: with two nodes, one node carries two. Clients connect to the SCAN name and port 1521; a SCAN listener knows every instance of every service in the cluster (because each instance registers with it through remote_listener) and redirects the client to the local listener of the best instance. The client then talks to that node's VIP. Because of the SCAN, adding or removing a node never changes a client connect string.
rac-scan → one of three SCAN VIPs (DNS round-robin)node3-vip:1521srvctl config scan ; srvctl config scan_listener srvctl status scan -verbose nslookup rac-scan.corp.example # must return 3 addresses lsnrctl status LISTENER_SCAN1 # services registered (grid user) show parameter remote_listener # 'rac-scan.corp.example:1521' show parameter local_listener # (ADDRESS=(PROTOCOL=TCP)(HOST=node1-vip)(PORT=1521))
Listener registration. Each instance's LREG process (PMON before 12c) registers its services with the local listener and with the three SCAN listeners every minute, or on demand with ALTER SYSTEM REGISTER. It also sends load statistics, which is what the SCAN listener uses for server-side load balancing. A service missing from lsnrctl status is almost always a remote_listener or DNS problem, not a listener problem.
Multiple public networks (12c+). You can define a second network resource (ora.net2.network) with its own VIPs, SCAN and listeners, for instance to separate application traffic from backup or replication. Each service is then bound to a network.
GNS. The Grid Naming Service lets the cluster hand out its own VIP and SCAN addresses by DHCP and answer DNS for a delegated subdomain. It removes the need to pre-register addresses in corporate DNS and is what Flex Clusters used for leaf nodes; most on-premises clusters still use static addresses in DNS.
The interconnect carries three things: the CSS network heartbeat (tiny, once a second, latency-sensitive), Cache Fusion block transfers (8 KB blocks or multiples, bandwidth- and latency-sensitive) and GES messages (small, many). ASM also uses it for its own metadata traffic, and with Flex ASM the database-to-ASM traffic can run on it or on its own network.
Protocol. On Linux the database uses UDP over IP for Cache Fusion (Exadata uses RDS over InfiniBand/RoCE). UDP has no retransmission of its own: a dropped packet becomes a gc cr block lost wait and a retry at the Oracle layer, which is why switch buffer drops and MTU mismatches hurt RAC far more than they hurt a web server. The Clusterware daemons use TCP and UDP through GIPC.
Requirements that are not optional.
ens2f0 is the interconnect on every node), and the role recorded in the GPnP profile with oifcfg.HAIP. Highly Available IP (11.2.0.2+) is Clusterware's own redundancy for the interconnect. You give Clusterware up to four private interfaces; it puts one link-local address (169.254.x.x, chosen from four sub-ranges) on each, and the database and ASM bind to those 169.254 addresses, not to your 192.168 ones (gv$cluster_interconnects shows them). Traffic is load-balanced across the interfaces. If an interface or its switch fails, gipcd moves that interface's 169.254 address onto a surviving interface in under a second; the database never notices beyond a brief wait spike. HAIP and bonding can be combined, but HAIP alone with two switches is the common and simplest design.
oifcfg getif # ens2f0 192.168.201.0 global cluster_interconnect,asm ip -4 addr show | grep 169.254 # the HAIP addresses crsctl stat res ora.cluster_interconnect.haip -init select * from gv$cluster_interconnects; -- what each instance actually uses ping -M do -s 8972 192.168.201.12 # proves MTU 9000 end to end (8972 + 28 header) netstat -su | grep -iE 'receive errors|buffer' # UDP drops = interconnect trouble
Parameters you should not set. cluster_interconnects overrides HAIP with fixed addresses; it disables HAIP failover and is for troubleshooting or very specific designs only. Leave the UDP buffer sizes at the values the preinstall RPM sets (net.core.rmem_max 4 MB and friends) unless Oracle Support asks.
Time. Clusterware will not join a node whose clock is far off. Run chronyd (or ntpd) with the slew option; octssd then stays in observer mode. Without an external time source, octssd adjusts the clocks itself, which works but leaves the cluster drifting from the rest of the estate.
DNS. Node names, VIP names and the SCAN must resolve forward and reverse, and every node must see the same answers. The SCAN must not be in /etc/hosts (only one address would ever be used); node and VIP names may be. cluvfy comp nodecon and cluvfy comp scan check all of this before an install.
| Port | Network | Used by |
|---|---|---|
| 1521 (configurable) | Public (VIPs and SCAN VIPs) | Local listeners and SCAN listeners |
| 6100 remote / 6200 local | Public | ONS (Oracle Notification Service): FAN events to clients and between nodes |
| 42424 (default range) | Private | CSS heartbeats and GIPC daemon communication |
| Dynamic UDP range | Private | Cache Fusion between instances (one port per process pair) |
| 53 UDP/TCP | Public | GNS when configured |
| 22 | Public | SSH equivalence between nodes for install and patching |
Firewalls between nodes on the private network are not supported; on the public network, allow the listener and ONS ports from clients and all ports between the nodes themselves.
A service is a name for a workload, created with srvctl add service and stored in the OCR. It lists the instances where it prefers to run and the instances available to take over. Clients ask for the service in their connect string; the SCAN listener places them on an instance that currently offers it. Services are also where you attach the client-facing policies: load-balancing goals, TAF, Application Continuity, draining. The Application connectivity tab covers these. The network point is simple: because the connect string names a service and the SCAN, it never names a host, so the topology can change beneath it.
srvctl add service -db orcl -service sales -preferred orcl1,orcl2 -available orcl3 srvctl start service -db orcl -service sales srvctl status service -db orcl lsnrctl services LISTENER_SCAN1 | grep -A2 sales
Two sites make three network problems harder. The public subnet must be one layer-2 domain across both sites, because a VIP from site A must be able to come up at site B with the same address; this is normally a stretched VLAN over the inter-site links, or an overlay (VXLAN/EVPN) presenting one. The interconnect must be extended too: each private VLAN continues across its own DWDM wavelength or dark-fibre pair, with jumbo frames intact and latency low enough for Cache Fusion. And the quorum network to the third site's voting file must be reachable independently of the inter-site links, or the third vote cannot break a tie when those links fail. Section 7 of this site models exactly these three paths.
| Symptom | Usual cause | Check |
|---|---|---|
gc cr/current block lost, gc cr failure | Interconnect packet loss: switch buffer drops, MTU mismatch, bad optic, NIC ring overruns | netstat -su, ethtool -S ens2f0, switch port counters, ping -M do -s 8972 |
gc waits 2–10 ms instead of <1 ms | Interconnect saturated, LMS starved of CPU, or routed/shared network | gv$instance_ping, OS load, oifcfg getif |
Node evicted with CRS-1610…1612 warnings before | Network heartbeat lost: interconnect down, or node too busy to send heartbeats | ocssd.trc, CHM (oclumon dumpnodeview), switch logs |
ORA-12514 / ORA-12516 via SCAN | Service not registered with SCAN listeners: remote_listener wrong, DNS not returning all three, service not started | lsnrctl services LISTENER_SCAN1, show parameter remote_listener |
| Clients hang for minutes after a node dies | VIP did not fail over, or clients use host IPs instead of VIPs/SCAN | srvctl status vip -node node1, client connect strings |
Instance will not start: ORA-27504/27300, IPC errors | Interconnect interface down or renamed; HAIP cannot start | oifcfg getif, ip link, crsctl stat res -init |
Every node must be able to read and write every datafile, every online redo log of every thread, the control files, the SPFILE, the voting files and the OCR, at the same time. The storage must therefore be presented to all nodes concurrently, and whatever sits on it must be a cluster-aware file system or volume manager. An ordinary ext4 or XFS volume mounted on two nodes would be corrupted within seconds, because each kernel caches metadata as if it were alone.
| Storage type | How nodes reach it | Oracle layer on top | Notes |
|---|---|---|---|
| Fibre Channel SAN | HBAs, two fabrics, zoning, LUN masking | ASM over dm-multipath devices | The classic enterprise choice; modelled in sections 4, 6 and 7. No IP, so no interaction with the cluster networks. |
| iSCSI | Software or hardware initiators over dedicated 10/25 GbE | ASM over dm-multipath | Cheaper; needs its own network and jumbo frames; CPU cost on the nodes. |
| NVMe over Fabrics | NVMe/TCP or NVMe/RoCE | ASM over native NVMe multipath | The current direction for new arrays; very low latency. |
| NFS | NFS v3/v4 from a certified filer | Direct NFS (dNFS) client inside the database, or kernel NFS with Oracle's mount options | Simple; dNFS bypasses the OS page cache and does its own multipathing. Also the usual home of the quorum voting file in an extended cluster. |
| Exadata | RDMA network to storage cells | ASM with Smart Scan, flash cache, cell offload | Oracle's engineered system; the same ASM concepts, with the storage doing part of the SQL. |
| Cluster file systems (ACFS, OCFS2, vendor CFS) | Any of the above | Database files as ordinary files | Legacy for datafiles except ACFS; ACFS is used for non-database files. |
Whatever the transport, Oracle's requirement is the same: the device must support concurrent access with O_DIRECT semantics and honour write ordering, and it must be visible under the same name (or same ASM label) on every node.
A LUN presented over two fabrics appears to Linux as four block devices (/dev/sdc, /dev/sdk, …), one per path. dm-multipath folds them into one device (/dev/mapper/DATA_01) that keeps working when any path fails and spreads I/O across the live ones. The /dev/sdX names can change between reboots, so ASM must never be pointed at them; it uses the multipath alias, a udev rule, ASMLib (older) or the ASM Filter Driver (AFD, 12.1.0.2+), which also blocks any non-Oracle write to an ASM disk, including an accidental dd or mkfs. Device ownership must be grid:asmadmin, mode 0660, on every node.
multipath -ll # paths per LUN, policy, ALUA state /etc/multipath.conf: alias DATA_01 for each wwid; path_grouping_policy group_by_prio asmcmd afd_lsdsk # disks labelled by the ASM Filter Driver asmcmd afd_label DATA01 /dev/mapper/DATA_01 # label once, visible from every node udevadm info -q property /dev/mapper/DATA_01 # udev route instead of AFD
Automatic Storage Management is a volume manager and file system in one, written for Oracle files. You give it raw devices; it gives the database files. It runs as its own instance (+ASM1) with a small SGA and no datafiles of its own; its "data dictionary" is metadata written on the disks themselves.
+DATA, +RECO, +GRID. Every file is striped across all disks of its group.| Redundancy | Copies of each extent | Minimum failure groups | Voting files it can hold | Survives | Use when |
|---|---|---|---|---|---|
| External | 1 | 1 | 1 | Nothing at the ASM level; the array's RAID protects | Enterprise array with RAID 6/10 in one site; most +DATA groups |
| Normal | 2 | 2 (3 for voting files) | 3 | Loss of one failure group | Two arrays, two sites, JBOD/Exadata, the +GRID group |
| High | 3 | 3 (5 for voting files) | 5 | Loss of two failure groups | Exadata, mission-critical +GRID, three-site designs |
| Flex (12.2+) | Per file group: 1, 2 or 3 | 3 | 3 | Depends on file group | Different databases or PDBs in one disk group needing different protection; quotas |
| Extended (12.2+) | 2 per site × 2 sites | 3 per site | 5 | A whole site plus a disk in the other | Extended clusters that must survive a site and a disk failure |
The extended-cluster pattern used in section 7: +DATA normal redundancy with failure group FG_A on the site A array and FG_B on site B, so every extent exists at both sites; +GRID normal redundancy with three failure groups: one disk per site plus a quorum failure group at site C that holds only a voting file. preferred_read.enabled (12.2; asm_preferred_read_failure_groups before) makes each instance read from its own site's copy so reads do not cross the inter-site link.
Usable capacity. Normal redundancy halves it, high divides by three, and ASM additionally wants free space to re-mirror after a failure. REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in v$asm_diskgroup tell you the real figure; a negative USABLE_FILE_MB means a disk failure could not be fully re-protected.
disk_repair_time (default 3.6 h before 12.2, 12 h from 12.2). While it runs ASM tracks changed extents in a staleness registry and, if the disk comes back (path failure, controller reboot), performs a fast mirror resync of only those extents (11g R1+).failgroup_repair_time (default 24 h, 12.2+) instead, giving operations a day to bring a site back before ASM gives up on it.select name, state, mode_status, repair_timer from v$asm_disk; alter diskgroup DATA online all; -- after the array/path is back alter diskgroup DATA set attribute 'disk_repair_time'='8h'; alter diskgroup DATA set attribute 'failgroup_repair_time'='48h'; asmcmd lsdg ; asmcmd lsop -- operations in flight alter diskgroup DATA rebalance power 8; -- 1..1024 (11.2.0.2+), default asm_power_limit
| Attribute / parameter | Scope | What it controls | Typical value |
|---|---|---|---|
compatible.asm | Disk group | Minimum ASM version that can mount it; gates features like variable extents, fast resync, flex redundancy. Cannot be lowered. | Match the GI release (19.0.0.0.0) |
compatible.rdbms | Disk group | Minimum database version that can use it. Set as high as your lowest database allows. | Lowest DB release using the group |
compatible.advm | Disk group | Needed to create ADVM volumes / ACFS. | GI release |
au_size | Disk group (at creation) | Allocation unit size: 1, 2, 4, 8, 16, 32, 64 MB. | 4 MB; larger for multi-TB |
sector_size, logical_sector_size | Disk group | 512 or 4096 byte sectors; must match the disks; affects redo block size. | 512 unless 4Kn disks |
disk_repair_time, failgroup_repair_time | Disk group | See section 5. | 12h / 24h |
content.type | Disk group | DATA, RECOVERY or SYSTEM: changes how mirror partners are chosen so that two groups do not fail together. | DATA for +DATA, RECOVERY for +RECO |
preferred_read.enabled | Disk group (12.2+) | Read from the local site's copy in an extended cluster. | TRUE in extended clusters |
thin_provisioned | Disk group | Tell the array when space is freed after a rebalance. | TRUE on thin arrays |
asm_diskstring | ASM instance | Where ASM looks for disks: /dev/mapper/*, AFD:*, ORCL:* (ASMLib). | Narrow it; a wide string slows discovery |
asm_diskgroups | ASM instance | Groups mounted at startup (Clusterware manages this via the disk group resources). | Managed by srvctl |
asm_power_limit | ASM instance | Default rebalance power. | 1 (gentle) to 4; raise for planned work |
memory_target / sga_target | ASM instance | ASM SGA; small, but larger with many disks or Flex ASM clients. | 1–4 GB |
asm_preferred_read_failure_groups | ASM instance (pre-12.2) | Old form of preferred read: DATA.FG_A on site A instances. | Replaced by the attribute |
| Process | Role |
|---|---|
| RBAL | Coordinates rebalance and disk discovery; also opens disks on behalf of the database instance. |
| ARBn | Rebalance slaves that actually move extents; their count follows the rebalance power. |
| GMON | Disk group monitor: maintains disk membership, the Partnership and Status Table (PST), offline/online transitions. |
| MARK | Marks ASM allocation units as stale when a write to an offline disk is skipped, feeding fast mirror resync. |
| Onnn / Bnnn | Connection slaves between the database and ASM instances (ASMB in the database, Onnn in ASM); with Flex ASM they carry the remote connection. |
| ASMB (in the database instance) | The database's link to ASM: fetches extent maps, reports I/O errors, keeps the connection alive. The database does not send I/O through ASM; it reads and writes the disks directly, using the extent map ASM gave it. ASM is a control path, not a data path. |
| XDMG, XDWK | Exadata disk management. |
That last point surprises people: ASM is not in the I/O path. If every ASM instance died, running databases would keep reading and writing until they needed a new extent or hit an error. This is also why Flex ASM works.
Before 12c every node ran an ASM instance, and if it died the database instances on that node died with it. Flex ASM runs a configurable number of ASM instances (cardinality, default 3) anywhere in the cluster; a database instance on a node without ASM connects to a remote ASM instance over the ASM network (which can be the interconnect or a dedicated one), and if its ASM instance fails it simply reconnects to another. The +ASM3 (remote) label on node4 in sections 6 and 7 is this. Flex ASM is the default install mode since 12.2.
srvctl config asm # ASM instance count: 3 (Flex) or ALL srvctl modify asm -count 3 asmcmd showclustermode # Flex mode enabled select instance_name, status from gv$asm_client; -- which DB instance uses which ASM
| Disk group | Holds | Redundancy choice | Why separate |
|---|---|---|---|
+GRID (or +OCR, +VOTE) | Voting files, OCR, ASM SPFILE, ASM password file, GIMR if present | Normal or high, three or five failure groups | Small, must survive anything; voting files need their own failure groups |
+DATA | Datafiles, control file copy 1, online redo (one member of each group), SPFILE, temp | External on a RAID array; normal across two arrays/sites | The performance group; sized for I/O |
+RECO (Fast Recovery Area) | Archived redo, flashback logs, RMAN backups, control file copy 2, second redo member | Usually external | So that a full FRA or a backup burst cannot stall datafile I/O; content.type=RECOVERY keeps its mirrors apart from DATA's |
+ACFS / volumes | ACFS file systems, GoldenGate, shared homes | As required | Keep general-purpose churn away from database files |
compatible.* deliberately at creation. Raising later is online, lowering is impossible.+DATA must be normal redundancy with one failure group per site; external redundancy there means a site loss is a data loss. Section 7's storage scenarios show this.crsctl add css votedisk on raw devices in a modern cluster.disktimeout is 200 s for a reason, but an array that takes longer to fail over will evict every node.asmcmd lsdg -- state, redundancy, usable MB asmcmd lsdsk -k -- disks with failure groups and sizes select group_number, name, type, total_mb, free_mb, required_mirror_free_mb, usable_file_mb from v$asm_diskgroup; select name, failgroup, mode_status, path from v$asm_disk order by 1; crsctl query css votedisk ; ocrcheck asmcmd spget ; asmcmd pwget --asm
A RAC database can lose a node and stay open, but the application only benefits if three things happen on its side: it finds out quickly that its connections are dead, it reconnects to a surviving instance, and, ideally, the work that was in flight completes or is replayed instead of being thrown back at the user. Oracle has built a layer for each: FAN for finding out, pools with FCF (and the older TAF) for reconnecting, and Application Continuity for replaying. Everything hangs off services.
A service is created with srvctl and lives in the OCR. The database only knows a service by name; every HA and load-balancing policy is an attribute of the service, so you can give the batch workload and the OLTP workload different behaviour on the same database. A PDB gets its own services in a multitenant database (-pdb).
| srvctl option | What it sets |
|---|---|
-preferred / -available | Instances where the service normally runs, and instances that take it over when a preferred one fails (administrator-managed). A singleton service has one preferred instance. |
-cardinality (policy-managed) | UNIFORM (every instance in the pool) or SINGLETON. |
-tafpolicy | Server-side TAF: NONE, BASIC, PRECONNECT. |
-failovertype | NONE, SESSION, SELECT (TAF), TRANSACTION (Application Continuity), AUTO (Transparent AC, 18c+). |
-failoverretry, -failoverdelay | How many times and how often to retry the reconnect. |
-commit_outcome TRUE | Enables Transaction Guard: the outcome of the last commit is kept so a replay never commits twice. |
-replay_init_time | Seconds after a failure during which a replay may still start (default 300). |
-session_state | STATIC or DYNAMIC: whether session state (NLS, PL/SQL package state) changes during a request and must be restored. |
-failover_restore | LEVEL1 / AUTO: restore common session state at failover. |
-notification TRUE | Send FAN events for this service. |
-clbgoal | Connection load balancing: SHORT (balance by response time, for pools) or LONG (balance by session count, for long-lived connections). |
-rlbgoal | Runtime load balancing advisory goal: SERVICE_TIME or THROUGHPUT; NONE disables the advisory. |
-drain_timeout, -stopoption | How long to let sessions finish before a planned stop or relocation (18c+), and what to do with the rest. |
srvctl add service -db orcl -service oltp -preferred orcl1,orcl2 -available orcl3,orcl4 \ -failovertype AUTO -commit_outcome TRUE -failover_restore AUTO -replay_init_time 600 \ -notification TRUE -clbgoal SHORT -rlbgoal SERVICE_TIME -drain_timeout 60 -stopoption IMMEDIATE srvctl start service -db orcl -service oltp srvctl relocate service -db orcl -service oltp -oldinst orcl1 -newinst orcl3 -drain_timeout 120
The connect string is half of the client's HA. A good one names the SCAN and a service, never a host, and sets the timeouts that make failure fast:
OLTP =
(DESCRIPTION =
(CONNECT_TIMEOUT = 90)(RETRY_COUNT = 50)(RETRY_DELAY = 3)(TRANSPORT_CONNECT_TIMEOUT = 3)
(ADDRESS_LIST = (LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.corp.example)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = oltp)))
TRANSPORT_CONNECT_TIMEOUT = 3 s: give up on a dead address quickly and move on (this is what makes the VIP's "connection refused" useful).RETRY_COUNT × RETRY_DELAY: keep trying through a failover window instead of failing the first attempt.LOAD_BALANCE = ON: client-side spread over the SCAN addresses; the SCAN listener then does the real, load-aware placement.ADDRESS_LIST for the standby SCAN and let the role-based service decide which cluster answers.SID= in RAC; it binds to one instance.Connection load balancing happens when a connection is made. The SCAN listener knows the load of every instance (LREG sends it) and places the new connection according to the service's clbgoal: SHORT uses the response-time metric, LONG uses session counts. Runtime load balancing happens continuously inside a connection pool: the Load Balancing Advisory publishes, via FAN every few seconds, a percentage for each instance (gv$servicemetric), and pools such as UCP, OCI session pool and ODP.NET hand out connections to the instance the advisory favours. A pool therefore drifts work away from a slow instance before it fails. The same mechanism is how a service drains: the advisory tells the pool to stop using an instance that is about to go down.
select service_name, inst_id, goal, cpupercall, elapsedpercall from gv$servicemetric; select name, goal, clb_goal, aq_ha_notifications from dba_services;
Without notification a client learns that a node died only when its next request times out, often after the TCP keepalive, which can be minutes. Fast Application Notification is Clusterware pushing events (service down on orcl1, node down, service up on orcl3, load advisory) out through ONS (Oracle Notification Service, ports 6200 local / 6100 remote). Oracle's connection pools subscribe to ONS automatically since 12c (auto-ONS: the pool learns the ONS endpoints from the SCAN), and on a down event they immediately close the dead connections, so the application gets its error in milliseconds and the pool refills from surviving instances. That reaction is Fast Connection Failover (FCF). FAN events also reach OCI clients and, through the aq_ha_notifications service attribute, PL/SQL callbacks.
srvctl status ons ; srvctl config nodeapps -onsonly onsctl debug # ONS connections and subscribers # JDBC thin / UCP: oracle.ucp.jdbc.PoolDataSource ... setFastConnectionFailoverEnabled(true) # Java system property for explicit ONS: -Doracle.ons.nodes=node1-vip:6200,node2-vip:6200
Transparent Application Failover (8i, OCI-based) is a reconnect feature in the Oracle client library. When the connection breaks, the OCI client itself opens a new session on a surviving instance using the same connect descriptor, re-authenticates, and, with FAILOVER_MODE TYPE=SELECT, re-executes an open SELECT and discards rows already fetched so the cursor appears to continue. It can be configured in the client's tnsnames.ora or server-side on the service (-tafpolicy BASIC), which is preferred so every client gets it.
Its limits define why Application Continuity exists:
ORA-25402 / ORA-25408; it must re-run the DML itself.ALTER SESSION settings, unless the application re-creates them in a TAF callback.(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 30)(DELAY = 5)) -- client side srvctl modify service -db orcl -service rpt -tafpolicy BASIC -failovertype SELECT -- server side select username, failover_type, failover_method, failed_over from gv$session where username is not null;
Application Continuity (12.1) hides an outage from the application by replaying the in-flight database request on a surviving instance. A request is the unit of work between a connection being checked out of a pool and checked back in. The replay driver (oracle.jdbc.replay.OracleDataSourceImpl in JDBC, or OCI with the session pool) records every call in the request: SQL, binds, PL/SQL, the session state changes it made. If the connection breaks before the request completes, the driver opens a new connection to the service, restores the session state, asks Transaction Guard whether the last transaction committed (using the Logical Transaction ID, LTXID, embedded in every session), and if it did not, re-executes the recorded calls in order, checking that each one returns the same results (the same rows, the same row counts, the same SCN-relative outcome). If anything differs, replay is abandoned and the application gets the original error, exactly as it would have without AC. If all matches, the request continues as if nothing happened.
Requirements and realities:
-failovertype TRANSACTION and -commit_outcome TRUE, and the application must use a supported pool/driver (UCP, WebLogic Active GridLink, the JDBC replay data source, OCI session pool, ODP.NET managed with AC, Tuxedo).SYSDATE, SYSTIMESTAMP, SYS_GUID, sequence NEXTVAL would change on replay; Oracle keeps and replays their original values when the schema owner is granted KEEP DATE TIME, KEEP SYSGUID, and the sequence has KEEP. Without that, a request using them is not replayable.UTL_HTTP, DBMS_PIPE, UTL_FILE), or XA, because those cannot be undone or verified.-session_state DYNAMIC the driver re-creates NLS and other state; with STATIC it assumes the application sets it once.replay_init_time and is attempted once per outage.Transparent Application Continuity (18c, -failovertype AUTO) removes the application changes: the server decides request boundaries itself by detecting when a session is in an implicit boundary (no open transaction, no open cursors, standard state) and enables and disables replay automatically, so applications that just use UCP or the OCI pool, with no explicit request marks and no code changes, get continuity. Most new deployments use AUTO.
-- grant mutable handling (schema owner) grant keep date time to sales; grant keep sysguid to sales; alter sequence sales.order_seq keep; -- see what would block replay (run the Application Continuity checker / ACCHK) exec dbms_app_cont_report.acchk_set(...); -- or the acchk tool shipped with the client select * from dba_app_cont_statistics; -- 19c+: requests, replays, protected calls -- Transaction Guard directly select client_id, lt_id from gv$session; -- the LTXID exec dbms_app_cont.get_ltxid_outcome(:ltxid, :committed, :call_completed);
| TAF | FAN / FCF | Application Continuity (AC / TAC) | |
|---|---|---|---|
| Introduced | 8i | 10g | 12.1 / 18c |
| Where it works | OCI client library | Connection pools (UCP, OCI pool, ODP.NET), OCI | Pools and replay drivers |
| Detects failure by | Connection error | FAN event, milliseconds after the fact | FAN event or connection error |
| Reconnects | Yes, the same session is re-created | Pool discards dead connections and gives new ones | Yes, to the service |
| In-flight transaction | Rolled back; error to the application | Rolled back; error to the application | Replayed; no error if the replay verifies |
| Open SELECT | Continued (TYPE=SELECT) | Lost | Replayed |
| Session state | Lost unless callback restores it | Lost (new connection) | Restored |
| Double-commit protection | No | No | Yes (Transaction Guard) |
| Application changes | Handle errors, optional callback | Use a pool with FCF on | None with TAC; request boundaries with AC |
| Status | Legacy; still fine for read-only tools | Baseline for every pooled application | Recommended for new work |
Most RAC outages seen by applications are planned: patching, node reboots, relocating a service. Since 18c the right pattern is to drain: srvctl relocate service or srvctl stop instance -drain_timeout 300 -stopoption IMMEDIATE sends a FAN service down (planned) event; FCF-enabled pools stop handing out connections to that instance and return each connection to the pool at its next check-in, moving it to a surviving instance; after the timeout, anything still connected is handled by AC if possible and otherwise disconnected. A well-configured application sees zero errors during a rolling patch. The ora.<db>.<service>.svc resource's DRAIN_TIMEOUT and the database's -stopoption interact: TRANSACTIONAL waits for transactions to end, IMMEDIATE does not.
srvctl stop instance is a planned event; kill -9 of PMON or pulling a cable is what you are protecting against. Section 6 and 7's scenarios and the Create & play lab are the thinking-model for that.dba_app_cont_statistics / gv$session columns FAILOVER_TYPE, FAILED_OVER show whether sessions actually came through protected.-preferred list or your pool's minimum size needs rebalancing; srvctl relocate service back after the node returns, or let the MANAGEMENT_POLICY be AUTOMATIC.PROCESSES and listener rate limits (RATE_LIMIT in listener.ora) for that moment, not for steady state.Everything in this tab is documented behaviour in the Oracle RAC Administration and Deployment Guide and the JDBC/UCP developer guides; the recommended values (timeouts, drain windows) are practitioner defaults to start from, not Oracle mandates.
Move the pointer over a component to magnify it and read what it does. Press Explode to pull every part out of the chassis. Pick a concept on the left to fly to it.
lscpu
Type a subnet and the calculator shows its range, then lays out a RAC address plan inside it and checks the rules for the network you chose. Everything is computed in your browser.
DocumentedMixedInference
Pick a layer, then a scenario. The model resets, the failure is injected at T+0, and the cluster timeline plays at simulated speed. Long waits (UPS runtime, disk timeouts) are fast-forwarded.
Every rack, server, switch, port, cable, PDU, UPS, CRAC unit and panel in the model is selectable. The camera flies to it and this panel explains what it does in the cluster.
Copper and fibre are colour-coded by network: blue public, green and lime private interconnect, aqua and sky FC fabrics, grey management, yellow single-mode DWDM, violet quorum, black power and SAS.
crsctl stat res -t crsctl query css votedisk crsctl query cluster site -all olsnodes -n -s -t
Pick a network to light up its cables in the model and pin the addresses to the ports. Addresses are an example plan for this build; the rules under the table are the parts Oracle actually requires.
Learn RAC with Arasu · a personal Oracle RAC learning site built as a 3D model of a real cluster · hostnames, addresses and incident messages are illustrative examples, not a real environment.
Labels: Documented = behaviour described in the Oracle 19c Clusterware / ASM administration guides, Oracle Support notes or ASHRAE TC 9.9 (misscount 30 s, disktimeout 200 s, rebootless restart, voting majority, disk_repair_time 3.6 h, failgroup_repair_time 24 h, Flex ASM cardinality, HAIP, the CRS-16xx message IDs). Inference = practitioner reasoning about how the pieces interact, where exact behaviour depends on version, patch level, vendor firmware or timing. Hardware thermal thresholds, UPS runtime and DWDM switch times are vendor-specific and shown as typical values. Message text is abbreviated from the real formats; incarnation numbers, PIDs and paths are illustrative.