Oracle DBA - Exadata / Engineered Systems
Health, storage-cell visibility, IORM/Smart-Scan/flash diagnostics, patch readiness, and
the plan-only Tier-3 runbooks for Oracle Exadata Database Machine (19c and 23ai; EE;
single-instance and Data Guard; on-prem). Two mechanisms by design:
- In-DB work (offload stats, ASM headroom, DBRM plans, CELL_FLASH_CACHE attributes)
runs through the SQLcl MCP saved connection
dba_ai_conn → sql/*.sql ("sqlcl-mcp").
- Host work (exachk/AHF,
cellcli/dcli, patchmgr) cannot go through SQLcl MCP
(restrict level 4) → .sh/.ps1 ("script", to later front a guarded oracle-dba-ops MCP).
Everything self-executing is T1 (observe) or T2 (reversible, dry-run-default). Every
cell/switch/compute patch apply, storage-cell mutation, cell IORMPLAN config,
cell flash-cache tuning, and rack expansion is T3 and lives only in
references/runbooks.md — it prints commands for a human and never self-executes.
Scope & risk map
| Task |
Level |
Tier |
Mechanism (script / sql / runbook path) |
Idempotent? |
| Exachk / health check execution (exachk/AHF + in-DB summary) |
L2 |
T1 |
scripts/run_exachk.sh / .ps1 ("script") + sql/exadata_health_summary.sql ("sqlcl-mcp") |
yes — read-only; run-in-progress lock no-ops; failing best practice = finding |
| In-DB Exadata health & cell-visibility summary |
L2 |
T1 |
sql/exadata_health_summary.sql ("sqlcl-mcp") |
yes — read-only |
| Storage-cell status (read-only management visibility) |
L3 |
T1 |
scripts/cell_status.sh / .ps1 ("script", cellcli/dcli LIST) |
yes — read-only; off-cluster no-ops |
| IORM visibility (cell IORMPLAN + in-DB DBRM) |
L3 |
T1 |
scripts/iorm_status.sh / .ps1 ("script") + sql/iorm_status.sql ("sqlcl-mcp") |
yes — read-only |
| Smart Scan / flash-cache diagnostics |
L3 |
T1 |
sql/smartscan_diagnostics.sql ("sqlcl-mcp") |
yes — read-only |
| Expansion / capacity readiness (pre-flight facts) |
L3 |
T1 |
sql/expansion_readiness.sql ("sqlcl-mcp") |
yes — read-only |
| Exadata patch READINESS PRECHECK (cells/switch/compute) |
L2 |
T2 |
scripts/patch_precheck.sh / .ps1 ("script", patchmgr -precheck only) |
yes — precheck is read-only/repeatable; refuses to apply |
| In-DB DBRM plan activation (in-DB half of IORM) |
L3 |
T2 |
scripts/dbrm_plan_apply.sh / .ps1 ("script") + sql/dbrm_plan_apply.sql ("sqlcl-mcp") |
yes — already-active → noop; plan-not-found → blocked |
| Smart Flash Cache segment hint (CELL_FLASH_CACHE KEEP/DEFAULT/NONE) |
L3 |
T2 |
scripts/flashcache_hint.sh / .ps1 ("script") + sql/flashcache_hint_apply.sql ("sqlcl-mcp") |
yes — attribute already set → noop; metadata-only |
| Exadata patching APPLY (cells / IB-RoCE switches / compute + GI/RDBMS) |
L2/L3 |
T3 |
references/runbooks.md#exadata-patching |
no — reboots components; rolling per cell/node |
| Storage-cell management (griddisk/celldisk/disk/firmware) |
L3 |
T3 |
references/runbooks.md#cell-management |
no — DROP GRIDDISK is data-destructive |
| IORM configuration (cell IORMPLAN + DBRM plan DEFINITION) |
L3 |
T3 |
references/runbooks.md#iorm-config |
no — reshapes I/O priorities estate-wide |
| Smart Scan / flash-cache tuning (cell-side CREATE/ALTER FLASHCACHE) |
L3 |
T3 |
references/runbooks.md#flashcache-tuning |
no — drops cached/dirty data (flush first) |
| Exadata expansion / rack scale-out (add cells/nodes + ASM rebalance) |
L3 |
T3 |
references/runbooks.md#expansion |
partial — readiness repeatable; compatible.* raise is one-way |
Preconditions
- SQLcl MCP connection
dba_ai_conn is reachable and wallet-backed. All in-DB
prechecks, postchecks, idempotency probes, and sql/*.sql run through it via
connect_db / Connect-Db. Never SYS/SYSTEM — except inside a T3 runbook that
explicitly states AS SYSDBA / AS SYSASM (e.g. ASM ALTER DISKGROUP), supplied
interactively by the operator.
- Secrets resolve from the Oracle Wallet / external password store. No plaintext
anywhere. Host tools (
patchmgr, cellcli, dcli, exadcli, ahfctl, asmcmd,
srvctl) use OS / key-based SSH set up out of band — never a password on argv. The
shared helpers reject credential-looking arguments with ERR_SECRET (8).
- Helpers are sourced from
_common (scripts/lib.sh / lib.ps1): connect_db,
log_event, emit_metric, require_dry_run, guard_blocked_dry_run,
require_approval_token, precheck, postcheck, print_banner. Not reinvented.
- Host reachability: cell/IORM/patch scripts need a node from which
cellcli/dcli/
patchmgr can reach the cells/switches/db-nodes via SSH keys, with the group files
(cell_group, ibswitch_group, dbs_group) present. Off-cluster, the read-only
scripts log noop and fall back to the in-DB summary.
- Logging: structured
key=value lines to the canonical paths
/var/log/oracle-dba/exadata/exadata.log (Linux) /
C:/ProgramData/oracle-dba/logs/exadata/exadata.log (Windows); skill segment exadata.
- T2 dry-run default: every T2 script previews and changes nothing unless given
--execute. patch_precheck additionally REFUSES to apply patches even with --execute
(it only runs patchmgr -precheck); the apply is T3.
Procedures
Scripts ship as behaviour-equivalent .sh (Linux) / .ps1 (Windows) pairs. T2 scripts
default to --dry-run; pass --execute to act. See each script's --help.
Exadata health check (exachk / AHF) — T1
- Trigger: weekly best-practice health check; before/after any cell/patch/expansion work.
- Precheck:
dba_ai_conn reachable (for the in-DB summary half).
- Action:
scripts/run_exachk.sh --silent / .ps1 -Silent ("script") + sql/exadata_health_summary.sql ("sqlcl-mcp"). --skip-indb for host-only.
- Postcheck: n/a — emits metrics (cell_count, asm headroom, rebalance) + report path; a failing best practice is a finding, not a failure.
- Rollback note: none — read-only.
Storage-cell status — T1
- Trigger: daily; investigating a non-NORMAL disk or a critical cell alert.
- Precheck: none (read-only); auto-detects the cell group / runner.
- Action:
scripts/cell_status.sh [--detail] / .ps1 [-Detail] ("script", cellcli/dcli LIST only).
- Postcheck: n/a — surfaces unexamined critical alerts + non-NORMAL griddisks as findings.
- Rollback note: none — read-only. Cell mutation is T3
#cell-management.
IORM visibility — T1
- Trigger: confirm the active IORM/DBRM picture across cells + DB.
- Precheck:
dba_ai_conn reachable (in-DB half).
- Action:
scripts/iorm_status.sh / .ps1 ("script", cell LIST IORMPLAN) + sql/iorm_status.sql ("sqlcl-mcp").
- Postcheck: n/a — read-only.
- Rollback note: none. Cell IORMPLAN config is T3
#iorm-config; activating an existing DBRM plan is the T2 below.
Smart Scan / flash & expansion diagnostics — T1
- Trigger: "why am I (not) getting Smart Scan/flash benefit?" / pre-expansion fact-finding.
- Precheck:
dba_ai_conn reachable.
- Action:
sql/smartscan_diagnostics.sql / sql/expansion_readiness.sql ("sqlcl-mcp").
- Postcheck: n/a — read-only; emits offload/headroom KEYVAL metrics.
- Rollback note: none — read-only.
Exadata patch readiness PRECHECK — T2
- Trigger: before a quarterly image/RU; validate a component CAN be patched.
- Precheck: component valid; on
--execute, patchmgr present + patch dir / target list exist.
- Action:
scripts/patch_precheck.sh --component cells|switch|compute [--patch-dir DIR] [--target-list FILE] --execute / .ps1 ("script"). Dry-run prints the exact patchmgr -precheck command; --execute runs the precheck (still non-destructive).
- Postcheck: precheck output reports READY (no FAILED/ERROR).
- Rollback note: none — precheck never applies. The APPLY is T3
#exadata-patching.
In-DB DBRM plan activation — T2
- Trigger: switch the active in-DB resource plan (the in-DB half of IORM on Exadata).
- Precheck:
dba_ai_conn reachable; the requested plan must already EXIST (else blocked).
- Action:
scripts/dbrm_plan_apply.sh --plan NAME --execute / .ps1 -Plan NAME --execute ("script") + sql/dbrm_plan_apply.sql ("sqlcl-mcp"). Dry-run reports the current plan only.
- Postcheck: requested plan is the active top plan (or already-active no-op).
- Rollback note: reversible — re-activate the previous plan (printed). Creating/altering a plan DEFINITION is T3
#iorm-config.
Smart Flash Cache segment hint — T2
- Trigger: pin a hot small table/index in flash (KEEP) or release it (DEFAULT/NONE).
- Precheck:
dba_ai_conn reachable; owner/table valid; mode in KEEP|DEFAULT|NONE.
- Action:
scripts/flashcache_hint.sh --owner O --table T --mode KEEP --execute / .ps1 -Owner O -Table T -Mode KEEP --execute ("script") + sql/flashcache_hint_apply.sql ("sqlcl-mcp").
- Postcheck:
CELL_FLASH_CACHE attribute equals the requested mode.
- Rollback note: reversible — set
--mode DEFAULT. Cell-side flash sizing/mode is T3 #flashcache-tuning.
Tier-3 runbooks
All destructive Exadata work is Tier 3 and lives in references/runbooks.md:
#exadata-patching (cell/switch/compute apply + GI/RDBMS/datapatch),
#cell-management (griddisk/celldisk/disk/firmware), #iorm-config (cell IORMPLAN + DBRM
plan DDL), #flashcache-tuning (cell flash cache CREATE/ALTER/DROP), and #expansion
(add cells/nodes + ASM rebalance).
These runbooks PRINT exact cellcli/patchmgr/ASM/SQL commands for a human operator and
NEVER self-execute. They are gated by require_approval_token / Require-ApprovalToken:
an automated agent's only sanctioned action is to print the relevant section and stop with
ERR_APPROVAL (6) until a human supplies a real change ticket/token (--token <TICKET> or
ODB_APPROVAL_TOKEN; placeholders are rejected). The T2 scripts deliberately refuse the
destructive paths (patch_precheck never applies; the wrappers never define plans or touch
cell hardware) and point to the runbook instead. SYSDBA / SYSASM is a T3-only,
interactively-supplied exception. When in doubt, runbook.
See references/version-notes.md for 19c-vs-23ai (and Exadata-image) behavioural deltas,
and cron/crontab.d / cron/task-scheduler.xml for the schedulable T1/T2 jobs.
1---2name: oracle-dba-exadata-engineered-systems3description: USE THIS SKILL WHENEVER the user mentions Exadata, Exadata Database Machine, Engineered Systems, storage cells / cellcli / dcli / griddisk / celldisk / physicaldisk, Smart Scan / cell offload / storage index, Exadata Smart Flash Cache / flash log / CELL_FLASH_CACHE, IORM / IO Resource Manager / IORMPLAN, exachk / AHF / TFA on Exadata, patchmgr / Exadata patching (cells, RoCE/InfiniBand switches, compute/db nodes, image/RU), Exadata expansion / rack scale-out / add cells / ASM rebalance on Exadata, Exadata Cloud@Customer storage cells, or Exadata-side ASM disk-group / failgroup work — EVEN IF they do not name the specific task. Covers (T1) exachk/AHF health + in-DB cell visibility, cell-status LIST, IORM/DBRM read, Smart Scan / flash / expansion diagnostics; (T2, --dry-run default) patchmgr PRECHECK, in-DB DBRM plan activation, and the CELL_FLASH_CACHE segment hint; and (T3, runbook-only) cell/switch/compute patch APPLY, storage-cell management, cell IORMPLAN configuration, cell flash-cache tuning, and rack ex4---5# Oracle DBA - Exadata / Engineered Systems67Health, storage-cell visibility, IORM/Smart-Scan/flash diagnostics, patch readiness, and8the plan-only Tier-3 runbooks for Oracle Exadata Database Machine (19c and 23ai; EE;9single-instance and Data Guard; on-prem). Two mechanisms by design:1011- **In-DB** work (offload stats, ASM headroom, DBRM plans, CELL_FLASH_CACHE attributes)12 runs through the **SQLcl MCP** saved connection `dba_ai_conn` → `sql/*.sql` ("sqlcl-mcp").13- **Host** work (exachk/AHF, `cellcli`/`dcli`, `patchmgr`) **cannot** go through SQLcl MCP14 (restrict level 4) → `.sh`/`.ps1` ("script", to later front a guarded oracle-dba-ops MCP).1516Everything self-executing is **T1 (observe)** or **T2 (reversible, dry-run-default)**. Every17cell/switch/compute **patch apply**, **storage-cell mutation**, **cell IORMPLAN config**,18**cell flash-cache tuning**, and **rack expansion** is **T3** and lives only in19`references/runbooks.md` — it prints commands for a human and never self-executes.2021## Scope & risk map2223| Task | Level | Tier | Mechanism (script / sql / runbook path) | Idempotent? |24|------|-------|------|------------------------------------------|-------------|25| Exachk / health check execution (exachk/AHF + in-DB summary) | L2 | T1 | `scripts/run_exachk.sh` / `.ps1` ("script") + `sql/exadata_health_summary.sql` ("sqlcl-mcp") | yes — read-only; run-in-progress lock no-ops; failing best practice = finding |26| In-DB Exadata health & cell-visibility summary | L2 | T1 | `sql/exadata_health_summary.sql` ("sqlcl-mcp") | yes — read-only |27| Storage-cell status (read-only management visibility) | L3 | T1 | `scripts/cell_status.sh` / `.ps1` ("script", cellcli/dcli LIST) | yes — read-only; off-cluster no-ops |28| IORM visibility (cell IORMPLAN + in-DB DBRM) | L3 | T1 | `scripts/iorm_status.sh` / `.ps1` ("script") + `sql/iorm_status.sql` ("sqlcl-mcp") | yes — read-only |29| Smart Scan / flash-cache diagnostics | L3 | T1 | `sql/smartscan_diagnostics.sql` ("sqlcl-mcp") | yes — read-only |30| Expansion / capacity readiness (pre-flight facts) | L3 | T1 | `sql/expansion_readiness.sql` ("sqlcl-mcp") | yes — read-only |31| Exadata patch READINESS PRECHECK (cells/switch/compute) | L2 | T2 | `scripts/patch_precheck.sh` / `.ps1` ("script", patchmgr `-precheck` only) | yes — precheck is read-only/repeatable; refuses to apply |32| In-DB DBRM plan activation (in-DB half of IORM) | L3 | T2 | `scripts/dbrm_plan_apply.sh` / `.ps1` ("script") + `sql/dbrm_plan_apply.sql` ("sqlcl-mcp") | yes — already-active → noop; plan-not-found → blocked |33| Smart Flash Cache segment hint (CELL_FLASH_CACHE KEEP/DEFAULT/NONE) | L3 | T2 | `scripts/flashcache_hint.sh` / `.ps1` ("script") + `sql/flashcache_hint_apply.sql` ("sqlcl-mcp") | yes — attribute already set → noop; metadata-only |34| Exadata patching APPLY (cells / IB-RoCE switches / compute + GI/RDBMS) | L2/L3 | **T3** | `references/runbooks.md#exadata-patching` | no — reboots components; rolling per cell/node |35| Storage-cell management (griddisk/celldisk/disk/firmware) | L3 | **T3** | `references/runbooks.md#cell-management` | no — DROP GRIDDISK is data-destructive |36| IORM configuration (cell IORMPLAN + DBRM plan DEFINITION) | L3 | **T3** | `references/runbooks.md#iorm-config` | no — reshapes I/O priorities estate-wide |37| Smart Scan / flash-cache tuning (cell-side CREATE/ALTER FLASHCACHE) | L3 | **T3** | `references/runbooks.md#flashcache-tuning` | no — drops cached/dirty data (flush first) |38| Exadata expansion / rack scale-out (add cells/nodes + ASM rebalance) | L3 | **T3** | `references/runbooks.md#expansion` | partial — readiness repeatable; `compatible.*` raise is one-way |3940## Preconditions4142- **SQLcl MCP connection `dba_ai_conn`** is reachable and wallet-backed. All in-DB43 prechecks, postchecks, idempotency probes, and `sql/*.sql` run through it via44 `connect_db` / `Connect-Db`. Never SYS/SYSTEM — except inside a T3 runbook that45 explicitly states `AS SYSDBA` / `AS SYSASM` (e.g. ASM `ALTER DISKGROUP`), supplied46 interactively by the operator.47- **Secrets resolve from the Oracle Wallet / external password store. No plaintext48 anywhere.** Host tools (`patchmgr`, `cellcli`, `dcli`, `exadcli`, `ahfctl`, `asmcmd`,49 `srvctl`) use OS / key-based SSH set up out of band — never a password on argv. The50 shared helpers reject credential-looking arguments with `ERR_SECRET` (8).51- **Helpers are sourced from `_common`** (`scripts/lib.sh` / `lib.ps1`): `connect_db`,52 `log_event`, `emit_metric`, `require_dry_run`, `guard_blocked_dry_run`,53 `require_approval_token`, `precheck`, `postcheck`, `print_banner`. Not reinvented.54- **Host reachability**: cell/IORM/patch scripts need a node from which `cellcli`/`dcli`/55 `patchmgr` can reach the cells/switches/db-nodes via SSH keys, with the group files56 (`cell_group`, `ibswitch_group`, `dbs_group`) present. Off-cluster, the read-only57 scripts log `noop` and fall back to the in-DB summary.58- **Logging**: structured `key=value` lines to the canonical paths59 `/var/log/oracle-dba/exadata/exadata.log` (Linux) /60 `C:/ProgramData/oracle-dba/logs/exadata/exadata.log` (Windows); skill segment `exadata`.61- **T2 dry-run default**: every T2 script previews and changes nothing unless given62 `--execute`. `patch_precheck` additionally REFUSES to apply patches even with `--execute`63 (it only runs `patchmgr -precheck`); the apply is T3.6465## Procedures6667Scripts ship as behaviour-equivalent `.sh` (Linux) / `.ps1` (Windows) pairs. T2 scripts68default to `--dry-run`; pass `--execute` to act. See each script's `--help`.6970### Exadata health check (exachk / AHF) — T171- **Trigger**: weekly best-practice health check; before/after any cell/patch/expansion work.72- **Precheck**: `dba_ai_conn` reachable (for the in-DB summary half).73- **Action**: `scripts/run_exachk.sh --silent` / `.ps1 -Silent` ("script") + `sql/exadata_health_summary.sql` ("sqlcl-mcp"). `--skip-indb` for host-only.74- **Postcheck**: n/a — emits metrics (cell_count, asm headroom, rebalance) + report path; a failing best practice is a finding, not a failure.75- **Rollback note**: none — read-only.7677### Storage-cell status — T178- **Trigger**: daily; investigating a non-NORMAL disk or a critical cell alert.79- **Precheck**: none (read-only); auto-detects the cell group / runner.80- **Action**: `scripts/cell_status.sh [--detail]` / `.ps1 [-Detail]` ("script", cellcli/dcli LIST only).81- **Postcheck**: n/a — surfaces unexamined critical alerts + non-NORMAL griddisks as findings.82- **Rollback note**: none — read-only. Cell mutation is T3 `#cell-management`.8384### IORM visibility — T185- **Trigger**: confirm the active IORM/DBRM picture across cells + DB.86- **Precheck**: `dba_ai_conn` reachable (in-DB half).87- **Action**: `scripts/iorm_status.sh` / `.ps1` ("script", cell `LIST IORMPLAN`) + `sql/iorm_status.sql` ("sqlcl-mcp").88- **Postcheck**: n/a — read-only.89- **Rollback note**: none. Cell IORMPLAN config is T3 `#iorm-config`; activating an existing DBRM plan is the T2 below.9091### Smart Scan / flash & expansion diagnostics — T192- **Trigger**: "why am I (not) getting Smart Scan/flash benefit?" / pre-expansion fact-finding.93- **Precheck**: `dba_ai_conn` reachable.94- **Action**: `sql/smartscan_diagnostics.sql` / `sql/expansion_readiness.sql` ("sqlcl-mcp").95- **Postcheck**: n/a — read-only; emits offload/headroom KEYVAL metrics.96- **Rollback note**: none — read-only.9798### Exadata patch readiness PRECHECK — T299- **Trigger**: before a quarterly image/RU; validate a component CAN be patched.100- **Precheck**: component valid; on `--execute`, patchmgr present + patch dir / target list exist.101- **Action**: `scripts/patch_precheck.sh --component cells|switch|compute [--patch-dir DIR] [--target-list FILE] --execute` / `.ps1` ("script"). Dry-run prints the exact `patchmgr -precheck` command; `--execute` runs the precheck (still non-destructive).102- **Postcheck**: precheck output reports READY (no FAILED/ERROR).103- **Rollback note**: none — precheck never applies. The APPLY is T3 `#exadata-patching`.104105### In-DB DBRM plan activation — T2106- **Trigger**: switch the active in-DB resource plan (the in-DB half of IORM on Exadata).107- **Precheck**: `dba_ai_conn` reachable; the requested plan must already EXIST (else blocked).108- **Action**: `scripts/dbrm_plan_apply.sh --plan NAME --execute` / `.ps1 -Plan NAME --execute` ("script") + `sql/dbrm_plan_apply.sql` ("sqlcl-mcp"). Dry-run reports the current plan only.109- **Postcheck**: requested plan is the active top plan (or already-active no-op).110- **Rollback note**: reversible — re-activate the previous plan (printed). Creating/altering a plan DEFINITION is T3 `#iorm-config`.111112### Smart Flash Cache segment hint — T2113- **Trigger**: pin a hot small table/index in flash (KEEP) or release it (DEFAULT/NONE).114- **Precheck**: `dba_ai_conn` reachable; owner/table valid; mode in KEEP|DEFAULT|NONE.115- **Action**: `scripts/flashcache_hint.sh --owner O --table T --mode KEEP --execute` / `.ps1 -Owner O -Table T -Mode KEEP --execute` ("script") + `sql/flashcache_hint_apply.sql` ("sqlcl-mcp").116- **Postcheck**: `CELL_FLASH_CACHE` attribute equals the requested mode.117- **Rollback note**: reversible — set `--mode DEFAULT`. Cell-side flash sizing/mode is T3 `#flashcache-tuning`.118119## Tier-3 runbooks120121All **destructive Exadata work** is Tier 3 and lives in **`references/runbooks.md`**:122`#exadata-patching` (cell/switch/compute apply + GI/RDBMS/datapatch),123`#cell-management` (griddisk/celldisk/disk/firmware), `#iorm-config` (cell IORMPLAN + DBRM124plan DDL), `#flashcache-tuning` (cell flash cache CREATE/ALTER/DROP), and `#expansion`125(add cells/nodes + ASM rebalance).126127These runbooks **PRINT exact cellcli/patchmgr/ASM/SQL commands for a human operator and128NEVER self-execute.** They are gated by `require_approval_token` / `Require-ApprovalToken`:129an automated agent's only sanctioned action is to print the relevant section and stop with130`ERR_APPROVAL` (6) until a human supplies a real change ticket/token (`--token <TICKET>` or131`ODB_APPROVAL_TOKEN`; placeholders are rejected). The T2 scripts deliberately refuse the132destructive paths (`patch_precheck` never applies; the wrappers never define plans or touch133cell hardware) and point to the runbook instead. SYSDBA / SYSASM is a T3-only,134interactively-supplied exception. When in doubt, runbook.135136See `references/version-notes.md` for 19c-vs-23ai (and Exadata-image) behavioural deltas,137and `cron/crontab.d` / `cron/task-scheduler.xml` for the schedulable T1/T2 jobs.