Oracle monitoring is a stack of progressively deeper signals, each layer catching failure modes the layer below cannot see. Teams that jump from “is the instance up” directly to “ASH analysis” usually miss the middle, where the highest-frequency production incidents live.
This model maps four levels of monitoring maturity. It is a prioritization framework, not a tooling roadmap: which signals earn their place at each level, which failure modes they expose, and what blind spots remain if you stop there. Most production Oracle estates sit between Level 1 and Level 2, with a few critical Level 3 signals missing.
The model assumes a single-instance or RAC Enterprise Edition deployment. Standard Edition lacks AWR, ASH, and ADDM, which removes several Level 3 and Level 4 signals entirely. Signals requiring the Diagnostics Pack license are noted where they appear.
How to use this model
Read the levels cumulatively. Each level inherits everything below and adds new signals. Identify your current level honestly, then target the single highest-value gap in the level above. Do not implement a whole level at once.
The most common failure is not lack of sophistication. It is a gap in Level 1 or Level 2 that no Level 4 instrumentation compensates for. An unmonitored archive destination fills, the database hangs silently, and ASH cannot save you because the whole system is frozen on log file switch (archiving needed).
flowchart TD
L4["Level 4 - Expert
Plan stability, ASH, latch/mutex, RAC gc"]
L3["Level 3 - Mature
Blocking chains, TPS baseline, PGA,
SGA resize, Data Guard lag, growth projections"]
L2["Level 2 - Operational
Top wait events, redo switch frequency,
undo pressure, RMAN success"]
L1["Level 1 - Survival
Instance, listener, tablespace, archive, alert log"]
L1 --> L2 --> L3 --> L4Level 1: Survival
Minimum viable monitoring. If any of these are missing, you are operating blind. Most surprise outages trace back to a Level 1 gap nobody noticed.
Instance status. Query V$INSTANCE for STATUS = 'OPEN' and DATABASE_STATUS = 'ACTIVE'. Any other state in production is user impact. In RAC, check each instance independently and verify expected services are registered in V$ACTIVE_SERVICES.
Listener responsiveness. A TCP connect to port 1521 is not enough. The listener may accept the socket and then reject with TNS-12516 (no handler) or TNS-12519 (too many connections). A full sqlplus -L user/pass@//host:1521/service test exercises the full admission path: listener, service registration, handler availability, database responsiveness. Use a wallet or OS authentication in production; inline credentials are visible in the process list.
Tablespace utilization. Use DBA_TABLESPACE_USAGE_METRICS and alert on percentage of maximum capacity including autoextend. Raw DBA_FREE_SPACE hides autoextend headroom and can show “0 free” on a tablespace that still has room.
Archive destination space and status. The highest-value signal in Level 1 and the one most often missing. Query V$ARCHIVE_DEST_STATUS for any destination where STATUS != 'VALID', and alert on filesystem utilization at 85% and 95%. The database hangs silently when archiving stalls. Existing sessions freeze with no error returned, instance status stays OPEN, listener responds. Only cannot allocate new log in the alert log and the log file switch (archiving needed) wait event reveal it.
Alert log errors. Parse $ORACLE_BASE/diag/rdbms/<db_unique_name>/<instance_name>/trace/alert_<instance>.log, or query V$DIAG_ALERT_EXT. Triage by error code: ORA-00600 and ORA-07445 are always critical, ORA-04031 and ORA-01555 are urgent tuning signals, archiver destination errors and cannot allocate new log are imminent-hang warnings.
Last successful RMAN backup. Query V$RMAN_BACKUP_JOB_DETAILS for the most recent row with STATUS = 'COMPLETED'. A backup job that has failed silently for days means your RPO is effectively infinite.
If any of these six are missing, fix them before reading further.
Level 2: Operational
Signals a competent production team monitors to cover common failure modes. Teams below this level get caught off guard by the same incident classes repeatedly.
Top 5 wait events by time waited. The fastest triage signal in Oracle. Query V$SYSTEM_EVENT filtered to WAIT_CLASS != 'Idle'. The dominant wait class tells you where time goes: Commit means redo I/O, User I/O means storage, Concurrency means locks or latches, Application means enqueue waits from app logic.
Redo log switch frequency. Query V$LOG_HISTORY.FIRST_TIME grouped by hour. Properly sized redo logs switch fewer than 4 to 6 times per hour. More than one switch per minute almost guarantees checkpoint not complete issues and predicts archive path saturation before it becomes a hard outage.
Undo pressure. Query V$UNDOSTAT for SSOLDERRCNT (ORA-01555 count) and NOSPACEERRCNT (ORA-30036 count). Any non-zero NOSPACEERRCNT is a write-path failure. Any non-zero SSOLDERRCNT is a read-path failure. The leading indicator is UNXPSTEALCNT > 0: unexpired undo is being reclaimed, which precedes both errors.
Session and process utilization. Query V$RESOURCE_LIMIT for sessions and processes. Alert when CURRENT_UTILIZATION exceeds 85% of limit. Alert when MAX_UTILIZATION has ever equaled LIMIT_VALUE since startup. The 25% headroom matters: background processes, DBA sessions during incidents, and retry storms all need room.
RMAN backup failure rate. Beyond “last successful backup” from Level 1, track failure rate. A backup that completes with an anomalous COMPRESSION_RATIO or OUTPUT_BYTES near zero is a soft failure.
FRA utilization. Query V$RECOVERY_FILE_DEST. When SPACE_USED / SPACE_LIMIT exceeds 85%, the FRA is competing with archive logs, RMAN backups, and flashback logs for the same space. A full FRA cascades into an archive hang.
Lock wait detection. Query V$SESSION.BLOCKING_SESSION for any session blocked more than 2 minutes. Level 2 catches the symptom; Level 3 catches the root cause and chain depth.
Level 3: Mature
Full coverage with leading indicators and trend-based alerting. The shift from Level 2 to Level 3 is from threshold alerting to baseline deviation. Static thresholds on TPS, logical reads, and redo generation generate noise because these metrics are workload-dependent.
Blocking sessions with chain depth. At Level 2 you detect a blocked session. At Level 3 you trace the chain to the root blocker, who is typically INACTIVE with an uncommitted transaction. One idle session holding row locks can exhaust PROCESSES as connection pools spin up blocked connections. Alert on any blocker with more than 10 waiters or any chain growing more than 5 minutes.
TPS baseline deviation. Query V$SYSSTAT for user commits and user rollbacks, delta-compute TPS, and build a 7-day rolling baseline by hour of day. Alert on deviation more than 50% below baseline sustained more than 5 minutes during business hours. TPS near zero with stable application load is a database hang, lock cascade, or LGWR stall.
Redo generation rate. Delta-compute redo size from V$SYSSTAT. Trend it against redo log storage write throughput and archiver throughput. This is the leading indicator for archive destination exhaustion: if redo rate exceeds archive throughput, you can compute time-to-hang directly.
PGA aggregate utilization. Query V$PGASTAT for total PGA allocated, aggregate PGA target parameter, and over allocation count. Alert when allocated exceeds target, and when over allocation count grows. Hitting PGA_AGGREGATE_LIMIT on 12c+ raises ORA-04036 and kills sessions.
SGA component resize behavior. Query V$SGA_DYNAMIC_COMPONENTS and V$SGA_RESIZE_OPS. Oscillating resizes that grow the buffer cache and shrink the shared pool, then reverse, indicate SGA_TARGET is too small. Shared pool free memory below 5% predicts ORA-04031.
Data Guard transport and apply lag. Query V$DATAGUARD_STATS on the standby for transport lag and apply lag. Page when transport lag exceeds your RPO SLA. Ticket when apply lag exceeds your RTO SLA. Growing lag means the standby is not a reliable failover target.
Tablespace growth projections. Track used space per tablespace daily. Compute days_remaining = free_space / daily_growth_rate. The degradation curve is cliff-edge: normal operation until full, then ORA-01653 or ORA-01654 with no graceful degradation.
Checkpoint completion. Watch for Checkpoint not complete in the alert log and log file switch (checkpoint incomplete) waits in V$SYSTEM_EVENT. Recurring more than once per hour means redo logs are undersized or DBWn cannot keep up.
Level 4: Expert
Deep operational signals added after the third or fourth major incident. Most teams never reach Level 4 across the board. They reach it selectively for the failure modes their workload actually produces.
SQL plan stability. Query V$SQL for SQL_IDs with multiple PLAN_HASH_VALUE values. Track BUFFER_GETS / EXECUTIONS and ELAPSED_TIME / EXECUTIONS for your top 20 SQL_IDs. A more than 10x increase in per-execution cost after statistics gathering is a plan regression. Without SQL Plan Baselines (DBMS_SPM), regressions are inevitable.
ASH analysis. V$ACTIVE_SESSION_HISTORY samples active sessions every second and retains roughly 60 minutes in memory. AWR persists approximately 1 in 10 of those samples to DBA_HIST_ACTIVE_SESS_HISTORY. ASH is the only signal that reconstructs session-level load over time after an incident. Requires Diagnostics Pack license.
Latch and mutex contention. Query V$LATCH for SLEEPS / GETS ratio by latch name, and V$LATCH_MISSES and V$LATCH_HOLDER during active contention. High cache buffers chains latch contention indicates CPU-bound hot block access. library cache: mutex X and cursor: pin S wait on X indicate parsing pressure from literal SQL.
RAC global cache waits. Query V$SYSTEM_EVENT for events matching gc%. Average gc wait under 1ms indicates a healthy dedicated interconnect. More than 3ms sustained means congestion or workload not partitioned by service. More than 10ms means interconnect failure or failover to the public network. Verify with V$CLUSTER_INTERCONNECTS that Oracle is using the private network, not the public one.
PDB-level resource isolation. In multitenant deployments, monitor per-PDB resource usage and Resource Manager plans. Not all V$ views respect CON_ID filtering in all versions. Verify per-view in your version.
Block corruption checks. Query V$DATABASE_BLOCK_CORRUPTION after regular RMAN BACKUP VALIDATE CHECK LOGICAL DATABASE runs. Any non-zero row count is a data integrity incident. Distinguish NOLOGGING-induced corruption (ORA-01578 with ORA-26040) from physical corruption.
Signals that shift the most value between levels
| Signal | Level | Failure mode | Cost of missing |
|---|---|---|---|
| Archive destination space | 1 | Silent database hang | Total outage masquerading as “up” |
| Top 5 wait events | 2 | LGWR, storage, lock storms | Hours of guessing during incidents |
| Undo SSOLDERRCNT / NOSPACEERRCNT | 2 | ORA-01555 reads, ORA-30036 writes | Reports fail, then DML fails |
| Blocking chain depth | 3 | Lock contention cascade | One idle session exhausts PROCESSES |
| TPS baseline deviation | 3 | Hangs and slowdowns | Static thresholds noise or miss slow degradation |
| Plan stability per SQL_ID | 4 | Plan regression avalanche | Catastrophic slowdown minutes after stats gather |
| ASH | 4 | Post-incident root cause | Cannot reconstruct what happened |
| RAC gc waits | 4 | Interconnect congestion and failover | Cross-instance thrashing with no obvious cause |
Anti-patterns that block progression
Buffer cache hit ratio as a primary signal. A high ratio means nothing if log file sync is 50ms. Oracle performance methodology since 10g de-emphasizes hit ratios in favor of wait event analysis. Use the ratio as context, never as a primary alert.
Read-only health checks. A SELECT 1 FROM DUAL on a pooled connection can succeed while the database is hung on archiving. Health checks must exercise the write path: INSERT, COMMIT, DELETE, COMMIT against a health check table.
Static thresholds on workload-dependent metrics. TPS, logical reads, and redo generation generate noise during normal peaks and miss degradation during normal lows. Use baseline deviation.
RAC without workload affinity. Running the same workload across all RAC instances without service-based partitioning causes gc contention. Every instance fighting over the same hot blocks defeats the purpose of RAC.
How Netdata helps
Netdata collects Oracle signals at every level with per-second resolution. Several failure modes (archive hang, lock cascade, redo stall) develop in minutes, not hours.
- Level 1 and 2 signals in one correlated view. Instance status, listener responsiveness, tablespace utilization, archive destination, top wait events, and TPS appear alongside Linux-level signals like disk utilization, CPU saturation, and memory pressure. The archive hang pattern is visible as archive destination filling, redo log switch frequency climbing, and
log file syncrising simultaneously. - Baseline-aware alerting for workload-dependent metrics. TPS, logical reads, and redo generation need deviation from baseline, not static thresholds. Netdata’s anomaly detection reduces noise on these signals while still catching real degradation.
- Correlation across the stack. An Oracle slowdown often has an OS-level cause: redo log device latency from
iostat, OOM killer entries indmesg, or CPU ready time on VMware. Per-second host and database metrics in one timeline shorten the loop between symptom and root cause. - Blocking session and lock wait signals. Detecting a blocked session is Level 2. Tracing the chain to the root blocker is Level 3. Netdata surfaces both, with chain depth visible alongside session and process utilization against
PROCESSESlimits. - Data Guard and RAC coverage. Transport lag, apply lag, and per-instance gc wait times appear alongside primary workload metrics, so failover readiness and cluster health are not separate dashboards.
See Oracle Database monitoring with Netdata for the full integration.






