Friday, May 22, 2026

Exadata patching — how to patch database nodes, storage cells, and InfiniBand switches

Exadata Patching — How to Patch Database Nodes, Storage Cells, and Switches | punitoracledba

Exadata Patching — How to Patch Database Nodes, Storage Cells, and Switches

Exadata — Basics to Pro Series 1. What Is Exadata · 2. Hardware Components · 3. Architecture Deep Dive · 4. Smart Scan, Storage Indexes, HCC · 5. Monitoring · 6. Performance Tuning · 7. Administration · 8. Patching · 9. EBS on Exadata · 10. OCI Exadata

Patching an Exadata system is significantly more complex than patching a standard Oracle database server. An Exadata environment has multiple distinct components — database servers, storage cells, and network switches — each running their own software stack, each patched with different tools, and each requiring a specific sequence relative to the others. Patching one component out of order can leave the system in an inconsistent state.

This article covers the complete Exadata patching process from end to end — what the bundle patches contain, the correct patching order, how rolling and non-rolling modes work, the patchmgr commands for each component, how OPatch fits into the process for DB software, and how to verify patch levels across all components when you are done.

Always read the MOS patch readme before starting. Exadata bundle patches frequently include specific pre-patch steps, known issues, and order-of-operations requirements that are specific to that release. The MOS readme supersedes general guidance including the guidance in this article. Reference MOS Doc ID 888828.1 — Exadata Database Machine and Exadata Storage Server Supported Versions — for the current patch list.

What Gets Patched in an Exadata System

An Exadata system has four distinct software layers, each patched separately with different tools. Understanding this is the foundation of everything else in this article.

Component Software Patched Tool Used Downtime Impact
Database Servers — Infrastructure Oracle Linux OS, firmware, ILOM, drivers, Exadata System Software on DB nodes patchmgr (DBBP) Rolling — one node at a time, RAC stays up
Database Servers — DB Software Oracle Grid Infrastructure, Oracle Database (CPU, PSU, RUs) OPatch + datapatch Rolling — one node at a time via GI rolling patches
Storage Cells Oracle Linux OS, Exadata System Software, firmware, cellsrv, flash drivers patchmgr (EXABP) Rolling — one cell at a time, ASM handles I/O
RoCE / Network Switches Switch firmware and software patchmgr Rolling — one switch at a time

The Two Exadata Bundle Patches — DBBP and EXABP

Oracle delivers Exadata infrastructure patches as two bundle patches. Understanding the difference between them is essential before you download anything.

DBBP — Database Server Bundle Patch

The Database Server Bundle Patch (DBBP) is the infrastructure patch for the database server nodes. It updates everything on the DB nodes except the Oracle Database and Grid Infrastructure software itself.

DBBP includes:

  • Oracle Linux OS updates — kernel, system libraries, security patches
  • System firmware — BIOS, BMC/ILOM, HBA, NIC firmware
  • Storage and network driver updates
  • Exadata-specific utilities — imageinfo, patchmgr itself, support tools
  • Hardware compatibility updates for new component generations

DBBP does not include Oracle Grid Infrastructure or Oracle Database software patches. Those come from the standard Oracle Database CPU/RU patches applied via OPatch — the same process used on any Oracle database server.

EXABP — Exadata Storage Server Bundle Patch

The Exadata Storage Server Bundle Patch (EXABP) is the patch for storage cells. It updates everything that runs on the storage servers.

EXABP includes:

  • Oracle Linux OS updates on the storage cell
  • Exadata System Software — cellsrv, MS, RS daemon updates
  • Storage cell firmware — disk controller, flash device firmware, ILOM
  • Flash driver and NVMe driver updates
  • Cell offload server (CELLOFLSRVn) updates for newer Oracle DB versions
  • Security patches for the cell OS and software stack

EXABP and DBBP are released on the same quarterly schedule as Oracle Database CPUs — January, April, July, and October. They are aligned with the quarterly CPU cycle so that all Exadata components can be brought to a consistent patch level in a single quarterly patching activity.

The Correct Patching Order

This is the most critical section of this article. Applying Exadata patches in the wrong order can break component compatibility, cause cellsrv to fail, or leave the system partially updated. Oracle mandates a specific sequence. Never deviate from it without explicit Oracle Support instruction.

