{"id":5761,"date":"2026-07-16T03:44:12","date_gmt":"2026-07-15T22:14:12","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5761"},"modified":"2026-07-19T22:14:54","modified_gmt":"2026-07-19T16:44:54","slug":"oracle-rac-19c-patching","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-rac-19c-patching\/","title":{"rendered":"Oracle RAC 19c Patching"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for patching Oracle RAC 19c on Linux. Covers both rolling and non-rolling patch methods, Grid Infrastructure patching, ASM patching, database patching, datapatch execution, and full post-patch validation across all nodes \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Document Info<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td>Oracle Version<\/td><td>19c RAC (Grid Infrastructure + RDBMS)<\/td><\/tr><tr><td>OS<\/td><td>Oracle Linux 7.x \/ RHEL 7.x or 8.x<\/td><\/tr><tr><td>Patch Type<\/td><td>Release Update (RU) \u2014 RAC Environment<\/td><\/tr><tr><td>Cluster<\/td><td>2-Node RAC (racnode1, racnode2)<\/td><\/tr><tr><td>Patching Method<\/td><td>Rolling (preferred) and Non-Rolling (covered both)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2694520.1 (19c Patch Advisories)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1410202.1 (OPatch Quick Start)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2539751.1 (RAC Patching with OPatch)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 756671.1 (Complete Checklist for Patching RAC)<\/td><\/tr><tr><td>Prepared By<\/td><td>Oracle DBA \/ Consultant<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. RAC Patching \u2014 Concepts You Must Know First<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why is RAC patching more complex than standalone?<\/strong> In standalone patching you shut down one database, patch one Oracle Home, run datapatch, done. In RAC you have multiple Oracle Homes (one per node), two types of software to patch (Grid Infrastructure AND Database), and a choice between rolling and non-rolling methods. Getting the sequence wrong can bring down the entire cluster.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Key RAC Patching Concepts<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Concept<\/th><th>What It Means<\/th><\/tr><\/thead><tbody><tr><td>Rolling Patch<\/td><td>Patch one node at a time while the database stays online on other nodes. Zero downtime for the database. Supported for most RUs. This is the preferred method in production.<\/td><\/tr><tr><td>Non-Rolling Patch<\/td><td>All nodes are patched simultaneously \u2014 database is completely down during patching. Faster but causes full downtime. Required for some patches that cannot be applied in rolling mode.<\/td><\/tr><tr><td>Out-of-place Patching<\/td><td>Install a new patched Oracle Home alongside the existing one, then switch the database to the new home. Downtime is minimal (just the switch). Recommended for GI patching in 19c.<\/td><\/tr><tr><td>In-place Patching<\/td><td>Apply the patch directly to the existing Oracle Home. Database must be down on that node. Traditional method.<\/td><\/tr><tr><td>GI Patching<\/td><td>Grid Infrastructure (Clusterware + ASM) must be patched separately from the database. GI must ALWAYS be patched first before the database.<\/td><\/tr><tr><td>OPatchAuto<\/td><td>Oracle&#8217;s automated patching tool for RAC \u2014 patches both GI and DB homes in the correct order automatically. Recommended for RAC. Requires root access.<\/td><\/tr><tr><td>Database Home Patching<\/td><td>After GI is patched, the Database Oracle Home is patched separately on each node.<\/td><\/tr><tr><td>Patch Interdependency<\/td><td>Some DB patches require a specific GI patch level. Always check patch README for interdependencies.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">RAC Patching \u2014 Which Home Gets Patched in What Order<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Sequence of patching in RAC must ALWAYS follow this order. Never patch DB home before GI home on the same node.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>For each node (one at a time for rolling):\n  Step 1 \u2192 Patch Grid Infrastructure Home (GI Home) first\n  Step 2 \u2192 Patch Database Oracle Home second\n  Step 3 \u2192 Run datapatch (only once \u2014 after ALL nodes are patched)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Rolling vs Non-Rolling \u2014 When to Use Which<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Scenario<\/th><th>Use Rolling<\/th><th>Use Non-Rolling<\/th><\/tr><\/thead><tbody><tr><td>Production environment \u2014 zero downtime required<\/td><td>\u2705 Yes<\/td><td>\u274c No<\/td><\/tr><tr><td>Patch README says rolling is supported<\/td><td>\u2705 Yes<\/td><td>\u2014<\/td><\/tr><tr><td>Patch README says rolling NOT supported<\/td><td>\u274c No<\/td><td>\u2705 Yes<\/td><\/tr><tr><td>GI major version upgrade<\/td><td>\u274c No<\/td><td>\u2705 Yes<\/td><\/tr><tr><td>Test\/Dev environment \u2014 downtime acceptable<\/td><td>Optional<\/td><td>\u2705 Faster<\/td><\/tr><tr><td>Patch fixes a critical cluster bug requiring all nodes down<\/td><td>\u274c No<\/td><td>\u2705 Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd Always check the patch README first. The README explicitly states whether rolling patching is supported for that specific patch.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Path Conventions<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Convention A<\/th><th>Convention B<\/th><\/tr><\/thead><tbody><tr><td>Grid Home<\/td><td>\/u01\/app\/19.3.0\/grid<\/td><td>\/oracle\/GRID\/19.31<\/td><\/tr><tr><td>DB Oracle Home<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><td>\/oracle\/RDBMS\/19.31<\/td><\/tr><tr><td>Oracle Base<\/td><td>\/u01\/app\/oracle<\/td><td>\/oracle<\/td><\/tr><tr><td>Grid Base<\/td><td>\/u01\/app\/grid<\/td><td>\/oracle\/grid<\/td><\/tr><tr><td>oraInventory<\/td><td>\/u01\/app\/oraInventory<\/td><td>\/oracle\/oraInventory<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd All examples use Convention A. Substitute Convention B paths where applicable.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Pre-Patching Checks \u2014 Run on All Nodes<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Every pre-check must be verified on ALL nodes before starting any patching activity. A healthy cluster before patching means a smooth patching experience. Never start patching if the cluster has any resource in a non-online state.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 \u2014 Confirm Current Version and Patch Level on All Nodes<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> You must know the exact current patch level on ALL nodes before deciding which patch to apply. In a RAC environment, all nodes must be on the same patch level before you start. If nodes are on different patch levels, fix that first.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Connect from any node\nsqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 100\ncol inst_id       for 999\ncol instance_name for a15\ncol host_name     for a20\ncol version_full  for a20\ncol status        for a12\n\n-- Shows version on all nodes simultaneously\nSELECT inst_id, instance_name, host_name,\n       version, version_full, status\nFROM   gv$instance\nORDER BY inst_id;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Check GI patch level on ALL nodes\nsu - grid\n\n# Node 1\n$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E \"Oracle Grid|Patch\"\n\n# Node 2 \u2014 run same command via SSH\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E 'Oracle Grid|Patch'\"\n\n# Check DB home patch level on ALL nodes\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E \"Oracle Database|Patch\"\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E 'Oracle Database|Patch'\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 \u2014 Check Cluster Health \u2014 All Resources Must Be Online<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Patching a cluster that already has resources in a degraded state is extremely risky. Fix any cluster issues BEFORE patching. Never patch a cluster in a partially degraded state.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Full cluster status \u2014 all nodes\n$ORACLE_HOME\/bin\/crsctl check cluster -all\n\n# All CRS resources \u2014 look for OFFLINE or INTERMEDIATE\n$ORACLE_HOME\/bin\/crsctl stat res -t\n\n# Specifically grep for any non-online resources\n$ORACLE_HOME\/bin\/crsctl stat res -t | grep -E \"OFFLINE|INTERMEDIATE|UNKNOWN\"\n\n# Check database status on all nodes\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n\n# Check ASM status on all nodes\n$ORACLE_HOME\/bin\/srvctl status asm\n\n# Check listener status on all nodes\n$ORACLE_HOME\/bin\/srvctl status listener\n\n# Check SCAN listener\n$ORACLE_HOME\/bin\/srvctl status scan_listener\n\n# Check voting disks \u2014 all must be ONLINE\n$ORACLE_HOME\/bin\/crsctl query css votedisk<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> If ANY resource shows OFFLINE that should be online \u2014 stop. Fix the cluster issue first and get the cluster fully healthy before attempting any patching.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.3 \u2014 Verify OPatch Version on All Nodes and Upgrade if Needed<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> OPatch version must meet the minimum required by the patch on ALL nodes. Both GI home and DB home have their own OPatch. Both must be at the correct version.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check OPatch version in GI Home \u2014 ALL nodes\nsu - grid\n\n# Node 1 \u2014 GI OPatch version\n$ORACLE_HOME\/OPatch\/opatch version\n\n# Node 2 \u2014 GI OPatch version\nssh racnode2 \"\/u01\/app\/19.3.0\/grid\/OPatch\/opatch version\"\n\n# Check OPatch version in DB Home \u2014 ALL nodes\nsu - oracle\n\n# Node 1 \u2014 DB OPatch version\n$ORACLE_HOME\/OPatch\/opatch version\n\n# Node 2 \u2014 DB OPatch version\nssh racnode2 \"\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch\/opatch version\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If OPatch needs upgrading \u2014 do this on ALL nodes, for BOTH GI and DB homes:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Upgrade OPatch in GI Home on ALL nodes\nsu - grid\n\n# Node 1 \u2014 GI OPatch upgrade\nmv $ORACLE_HOME\/OPatch $ORACLE_HOME\/OPatch_backup_$(date +%Y%m%d)\nunzip -q \/stage\/patches\/p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME\n$ORACLE_HOME\/OPatch\/opatch version\n\n# Node 2 \u2014 GI OPatch upgrade (via SSH or directly on node2)\nssh racnode2 \"mv \/u01\/app\/19.3.0\/grid\/OPatch \/u01\/app\/19.3.0\/grid\/OPatch_backup_$(date +%Y%m%d)\"\nscp -r \/u01\/app\/19.3.0\/grid\/OPatch racnode2:\/u01\/app\/19.3.0\/grid\/OPatch\nssh racnode2 \"\/u01\/app\/19.3.0\/grid\/OPatch\/opatch version\"\n\n# Upgrade OPatch in DB Home on ALL nodes\nsu - oracle\n\n# Node 1 \u2014 DB OPatch upgrade\nmv $ORACLE_HOME\/OPatch $ORACLE_HOME\/OPatch_backup_$(date +%Y%m%d)\nunzip -q \/stage\/patches\/p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME\n$ORACLE_HOME\/OPatch\/opatch version\n\n# Node 2 \u2014 DB OPatch upgrade\nssh racnode2 \"mv \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch_backup_$(date +%Y%m%d)\"\nscp -r $ORACLE_HOME\/OPatch racnode2:$ORACLE_HOME\/OPatch\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch version\"<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcce Download latest OPatch: MOS Doc ID <strong>6880880.1<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.4 \u2014 Download and Stage Patch on All Nodes<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why stage on all nodes?<\/strong> OPatch must find the patch files locally on each node it patches. The patch must be unzipped and accessible on every node before patching starts.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Copy patch zip to all nodes (from node1)\nscp \/stage\/patches\/p&lt;PATCHNUM&gt;_190000_Linux-x86-64.zip \\\n    racnode2:\/stage\/patches\/\n\n# Verify patch is present on ALL nodes\nls -lh \/stage\/patches\/p&lt;PATCHNUM&gt;_190000_Linux-x86-64.zip\nssh racnode2 \"ls -lh \/stage\/patches\/p&lt;PATCHNUM&gt;_190000_Linux-x86-64.zip\"\n\n# Unzip patch on NODE 1\nmkdir -p \/stage\/patches\/unzipped\nunzip -q \/stage\/patches\/p&lt;PATCHNUM&gt;_190000_Linux-x86-64.zip \\\n      -d \/stage\/patches\/unzipped\n\n# Unzip patch on NODE 2\nssh racnode2 \"mkdir -p \/stage\/patches\/unzipped &amp;&amp; \\\nunzip -q \/stage\/patches\/p&lt;PATCHNUM&gt;_190000_Linux-x86-64.zip \\\n-d \/stage\/patches\/unzipped\"\n\n# Verify on both nodes\nls -l \/stage\/patches\/unzipped\/\nssh racnode2 \"ls -l \/stage\/patches\/unzipped\/\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.5 \u2014 Read Patch README \u2014 Confirm Rolling Support<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Read the README before anything else\nless \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\/README.html\n# OR\nless \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\/README.txt<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What to look for in README:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is rolling patch supported? Look for text like <code>\"This patch can be applied in a rolling manner\"<\/code><\/li>\n\n\n\n<li>Minimum OPatch version required<\/li>\n\n\n\n<li>Any pre-patch steps specific to this patch<\/li>\n\n\n\n<li>Any post-patch steps beyond standard datapatch<\/li>\n\n\n\n<li>Any known issues with this patch and RAC<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.6 \u2014 Run OPatch Conflict Check on All Nodes<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Conflict check must be run against BOTH GI Home and DB Home on ALL nodes. A conflict on any single node will cause patching to fail on that node.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check conflicts against GI Home \u2014 ALL nodes\nsu - grid\n\n# Node 1 \u2014 GI Home conflict check\n\/u01\/app\/19.3.0\/grid\/OPatch\/opatch prereq \\\n    CheckConflictAgainstOHWithDetail \\\n    -ph \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\n\n# Node 2 \u2014 GI Home conflict check\nssh racnode2 \"\/u01\/app\/19.3.0\/grid\/OPatch\/opatch prereq \\\n    CheckConflictAgainstOHWithDetail \\\n    -ph \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\"\n\n# Check conflicts against DB Home \u2014 ALL nodes\nsu - oracle\n\n# Node 1 \u2014 DB Home conflict check\n\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch\/opatch prereq \\\n    CheckConflictAgainstOHWithDetail \\\n    -ph \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\n\n# Node 2 \u2014 DB Home conflict check\nssh racnode2 \"\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch\/opatch prereq \\\n    CheckConflictAgainstOHWithDetail \\\n    -ph \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> All nodes, both homes must show <code>OPatch succeeded.<\/code><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> If any conflict is found on any node or any home \u2014 stop. Investigate and resolve before proceeding. Never proceed with a known conflict.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.7 \u2014 Check Disk Space on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Run on ALL nodes\ndf -hP $ORACLE_HOME     # DB Home filesystem\ndf -hP \/u01\/app\/19.3.0  # GI Home filesystem\ndf -hP \/tmp\n\n# SSH to node2 and check\nssh racnode2 \"df -hP \/u01\/app\/19.3.0\/grid; df -hP \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.8 \u2014 Check Active Sessions and Coordinate Maintenance Window<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 180\nset pagesize 100\ncol inst_id  for 999\ncol username for a20\ncol machine  for a25\ncol program  for a30\ncol status   for a10\n\n-- Active sessions across ALL nodes\nSELECT inst_id, username, machine, program, status, count(*)\nFROM   gv$session\nWHERE  type    = 'USER'\nAND    username IS NOT NULL\nGROUP BY inst_id, username, machine, program, status\nORDER BY inst_id, count(*) DESC;\n\n-- Quick count per node\nSELECT inst_id, COUNT(*) active_sessions\nFROM   gv$session\nWHERE  type   = 'USER'\nAND    status = 'ACTIVE'\nGROUP BY inst_id\nORDER BY inst_id;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.9 \u2014 Take RMAN Backup Before Patching<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Same as standalone \u2014 your safety net before any patching activity on production.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\nrman target \/\n\nRMAN&gt; BACKUP DATABASE PLUS ARCHIVELOG;\nRMAN&gt; LIST BACKUP SUMMARY;\nRMAN&gt; EXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.10 \u2014 Record Pre-Patch Baseline<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\n-- Record component versions\nset linesize 200\nset pagesize 100\ncol comp_name for a50\ncol version   for a15\ncol status    for a12\n\nSELECT comp_name, version, status\nFROM   dba_registry\nORDER BY comp_name;\n\n-- Record invalid object count\nSELECT COUNT(*) pre_patch_invalid_count\nFROM   dba_objects\nWHERE  status = 'INVALID';\n\n-- Record current datapatch history\nset linesize 200\nset pagesize 100\ncol patch_id    for 9999999999\ncol version     for a15\ncol status      for a15\ncol description for a55\ncol action_time for a25\n\nSELECT patch_id, version, status, description, action_time\nFROM   dba_registry_sqlpatch\nORDER BY action_time DESC;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Save OPatch inventory from ALL nodes and BOTH homes\nsu - grid\n\/u01\/app\/19.3.0\/grid\/OPatch\/opatch lsinventory \\\n    &gt; \/tmp\/pre_patch_GI_node1_$(date +%Y%m%d).txt\n\nssh racnode2 \"\/u01\/app\/19.3.0\/grid\/OPatch\/opatch lsinventory\" \\\n    &gt; \/tmp\/pre_patch_GI_node2_$(date +%Y%m%d).txt\n\nsu - oracle\n\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch\/opatch lsinventory \\\n    &gt; \/tmp\/pre_patch_DB_node1_$(date +%Y%m%d).txt\n\nssh racnode2 \"\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/OPatch\/opatch lsinventory\" \\\n    &gt; \/tmp\/pre_patch_DB_node2_$(date +%Y%m%d).txt<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Rolling Patch \u2014 Method 1 (Preferred for Production)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What happens during rolling patch?<\/strong> You patch one node at a time. While node1 is being patched (database instance on node1 is down), node2 continues serving database connections. Clients experience no downtime \u2014 they either stay connected to node2 or their connection is automatically failed over by the SCAN listener.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Sequence overview:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node1: Stop instance \u2192 Patch GI Home \u2192 Patch DB Home \u2192 Start instance\nNode2: Stop instance \u2192 Patch GI Home \u2192 Patch DB Home \u2192 Start instance\nBoth:  Run datapatch once (on any node, after both nodes are patched)<\/code><\/pre>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 \u2014 Relocate Services Away from Node 1<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Before stopping the node1 instance, relocate all services to node2 so client connections are not disrupted. This is the key to zero-downtime rolling patching.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Check which services are running on node1\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB\n\n# Relocate each service from node1 to node2\n$ORACLE_HOME\/bin\/srvctl relocate service \\\n    -db RACDB \\\n    -service RACDB_APP \\\n    -oldinst RACDB1 \\\n    -newinst RACDB2\n\n# Verify services are now on node2\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.2 \u2014 Stop Database Instance on Node 1<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The database instance on node1 must be down before patching the GI and DB homes on node1. Node2 instance continues running throughout.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Stop instance on node1 only (node2 stays running)\n$ORACLE_HOME\/bin\/srvctl stop instance \\\n    -db RACDB \\\n    -instance RACDB1 \\\n    -stopoption immediate\n\n# Verify node1 instance is down, node2 is still up\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Instance RACDB1 is not running on node racnode1\nInstance RACDB2 is running on node racnode2<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.3 \u2014 Stop Node 1 Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Stop local listener on node1 only\n$ORACLE_HOME\/bin\/srvctl stop listener -n racnode1\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status listener<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.4 \u2014 Patch Grid Infrastructure Home on Node 1<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why GI first?<\/strong> Grid Infrastructure must always be patched before the database on the same node. GI controls ASM which the database depends on. If you patch DB home first and the patch requires a specific GI version, ASM may misbehave.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> GI patching MUST be done as <strong>root<\/strong>. OPatch for GI requires root because it modifies Clusterware files and restarts cluster resources.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to root on NODE 1\nsu - root\n\n# Set GI environment\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport PATH=$ORACLE_HOME\/bin:$ORACLE_HOME\/OPatch:$PATH\n\n# Apply patch to GI Home\n# -local flag tells OPatch to patch only the local node (not all nodes)\n# This is critical for rolling patches \u2014 without -local it tries to patch all nodes\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local \\\n    -oh $ORACLE_HOME \\\n    -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd Monitor GI patching log in another terminal:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>tail -100f \/tmp\/OPatch\/opatch_&lt;date&gt;_&lt;time&gt;.log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Patching component oracle.crs, 19.x.x.x.x...\nPatch &lt;PATCHNUM&gt; successfully applied.\nOPatch succeeded.<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd After GI patching OPatch automatically restarts CRS resources on node1. Wait for this to complete before proceeding.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify CRS restarted and is running on node1\n$ORACLE_HOME\/bin\/crsctl check crs\n$ORACLE_HOME\/bin\/crsctl stat res -t | grep -i node1<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.5 \u2014 Patch Database Home on Node 1<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> After GI home is patched on node1, now patch the DB home on node1. This is done as the <code>oracle<\/code> user.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># As oracle user on NODE 1\nsu - oracle\n\n# Apply patch to DB Home \u2014 -local flag patches only node1\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local \\\n    -oh $ORACLE_HOME \\\n    -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Patching component oracle.rdbms, 19.x.x.x.x...\nPatch &lt;PATCHNUM&gt; successfully applied.\nOPatch succeeded.<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.6 \u2014 Start Node 1 Instance and Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Start listener on node1\n$ORACLE_HOME\/bin\/srvctl start listener -n racnode1\n\n# Start database instance on node1\n$ORACLE_HOME\/bin\/srvctl start instance \\\n    -db RACDB \\\n    -instance RACDB1\n\n# Verify both nodes are now running\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n$ORACLE_HOME\/bin\/srvctl status listener<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd At this point node1 is running the new patched binaries and node2 is still running the old binaries. The database is in a mixed patch state \u2014 this is normal and expected during rolling patching. The database will remain operational.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.7 \u2014 Relocate Services Away from Node 2<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Move services back to node1 (or keep on node2 \u2014 either is fine)\n# Here we move them to node1 so node2 can be patched\n$ORACLE_HOME\/bin\/srvctl relocate service \\\n    -db RACDB \\\n    -service RACDB_APP \\\n    -oldinst RACDB2 \\\n    -newinst RACDB1\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.8 \u2014 Stop Database Instance on Node 2<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Stop instance on node2 only (node1 stays running)\n$ORACLE_HOME\/bin\/srvctl stop instance \\\n    -db RACDB \\\n    -instance RACDB2 \\\n    -stopoption immediate\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.9 \u2014 Stop Node 2 Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Stop local listener on node2 via SSH\nssh racnode2 \"$ORACLE_HOME\/bin\/srvctl stop listener -n racnode2\"\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status listener<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.10 \u2014 Patch Grid Infrastructure Home on Node 2<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As root on NODE 2 \u2014 either SSH or directly on node2\nssh racnode2 \"su - root\"\n# OR log directly into node2\n\nsu - root\n\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport PATH=$ORACLE_HOME\/bin:$ORACLE_HOME\/OPatch:$PATH\n\n# Patch GI Home on node2\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local \\\n    -oh $ORACLE_HOME \\\n    -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify CRS restarted on node2\n$ORACLE_HOME\/bin\/crsctl check crs<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.11 \u2014 Patch Database Home on Node 2<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As oracle user on NODE 2\nssh racnode2\nsu - oracle\n\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local \\\n    -oh $ORACLE_HOME \\\n    -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.12 \u2014 Start Node 2 Instance and Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On node2 as oracle user\nsu - oracle\n\n$ORACLE_HOME\/bin\/srvctl start listener -n racnode2\n\n$ORACLE_HOME\/bin\/srvctl start instance \\\n    -db RACDB \\\n    -instance RACDB2\n\n# Verify all instances are running on all nodes\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Instance RACDB1 is running on node racnode1\nInstance RACDB2 is running on node racnode2<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd Both nodes are now running the new patched binaries. Proceed to datapatch.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Non-Rolling Patch \u2014 Method 2 (Full Downtime)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When to use?<\/strong> When the patch README says rolling is not supported, or when you prefer simplicity over zero-downtime in non-production environments. All nodes are patched simultaneously while the database is completely down.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 \u2014 Stop All Services and Database on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Stop all services\n$ORACLE_HOME\/bin\/srvctl stop service -db RACDB\n\n# Stop entire database (all instances on all nodes)\n$ORACLE_HOME\/bin\/srvctl stop database \\\n    -db RACDB \\\n    -stopoption immediate\n\n# Stop all listeners on all nodes\n$ORACLE_HOME\/bin\/srvctl stop listener\n\n# Verify everything is down\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n$ORACLE_HOME\/bin\/srvctl status listener<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.2 \u2014 Patch GI Home on All Nodes Simultaneously<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As root on NODE 1\nsu - root\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local -oh $ORACLE_HOME -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\n\n# As root on NODE 2 \u2014 run at same time as node1\n# Log into node2 directly or use parallel SSH tool\nsu - root\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local -oh $ORACLE_HOME -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.3 \u2014 Patch DB Home on All Nodes Simultaneously<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As oracle user on NODE 1\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local -oh $ORACLE_HOME -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;\n\n# As oracle user on NODE 2 \u2014 run at same time\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch apply \\\n    -local -oh $ORACLE_HOME -silent \\\n    \/stage\/patches\/unzipped\/&lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.4 \u2014 Start Everything on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Start database on all nodes\n$ORACLE_HOME\/bin\/srvctl start database -db RACDB\n\n# Start listeners on all nodes\n$ORACLE_HOME\/bin\/srvctl start listener\n\n# Start services\n$ORACLE_HOME\/bin\/srvctl start service -db RACDB\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n$ORACLE_HOME\/bin\/srvctl status listener\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. Run datapatch (After All Nodes Are Patched \u2014 Both Methods)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> datapatch is run ONLY ONCE regardless of rolling or non-rolling method. Run it from any ONE node after ALL nodes have been patched and ALL instances are running. datapatch updates the data dictionary for the entire database \u2014 it applies to all instances automatically.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why must all instances be running?<\/strong> datapatch in a RAC environment requires all instances to be up so it can coordinate the dictionary changes across all nodes. If any instance is down when you run datapatch, it will warn you or fail.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.1 \u2014 Verify All Instances Are Running Before datapatch<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 50\ncol inst_id       for 999\ncol instance_name for a15\ncol host_name     for a20\ncol status        for a12\n\nSELECT inst_id, instance_name, host_name, status\nFROM   gv$instance\nORDER BY inst_id;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>All instances must show OPEN before running datapatch.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.2 \u2014 Run datapatch<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Run from NODE 1 as oracle user \u2014 only run once from one node\nsu - oracle\ncd $ORACLE_HOME\/OPatch\n\n# -verbose shows detailed progress of every SQL script applied\n.\/datapatch -verbose<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd Monitor datapatch log for progress and errors:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># In another terminal \u2014 find and monitor the active datapatch log\nls -lrt \/u01\/app\/oracle\/cfgtoollogs\/sqlpatch\/\ntail -100f \/u01\/app\/oracle\/cfgtoollogs\/sqlpatch\/&lt;latest_dir&gt;\/&lt;latest_log&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected successful output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Connecting to database...OK\nBootstrapping registry and package to current versions...done\nDetermining current state...done\nAdding patches to installation queue...done\nInstalling patches...\nPatch installation complete. Total patches installed: 1\nValidating logfiles...done\nPatch &lt;PATCHNUM&gt; apply: SUCCESS\ndatapatch: ALL PATCHES APPLIED SUCCESSFULLY.<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> If datapatch fails \u2014 do NOT restart it immediately. Check the log file for the specific error. Common issues in RAC:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One instance is not open \u2014 start it first<\/li>\n\n\n\n<li>TEMP tablespace is full \u2014 extend it<\/li>\n\n\n\n<li>INVALID objects are blocking compilation \u2014 run <code>utlrp.sql<\/code> first then rerun datapatch<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.3 \u2014 Relocate Services Back to Normal Distribution<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# If services were all moved to one node during rolling patch\n# Move them back to their preferred nodes for load balancing\n$ORACLE_HOME\/bin\/srvctl relocate service \\\n    -db RACDB \\\n    -service RACDB_APP \\\n    -oldinst RACDB1 \\\n    -newinst RACDB2\n\n# Or simply stop and start the service \u2014 CRS places it on preferred node\n$ORACLE_HOME\/bin\/srvctl stop  service -db RACDB -service RACDB_APP\n$ORACLE_HOME\/bin\/srvctl start service -db RACDB -service RACDB_APP\n\n# Verify balanced distribution\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. Post-Patching Checks<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Post-patch checks in RAC must cover ALL nodes. Never sign off on RAC patching without verifying every item below on every node.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.1 \u2014 Verify New Patch Version on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 100\ncol inst_id       for 999\ncol instance_name for a15\ncol host_name     for a20\ncol version_full  for a20\n\n-- Confirm new version on all nodes\nSELECT inst_id, instance_name, host_name,\n       version, version_full\nFROM   gv$instance\nORDER BY inst_id;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify patch in OPatch inventory \u2014 GI Home on ALL nodes\nsu - grid\n$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E \"Oracle Grid|Patch\"\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E 'Oracle Grid|Patch'\"\n\n# Verify patch in OPatch inventory \u2014 DB Home on ALL nodes\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E \"Oracle Database|Patch\"\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E 'Oracle Database|Patch'\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.2 \u2014 Verify datapatch Applied Successfully<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 100\ncol patch_id    for 9999999999\ncol version     for a15\ncol status      for a15\ncol description for a55\ncol action_time for a25\n\n-- Confirm patch applied successfully in data dictionary\nSELECT patch_id, version, status, description, action_time\nFROM   dba_registry_sqlpatch\nORDER BY action_time DESC;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> Your patch number must appear with <code>SUCCESS<\/code> in status column.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.3 \u2014 Check Cluster Health After Patching<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Full cluster status\n$ORACLE_HOME\/bin\/crsctl check cluster -all\n\n# All resources must be online\n$ORACLE_HOME\/bin\/crsctl stat res -t\n\n# Check for any offline resources\n$ORACLE_HOME\/bin\/crsctl stat res -t | grep -E \"OFFLINE|INTERMEDIATE\"\n\n# Check cluster nodes\n$ORACLE_HOME\/bin\/olsnodes -n -i -s -t<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.4 \u2014 Check All Database Instances on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 100\ncol inst_id           for 999\ncol instance_name     for a15\ncol host_name         for a20\ncol status            for a12\ncol database_status   for a18\n\nSELECT inst_id, instance_name, host_name,\n       status, database_status\nFROM   gv$instance\nORDER BY inst_id;\n\n-- Check open mode on all nodes\nSELECT inst_id, name, open_mode, log_mode\nFROM   gv$database\nORDER BY inst_id;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.5 \u2014 Check All Datafiles Online on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol file#           for 999\ncol tablespace_name for a25\ncol status          for a12\ncol name            for a70\n\nSELECT file#, tablespace_name, status, name\nFROM   v$datafile\nORDER BY file#;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.6 \u2014 Check ASM Diskgroups on All Nodes After Patching<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\nsqlplus \/ as sysasm\n\nset linesize 200\nset pagesize 100\ncol inst_id      for 999\ncol name         for a12\ncol state        for a12\ncol total_gb     for 99999.99\ncol free_gb      for 99999.99\ncol offline_disks for 999\n\nSELECT inst_id, name, state,\n       total_mb\/1024  total_gb,\n       free_mb\/1024   free_gb,\n       offline_disks\nFROM   gv$asm_diskgroup\nORDER BY name, inst_id;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> All diskgroups <code>MOUNTED<\/code> on all nodes. <code>offline_disks<\/code> = 0.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.7 \u2014 Check for INVALID Objects After Patching<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 180\nset pagesize 100\ncol owner       for a20\ncol object_name for a45\ncol object_type for a25\ncol status      for a10\n\nSELECT owner, object_name, object_type, status\nFROM   dba_objects\nWHERE  status = 'INVALID'\nORDER BY owner, object_type, object_name;\n\nSELECT COUNT(*) post_patch_invalid_count\nFROM   dba_objects\nWHERE  status = 'INVALID';<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- If count is higher than pre-patch baseline \u2014 recompile\n@?\/rdbms\/admin\/utlrp.sql\n\n-- Re-verify\nSELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.8 \u2014 Verify All Components Are VALID<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol comp_name for a50\ncol version   for a15\ncol status    for a12\n\nSELECT comp_name, version, status\nFROM   dba_registry\nORDER BY comp_name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.9 \u2014 Check Voting Disks After Patching<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Voting disks must all be ONLINE after patching\n$ORACLE_HOME\/bin\/crsctl query css votedisk<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.10 \u2014 Check OCR Integrity After Patching<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# OCR check must succeed\n$ORACLE_HOME\/bin\/ocrcheck\n\n# Check OCR backup was taken post-patching\n$ORACLE_HOME\/bin\/ocrconfig -showbackup<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.11 \u2014 Check Alert Logs on All Nodes for Errors<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># CRS alert log \u2014 ALL nodes\ntail -200 \/u01\/app\/grid\/diag\/crs\/racnode1\/crs\/trace\/alert.log \\\n     | grep -E \"ORA-|Error|WARNING|EVICTED\"\n\nssh racnode2 \"tail -200 \/u01\/app\/grid\/diag\/crs\/racnode2\/crs\/trace\/alert.log \\\n     | grep -E 'ORA-|Error|WARNING|EVICTED'\"\n\n# ASM alert log \u2014 ALL nodes\ntail -200 \/u01\/app\/oracle\/diag\/asm\/+asm\/+ASM1\/trace\/alert_+ASM1.log \\\n     | grep -E \"ORA-|Error|WARNING\"\n\nssh racnode2 \"tail -200 \/u01\/app\/oracle\/diag\/asm\/+asm\/+ASM2\/trace\/alert_+ASM2.log \\\n     | grep -E 'ORA-|Error|WARNING'\"\n\n# DB alert log \u2014 ALL nodes\ntail -200 \/u01\/app\/oracle\/diag\/rdbms\/racdb\/RACDB1\/trace\/alert_RACDB1.log \\\n     | grep -E \"ORA-|Error|WARNING\"\n\nssh racnode2 \"tail -200 \/u01\/app\/oracle\/diag\/rdbms\/racdb\/RACDB2\/trace\/alert_RACDB2.log \\\n     | grep -E 'ORA-|Error|WARNING'\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.12 \u2014 Verify SCAN and Services<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# SCAN and SCAN listener\n$ORACLE_HOME\/bin\/srvctl status scan\n$ORACLE_HOME\/bin\/srvctl status scan_listener\n\n# All services\n$ORACLE_HOME\/bin\/srvctl status service -db RACDB\n\n# Test SCAN connectivity end-to-end\nsqlplus system\/Oracle_123@rac-scan:1521\/RACDB_APP<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.13 \u2014 Save Post-Patch Inventory from All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># GI Home inventory \u2014 all nodes\nsu - grid\n$ORACLE_HOME\/OPatch\/opatch lsinventory \\\n    &gt; \/tmp\/post_patch_GI_node1_$(date +%Y%m%d).txt\n\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory\" \\\n    &gt; \/tmp\/post_patch_GI_node2_$(date +%Y%m%d).txt\n\n# DB Home inventory \u2014 all nodes\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch lsinventory \\\n    &gt; \/tmp\/post_patch_DB_node1_$(date +%Y%m%d).txt\n\nssh racnode2 \"$ORACLE_HOME\/OPatch\/opatch lsinventory\" \\\n    &gt; \/tmp\/post_patch_DB_node2_$(date +%Y%m%d).txt\n\n# Compare pre vs post for each node and each home\ndiff \/tmp\/pre_patch_GI_node1_$(date +%Y%m%d).txt \\\n     \/tmp\/post_patch_GI_node1_$(date +%Y%m%d).txt\n\ndiff \/tmp\/pre_patch_DB_node1_$(date +%Y%m%d).txt \\\n     \/tmp\/post_patch_DB_node1_$(date +%Y%m%d).txt<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. Patch Rollback Procedure for RAC<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When to use?<\/strong> If patching causes critical issues and you need to return to the previous state. RAC rollback must be done in reverse order on all nodes.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Rollback sequence \u2014 datapatch rollback first (DB open, all instances up) \u2192 then stop DB \u2192 then OPatch rollback on all nodes \u2192 then start DB.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.1 \u2014 Run datapatch Rollback (All Instances Must Be Running)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Run from NODE 1 as oracle \u2014 only once\nsu - oracle\ncd $ORACLE_HOME\/OPatch\n\n.\/datapatch -verbose -rollback &lt;PATCHNUM&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.2 \u2014 Stop Database and Listeners on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n$ORACLE_HOME\/bin\/srvctl stop service  -db RACDB\n$ORACLE_HOME\/bin\/srvctl stop database -db RACDB -stopoption immediate\n$ORACLE_HOME\/bin\/srvctl stop listener\n\n# Verify all down\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.3 \u2014 Rollback DB Home on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Node 1 \u2014 as oracle\nsu - oracle\n$ORACLE_HOME\/OPatch\/opatch rollback \\\n    -id &lt;PATCHNUM&gt; -local -silent \\\n    -oh $ORACLE_HOME\n\n# Node 2 \u2014 as oracle\nssh racnode2 \"su - oracle -c \\\n    '$ORACLE_HOME\/OPatch\/opatch rollback \\\n    -id &lt;PATCHNUM&gt; -local -silent \\\n    -oh $ORACLE_HOME'\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.4 \u2014 Rollback GI Home on All Nodes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Node 1 \u2014 as root\nsu - root\n\/u01\/app\/19.3.0\/grid\/OPatch\/opatch rollback \\\n    -id &lt;PATCHNUM&gt; -local -silent \\\n    -oh \/u01\/app\/19.3.0\/grid\n\n# Node 2 \u2014 as root\nssh racnode2 \"su - root -c \\\n    '\/u01\/app\/19.3.0\/grid\/OPatch\/opatch rollback \\\n    -id &lt;PATCHNUM&gt; -local -silent \\\n    -oh \/u01\/app\/19.3.0\/grid'\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.5 \u2014 Start Everything and Verify Rollback<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n$ORACLE_HOME\/bin\/srvctl start database -db RACDB\n$ORACLE_HOME\/bin\/srvctl start listener\n$ORACLE_HOME\/bin\/srvctl start service  -db RACDB\n\n# Verify old version is back\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT inst_id, instance_name, version_full\nFROM   gv$instance\nORDER BY inst_id;\n\n-- Confirm patch is no longer listed\nSELECT patch_id, status, action_time\nFROM   dba_registry_sqlpatch\nORDER BY action_time DESC;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. Quick Reference Card<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Task<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Check cluster health<\/td><td><code>crsctl check cluster -all<\/code><\/td><\/tr><tr><td>Check all resources<\/td><td><code>crsctl stat res -t<\/code><\/td><\/tr><tr><td>Check offline resources<\/td><td><code>crsctl stat res -t | grep OFFLINE<\/code><\/td><\/tr><tr><td>Check DB version all nodes<\/td><td><code>SELECT inst_id,version_full FROM gv$instance;<\/code><\/td><\/tr><tr><td>Check GI OPatch (node1)<\/td><td><code>opatch lsinventory | grep -E \"Oracle Grid|Patch\"<\/code><\/td><\/tr><tr><td>Check DB OPatch (node1)<\/td><td><code>opatch lsinventory | grep -E \"Oracle Database|Patch\"<\/code><\/td><\/tr><tr><td>Upgrade GI OPatch<\/td><td><code>mv OPatch OPatch_bkp &amp;&amp; unzip p6880880*.zip -d $GI_HOME<\/code><\/td><\/tr><tr><td>Upgrade DB OPatch<\/td><td><code>mv OPatch OPatch_bkp &amp;&amp; unzip p6880880*.zip -d $ORACLE_HOME<\/code><\/td><\/tr><tr><td>Conflict check GI<\/td><td><code>opatch prereq CheckConflictAgainstOHWithDetail -ph &lt;PATCHDIR&gt;<\/code><\/td><\/tr><tr><td>Conflict check DB<\/td><td><code>opatch prereq CheckConflictAgainstOHWithDetail -ph &lt;PATCHDIR&gt;<\/code><\/td><\/tr><tr><td>Relocate service<\/td><td><code>srvctl relocate service -db RACDB -service SVC -oldinst I1 -newinst I2<\/code><\/td><\/tr><tr><td>Stop instance node1<\/td><td><code>srvctl stop instance -db RACDB -instance RACDB1 -stopoption immediate<\/code><\/td><\/tr><tr><td>Stop listener node1<\/td><td><code>srvctl stop listener -n racnode1<\/code><\/td><\/tr><tr><td>Patch GI (rolling)<\/td><td><code>opatch apply -local -oh $GI_HOME -silent &lt;PATCHDIR&gt;<\/code><\/td><\/tr><tr><td>Patch DB (rolling)<\/td><td><code>opatch apply -local -oh $ORACLE_HOME -silent &lt;PATCHDIR&gt;<\/code><\/td><\/tr><tr><td>Start instance node1<\/td><td><code>srvctl start instance -db RACDB -instance RACDB1<\/code><\/td><\/tr><tr><td>Start listener node1<\/td><td><code>srvctl start listener -n racnode1<\/code><\/td><\/tr><tr><td>Run datapatch<\/td><td><code>.\/datapatch -verbose<\/code> (once, from any node, all instances up)<\/td><\/tr><tr><td>Check datapatch result<\/td><td><code>SELECT patch_id,status FROM dba_registry_sqlpatch;<\/code><\/td><\/tr><tr><td>Check voting disks<\/td><td><code>crsctl query css votedisk<\/code><\/td><\/tr><tr><td>Check OCR<\/td><td><code>ocrcheck<\/code><\/td><\/tr><tr><td>Check invalid objects<\/td><td><code>SELECT count(*) FROM dba_objects WHERE status='INVALID';<\/code><\/td><\/tr><tr><td>Recompile invalids<\/td><td><code>@?\/rdbms\/admin\/utlrp.sql<\/code><\/td><\/tr><tr><td>Check components<\/td><td><code>SELECT comp_name,status FROM dba_registry;<\/code><\/td><\/tr><tr><td>Rollback datapatch<\/td><td><code>.\/datapatch -verbose -rollback &lt;PATCHNUM&gt;<\/code><\/td><\/tr><tr><td>Rollback GI OPatch<\/td><td><code>opatch rollback -id &lt;PATCHNUM&gt; -local -silent<\/code><\/td><\/tr><tr><td>Rollback DB OPatch<\/td><td><code>opatch rollback -id &lt;PATCHNUM&gt; -local -silent<\/code><\/td><\/tr><tr><td>MOS 19c Patch Advisory<\/td><td>Doc ID 2694520.1<\/td><\/tr><tr><td>MOS RAC Patching Guide<\/td><td>Doc ID 2539751.1<\/td><\/tr><tr><td>MOS RAC Patch Checklist<\/td><td>Doc ID 756671.1<\/td><\/tr><tr><td>MOS OPatch Download<\/td><td>Doc ID 6880880.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This SOP covers everything you need to patch Oracle RAC 19c on Linux without referring to any other source. Always read the patch README to confirm rolling support, always patch GI Home before DB Home on every node, run datapatch only once after all nodes are patched, and always verify cluster health before and after every patching activity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for patching Oracle RAC 19c on Linux. Covers both rolling and non-rolling patch methods, Grid Infrastructure patching, ASM patching, database patching, datapatch execution, and full post-patch validation across all nodes \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions. 1. Document Info [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5783,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5761","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle-sop"],"_links":{"self":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/comments?post=5761"}],"version-history":[{"count":2,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5761\/revisions"}],"predecessor-version":[{"id":5816,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5761\/revisions\/5816"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5783"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}