Skip to content

Oracle DBA Issues and Solutions - Common Problems & Fixes

A quick reference guide to the most common Oracle database problems and their solutions. Each issue includes diagnostic queries and step-by-step fixes.


Quick Diagnosis:

-- Check top wait events
SELECT event, total_waits, time_waited_micro/1000000 as seconds
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited_micro DESC
FETCH FIRST 10 ROWS ONLY;
-- Find resource-intensive sessions
SELECT sid, serial#, username, sql_id, event, seconds_in_wait
FROM v$session
WHERE status = 'ACTIVE' AND type = 'USER'
ORDER BY seconds_in_wait DESC;

Solutions:

-- Sessions consuming most CPU
SELECT s.sid, s.serial#, s.username, s.program,
st.value/100 as cpu_seconds
FROM v$session s
JOIN v$sesstat st ON s.sid = st.sid
JOIN v$statname sn ON st.statistic# = sn.statistic#
WHERE sn.name = 'CPU used by this session'
ORDER BY st.value DESC
FETCH FIRST 10 ROWS ONLY;

Related: CPU Analysis Scripts


Quick Check:

SELECT tablespace_name,
ROUND(used_percent, 2) as pct_used,
ROUND((tablespace_size - used_space) * 8192/1024/1024, 2) as free_mb
FROM dba_tablespace_usage_metrics
WHERE used_percent > 85
ORDER BY used_percent DESC;

Solutions:

  1. Add datafile: ALTER TABLESPACE ts ADD DATAFILE '/path/file.dbf' SIZE 10G;
  2. Enable autoextend: ALTER DATABASE DATAFILE '/path/file.dbf' AUTOEXTEND ON;
  3. Identify large segments: dsegbig.sql

Related: Space Analysis Scripts

-- Check TEMP usage
SELECT tablespace_name, used_blocks, free_blocks
FROM v$temp_space_header;
-- Find sessions using TEMP
SELECT s.sid, s.serial#, s.username, u.blocks * 8/1024 as temp_mb
FROM v$session s
JOIN v$tempseg_usage u ON s.saddr = u.session_addr
ORDER BY u.blocks DESC;

Related: ORA-01652


ErrorQuick Fix
ORA-12154Check tnsnames.ora syntax
ORA-12541Start the listener: lsnrctl start
ORA-01034Start the database: startup
ORA-28000Unlock account: ALTER USER x ACCOUNT UNLOCK;
-- Check current vs max sessions
SELECT
(SELECT value FROM v$parameter WHERE name = 'sessions') as max_sessions,
(SELECT COUNT(*) FROM v$session) as current_sessions;
-- Sessions by program
SELECT program, COUNT(*) as count
FROM v$session
GROUP BY program
ORDER BY COUNT(*) DESC;

Related: ORA-00018 | ORA-00020


SELECT
blocker.sid as blocker_sid,
blocker.username as blocker_user,
waiting.sid as waiting_sid,
waiting.username as waiting_user,
waiting.event
FROM v$session waiting
JOIN v$session blocker ON waiting.blocking_session = blocker.sid
WHERE waiting.blocking_session IS NOT NULL;

Kill Blocking Session:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

Related: gvlockb.sql | ORA-00060


SELECT input_type, status, start_time, end_time
FROM v$rman_backup_job_details
WHERE start_time > SYSDATE - 7
ORDER BY start_time DESC;
-- Check FRA usage
SELECT * FROM v$flash_recovery_area_usage;
-- Delete obsolete backups
RMAN> DELETE OBSOLETE;

Related: ORA-19815 | FRA Scripts


-- Count invalid objects
SELECT object_type, COUNT(*)
FROM dba_objects
WHERE status = 'INVALID'
GROUP BY object_type;
-- Recompile all
EXEC UTL_RECOMP.RECOMP_PARALLEL(4);
-- Recompile specific schema
EXEC UTL_RECOMP.RECOMP_SERIAL('SCHEMA_NAME');

Related: dinvalid.sql


ErrorIssueQuick Fix
ORA-00001Duplicate keyCheck unique constraints
ORA-00904Invalid columnCheck column names
ORA-00942Table not foundCheck schema/grants
ORA-01000Too many cursorsIncrease OPEN_CURSORS
ORA-01403No data foundAdd exception handling
ORA-01555Snapshot too oldIncrease UNDO retention
ORA-04031Shared pool issueFlush or resize SGA

Daily checks for Oracle DBAs:

  1. Alert Log - Check for errors
  2. Tablespace Space - Verify free space > 15%
  3. Backup Status - Confirm successful completion
  4. Performance - Review wait events
  5. Invalid Objects - Recompile if needed

Scripts: Health Check Suite