Step Component Tool Why This Order
1 RoCE / Network Switches patchmgr Network infrastructure must be updated first to support newer protocols used by DB nodes and cells
2 Storage Cells (EXABP) patchmgr -cells Storage software must be updated before DB node infrastructure. DB node connects to cells — newer cell software is backward compatible with older DB software but not always forward compatible
3 Database Server Infrastructure (DBBP) patchmgr -dbnodes DB node OS and firmware updated after cells are at new version. Node reboots happen here.
4 Oracle Grid Infrastructure (GI) OPatch (GI rolling) GI patch applied after OS is at new level. Rolling — one node at a time via GI rolling patch mechanism
5 Oracle Database CPU/RU OPatch + datapatch DB patch applied last. datapatch applies SQL changes after all nodes are patched.

Always apply the network switch patch first, then cells, then DB nodes, then GI, then DB software. If the MOS readme for your specific patch bundle states a different order, follow the readme. Some patches modify this sequence for specific dependency reasons.

Rolling vs Non-Rolling Patching Mode

patchmgr supports two patching modes — rolling and non-rolling. The choice between them determines whether databases stay online during patching and how long the total patching window takes.

Rolling mode — zero downtime for RAC databases

In rolling mode, patchmgr patches one component at a time while the others continue serving workloads. For storage cells, it patches one cell at a time — the other cells continue serving I/O to all databases. ASM handles the temporary unavailability of the cell being patched through its normal redundancy mechanisms without data movement. For database nodes, rolling means patching one RAC node at a time while the other nodes continue running the database.

  • Databases remain online throughout patching
  • Takes longer overall — each cell or node is patched sequentially
  • Requires ASM redundancy — data must be mirrored so I/O can continue while one cell is down
  • Recommended for production environments where availability is critical

Non-rolling mode — faster but requires downtime

In non-rolling mode, patchmgr patches all components in parallel simultaneously. For storage cells, all cells are patched at the same time — databases cannot access any storage during this period. For database nodes, all nodes are patched and rebooted simultaneously.

  • Databases must be shut down before starting
  • Total patching time is significantly shorter — all cells patch in parallel
  • Appropriate for development, test environments, or planned maintenance windows
  • Non-rolling is the default mode for storage cells when no -rolling flag is specified
Factor Rolling Mode Non-Rolling Mode
Database availability Online throughout — no outage Must be shut down — full outage
Total patch time Longer — sequential component by component Shorter — all cells patch simultaneously
ASM requirement Requires normal or high redundancy disk groups No redundancy requirement during patching
Default for cells No — specify -rolling flag explicitly Yes — default when no flag specified
Recommended for Production — maximum availability Development, test, short maintenance windows
Per-cell patch time Approximately 1 to 2 hours per cell Same per cell but all cells run in parallel

Manual rolling update — avoid when possible. There is a third option called manual rolling update where each cell is taken completely offline (griddisks dropped from ASM), patched, then added back — forcing two full ASM rebalances per cell. This method requires enough free space in the disk group to hold all data from the most full cell. It is extremely time-consuming and should be used only when patchmgr's built-in rolling mode is not available for a specific patch.

Pre-Patch Checks — Exadata Specific

Exadata has its own set of pre-patch checks that go beyond the standard Oracle database pre-patch checklist. Run all of these before starting any patchmgr operation.

1. Run ExaCheck (formerly exachk)

ExaCheck is Oracle's health check tool specifically for Exadata. It validates hundreds of configuration items across DB nodes, storage cells, and network infrastructure. Run it and resolve all critical and warning findings before patching.

Run ExaCheck before patching
# ExaCheck is usually located here on the DB node
/opt/oracle.SupportTools/exachk/exachk

# Or via the support tools bundle
/opt/oracle.SupportTools/onecommand/exachk

# Run against all components
./exachk -a

# Review the HTML report generated in the output directory
# Fix all FAIL and WARNING items before starting patching

2. Verify current version on all components

Check current versions across all components # Check DB node Exadata software version (run on each DB node) imageinfo # Check cell software version on all cells via dcli dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "imageinfo -ver" # Or using cellcli dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "cellcli -e LIST CELL ATTRIBUTES name, releaseVersion" # Check OPatch version (for GI and DB patching) $ORACLE_HOME/OPatch/opatch version $GI_HOME/OPatch/opatch version # Check current GI version $GI_HOME/bin/crsctl query crs activeversion # Check current DB home version $ORACLE_HOME/bin/sqlplus -version

3. Verify ASM disk group health and redundancy

Check ASM disk groups before rolling cell patching -- Connect to ASM instance sqlplus / as sysasm -- Check disk group status and redundancy SELECT name, type, state, total_mb, free_mb, ROUND(free_mb / total_mb * 100, 1) AS pct_free FROM v$asm_diskgroup ORDER BY name; -- Check no disks are already in error state SELECT group_number, disk_number, name, path, state, mode_status FROM v$asm_disk WHERE state != 'NORMAL' OR mode_status != 'ONLINE' ORDER BY group_number, disk_number; -- Check no rebalance in progress SELECT * FROM v$asm_operation WHERE state = 'RUN';

4. Check for active database sessions and pending operations

Verify database readiness before patching -- Check cluster nodes and their status $GI_HOME/bin/crsctl status resource -t -- Check RAC database instances are all running $GI_HOME/bin/srvctl status database -db <db_unique_name> -- Check for any long-running transactions SELECT s.sid, s.username, s.status, ROUND(t.used_ublk * 8192 / 1048576, 1) AS undo_mb, s.last_call_et AS seconds_active FROM v$transaction t JOIN v$session s ON t.ses_addr = s.saddr ORDER BY t.used_ublk DESC FETCH FIRST 10 ROWS ONLY;

5. Verify SSH key-based authentication from DB node to all cells

patchmgr requires password-less SSH access from the primary database node to all storage cells. If SSH authentication fails for any cell, patchmgr cannot patch that cell.

Verify SSH connectivity to all cells # Test SSH to each cell without password prompt dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "hostname" # Expected output: each cell hostname printed # If SSH fails or prompts for password: fix key-based auth before patching # Also verify from the primary node as root dcli -l root -g /opt/oracle.SupportTools/onecommand/cell_group \ "hostname"

Step 1 — Patching Network Switches

Network switch patching is the first step. On X10M and X11M systems using RoCE switches, patchmgr handles the switch patching. The process patches one switch at a time — during the patching of one switch, all traffic routes through the other, so database I/O continues without interruption.

Network switch patching with patchmgr # Unzip the bundle patch — use the patch directory cd /u01/patches unzip p<patch_number>_<version>_Linux-x86-64.zip cd patch_<version> # Pre-check for network switches ./patchmgr -switches switch_group \ -switch_precheck # Apply the switch patch (rolling — patches one switch at a time) ./patchmgr -switches switch_group \ -upgrade # Verify switch patch completion ./patchmgr -switches switch_group \ -verify

Step 2 — Patching Storage Cells with patchmgr (EXABP)

Storage cell patching uses patchmgr with the -cells flag. patchmgr is run from the primary database node — it connects to all cells via SSH and orchestrates the entire update process including pre-checks, OS updates, firmware updates, cellsrv updates, and post-patch verification.

Prepare patchmgr for cell patching

Stage and prepare patchmgr for cell patching # Unzip the EXABP patch bundle on the primary DB node cd /u01/patches unzip p<exabp_patch_number>_<version>_Linux-x86-64.zip cd patch_<version> # Confirm patchmgr is present and executable ls -la patchmgr ./patchmgr --version # Check the cell group file cat /opt/oracle.SupportTools/onecommand/cell_group # Clean up any previous patchmgr state before starting ./patchmgr -cells /opt/oracle.SupportTools/onecommand/cell_group \ -cleanup

Pre-check — validate cells are ready for patching

Run patchmgr pre-check before patching cells # Run pre-check to validate all cells meet prerequisites ./patchmgr -cells /opt/oracle.SupportTools/onecommand/cell_group \ -precheck # Expected SUCCESS output per cell: # cell01: SUCCESS: DONE: Check prerequisites on all cells. # cell02: SUCCESS: DONE: Check prerequisites on all cells. # If any FAIL messages appear, resolve before proceeding # Common pre-check failures: # - SSH authentication not set up # - Insufficient disk space on cell OS partition # - cellsrv not running on a cell # - ASM disk group in error state

Apply the cell patch — rolling mode

Apply EXABP to storage cells in rolling mode # Rolling mode: patches one cell at a time # Databases remain online -- recommended for production nohup ./patchmgr \ -cells /opt/oracle.SupportTools/onecommand/cell_group \ -rolling \ -upgrade > /u01/patches/patchmgr_cells_$(date +%Y%m%d).log 2>&1 & # Monitor progress tail -f /u01/patches/patchmgr_cells_$(date +%Y%m%d).log # Check patchmgr status (from another terminal) ./patchmgr -cells /opt/oracle.SupportTools/onecommand/cell_group \ -query
Apply EXABP to storage cells in non-rolling mode # Non-rolling mode: patches all cells simultaneously # Databases MUST be shut down before running this # Default mode when -rolling is not specified # Step 1: Shut down all databases and GI on all DB nodes $GI_HOME/bin/srvctl stop database -db <db_unique_name> # Step 2: Apply to all cells simultaneously nohup ./patchmgr \ -cells /opt/oracle.SupportTools/onecommand/cell_group \ -upgrade > /u01/patches/patchmgr_cells_nonrolling.log 2>&1 & # Step 3: Monitor until complete tail -f /u01/patches/patchmgr_cells_nonrolling.log # Step 4: Start databases after all cells are patched $GI_HOME/bin/srvctl start database -db <db_unique_name>

What patchmgr does to each cell during patching

  1. Copies the patch bundle to the cell via SSH/SCP
  2. Runs the cell pre-check to confirm readiness
  3. For rolling mode: waits until ASM confirms redundancy is maintained
  4. Stops cellsrv on the cell being patched
  5. Applies Oracle Linux OS updates, firmware updates, and Exadata System Software
  6. Reboots the storage cell — typically 15 to 30 minutes per cell
  7. Validates the cell post-reboot and confirms cellsrv is running at the new version
  8. For rolling mode: confirms ASM I/O is restored before moving to the next cell

Step 3 — Patching Database Server Infrastructure (DBBP)

After storage cells are patched, the database server infrastructure is updated using patchmgr with the -dbnodes flag. This updates Oracle Linux, firmware, and Exadata tools on the DB nodes. It requires a node reboot — RAC ensures the database stays available during rolling node reboots.

Apply DBBP to database nodes in rolling mode # Unzip the DBBP patch bundle cd /u01/patches unzip p<dbbp_patch_number>_<version>_Linux-x86-64.zip cd patch_<version> # Run pre-check for database nodes ./patchmgr \ -dbnodes /opt/oracle.SupportTools/onecommand/dbs_group \ -precheck \ -iso_repo /u01/patches/p<patch_number>_Linux-x86-64.zip \ -target_version <target_version_string> # Apply DBBP in rolling mode to DB nodes # nohup is important -- SSH session can disconnect during node reboot nohup ./patchmgr \ -dbnodes /opt/oracle.SupportTools/onecommand/dbs_group \ -upgrade \ -iso_repo /u01/patches/p<patch_number>_Linux-x86-64.zip \ -target_version <target_version_string> \ -rolling \ > /u01/patches/patchmgr_dbnodes.log 2>&1 & # Monitor from a separate session tail -f /u01/patches/patchmgr_dbnodes.log # After each node reboots, verify it rejoined the cluster $GI_HOME/bin/crsctl status resource -t

Always run patchmgr with nohup and redirect output to a log file. If your SSH session disconnects during node patching — which commonly happens when patchmgr reboots the node you are connected to — the patchmgr process continues running in the background. You can reconnect to another node and check the log file to confirm progress.

Step 4 — Patching Oracle Grid Infrastructure and Database (OPatch)

After the infrastructure is at the new level, Oracle Grid Infrastructure and Oracle Database software is patched using the standard OPatch process — the same process used on any Oracle database platform. The key difference on Exadata is that GI rolling patches are applied one node at a time using the GI rolling patch mechanism.

Apply GI and DB CPU patch using OPatch # Step 1: Apply GI patch using opatchauto (preferred for Exadata) # Run from the GI home as root export ORACLE_HOME=/u01/app/19.0.0/grid # Run opatchauto for GI patch -- handles rolling on its own $ORACLE_HOME/OPatch/opatchauto apply \ /u01/patches/<gi_patch_directory> \ -oh $ORACLE_HOME # Step 2: Apply DB CPU patch to each DB home export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 # Apply DB patch -- databases can remain up for rolling GI patches $ORACLE_HOME/OPatch/opatch apply \ /u01/patches/<db_cpu_patch_number> # Step 3: Run datapatch after OPatch completes on all nodes $ORACLE_HOME/OPatch/datapatch -verbose # Step 4: Verify GI and DB patch levels $ORACLE_HOME/OPatch/opatch lsinventory $GI_HOME/OPatch/opatch lsinventory

Step 5 — Verifying Patch Levels Across All Components

After patching is complete, verify every component is at the expected version. Do not close the change ticket until all components are confirmed.

Verify all component patch levels # 1. Check DB node Exadata infrastructure version (run on each DB node) imageinfo # 2. Check all storage cell versions via dcli dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "imageinfo -ver" # Or via cellcli dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "cellcli -e LIST CELL ATTRIBUTES name, releaseVersion" # 3. Verify GI patch level $GI_HOME/OPatch/opatch lsinventory | grep -i "patch" # 4. Verify DB home patch level $ORACLE_HOME/OPatch/opatch lsinventory | grep -i "patch" # 5. Verify datapatch completed successfully sqlplus / as sysdba <<EOF SELECT action_time, action, status, description FROM dba_registry_sqlpatch ORDER BY action_time DESC FETCH FIRST 10 ROWS ONLY; EOF # 6. Check all cluster resources are running $GI_HOME/bin/crsctl status resource -t # 7. Verify all cells are running new software dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "cellcli -e LIST CELL ATTRIBUTES name, status, releaseVersion" # 8. Verify all griddisks are active after cell patching dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "cellcli -e LIST GRIDDISK WHERE status != 'active'"
Verify ASM is healthy after patching -- Connect to ASM and verify disk group health sqlplus / as sysasm <<EOF SELECT name, state, type, ROUND(total_mb / 1024, 1) AS total_gb, ROUND(free_mb / 1024, 1) AS free_gb FROM v$asm_diskgroup; -- Confirm no disks are in error state SELECT path, state, mode_status, total_mb FROM v$asm_disk WHERE state != 'NORMAL' OR mode_status != 'ONLINE'; -- Confirm no rebalance in progress SELECT * FROM v$asm_operation; EOF

Rolling Back a Cell Patch

If a storage cell patch causes issues, patchmgr supports rollback to the previous image. Rollback is only available when the cell was patched successfully — a cell that failed mid-patch cannot be rolled back and requires Oracle Support assistance.

Roll back storage cell patch # Step 1: Run rollback pre-check ./patchmgr \ -cells /opt/oracle.SupportTools/onecommand/cell_group \ -rollback_check_prereq # Step 2: Roll back in rolling mode (one cell at a time) ./patchmgr \ -cells /opt/oracle.SupportTools/onecommand/cell_group \ -rollback \ -rolling # Step 3: Clean up patchmgr state after rollback ./patchmgr \ -cells /opt/oracle.SupportTools/onecommand/cell_group \ -cleanup # Step 4: Verify cells are back at previous version dcli -g /opt/oracle.SupportTools/onecommand/cell_group \ "imageinfo -ver"

Firmware updates applied as part of the cell patch are not rolled back when rolling back to a previous software image. After rollback, if you need to revert firmware as well, Oracle Support will guide the firmware downgrade procedure. This is another reason to always test patches in a non-production environment before applying to production.

Exadata Patching Checklist

# Task Tool Done
1Read the MOS readme for DBBP and EXABP — note any special stepsMOS[ ]
2Download DBBP, EXABP, GI patch, DB CPU from MOSMOS[ ]
3Run ExaCheck and resolve all FAIL and WARNING findingsexachk[ ]
4Verify current version on all DB nodes — imageinfoimageinfo[ ]
5Verify current version on all cells — imageinfo -ver via dclidcli[ ]
6Verify ASM disk groups healthy — no errors, no rebalance in progressSQL[ ]
7Verify SSH key-based auth from primary DB node to all cellsdcli[ ]
8Take RMAN full backup of all databasesRMAN[ ]
9Patch network switches — patchmgr -switchespatchmgr[ ]
10Run patchmgr pre-check for cells — resolve any FAIL findingspatchmgr -precheck[ ]
11Patch storage cells — patchmgr -cells -rolling (or non-rolling)patchmgr[ ]
12Verify all cells at new version and all griddisks activedcli / cellcli[ ]
13Patch DB node infrastructure — patchmgr -dbnodes -rollingpatchmgr[ ]
14Verify all DB nodes rejoined cluster and databases runningcrsctl[ ]
15Apply GI patch — opatchautoOPatch[ ]
16Apply DB CPU patch — opatch apply on each DB homeOPatch[ ]
17Run datapatch -verbose and verify completiondatapatch[ ]
18Verify all component versions — imageinfo, opatch lsinventory, cellcliMultiple[ ]
19Run Smart Scan health check — confirm offload statistics healthyV$SYSSTAT[ ]
20Run ExaCheck again post-patch and confirm no new failuresexachk[ ]

Summary

  • DBBP patches the database server infrastructure — OS, firmware, Exadata tools. Applied with patchmgr -dbnodes.
  • EXABP patches storage cells — Oracle Linux, Exadata System Software, cellsrv, firmware. Applied with patchmgr -cells.
  • Correct patching order is always: switches → storage cells → DB node infrastructure → Grid Infrastructure → Oracle Database.
  • Rolling mode patches one component at a time while RAC databases stay online. Non-rolling patches all in parallel but requires database downtime. Non-rolling is the default for cells — specify -rolling explicitly for production.
  • patchmgr is run from the primary database node — it orchestrates SSH connections to all cells and handles the entire update process including reboot and post-patch verification.
  • OPatch and datapatch handle GI and Oracle Database software — the same process as any Oracle database, applied after the infrastructure layer is at the new version.
  • Always run ExaCheck before and after patching. Always take a full RMAN backup before starting. Always read the MOS readme for the specific patch bundle — it supersedes general guidance.

No comments: