Skip to content

ORA-00600 Internal Error - Oracle Support & Resolution Guide

Error Text: ORA-00600: internal error code, arguments: [string], [string], [string], [string], [string], [string], [string], [string]

The ORA-00600 error is Oracle’s generic internal error code that indicates a software bug or corruption within the Oracle kernel. This is a serious error that often requires Oracle Support assistance, but understanding the error structure and initial diagnostics can expedite resolution.

ORA-00600: internal error code, arguments: [kdsgrp1], [25012], [25017], [3], [148], [], [], []
^^^^^^^
First Argument (identifies error type)

The first argument is most important as it identifies the specific internal error condition.

ArgumentAreaDescription
kdsgrp1Data LayerRow piece issues
kkpofpdParserSQL parsing errors
qertbFetchByRowIDQueryRow fetch problems
kcratr1_lostwrtRecoveryLost write detection
kddummy_blkchkBlock CheckBlock corruption
2662SCNSCN issues
4194UndoUndo segment recovery
-- Check alert log for full error
SELECT originating_timestamp, message_text
FROM x$dbgalertext
WHERE message_text LIKE '%ORA-00600%'
AND originating_timestamp > SYSTIMESTAMP - INTERVAL '1' DAY
ORDER BY originating_timestamp DESC;
-- Find associated trace file
SELECT value || '/alert_' || instance_name || '.log' as alert_log
FROM v$parameter, v$instance
WHERE name = 'background_dump_dest';
-- Get trace file location
SELECT p.tracefile
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.sid = (SELECT sid FROM v$mystat WHERE rownum = 1);
-- Database version and patch level
SELECT * FROM v$version;
SELECT * FROM dba_registry_sqlpatch ORDER BY action_time DESC;
-- System information
SELECT dbid, name, platform_name, platform_id FROM v$database;
-- Recent DDL operations
SELECT owner, object_name, object_type, last_ddl_time
FROM dba_objects
WHERE last_ddl_time > SYSDATE - 1
ORDER BY last_ddl_time DESC;
Terminal window
# Using ADRCI to package incident
adrci
ADRCI> show homes
ADRCI> set home diag/rdbms/mydb/mydb
ADRCI> show incident
# Find ORA-600 incident
ADRCI> show incident -mode detail -p "error_text like '%ORA-00600%'"
# Create incident package
ADRCI> ips create package incident <incident_id>
ADRCI> ips generate package 1 in /tmp
-- Check for corruption
SELECT * FROM v$database_block_corruption;
-- Validate database structure
RMAN> VALIDATE DATABASE;
RMAN> VALIDATE CHECK LOGICAL DATABASE;
-- Check specific datafile
RMAN> VALIDATE DATAFILE 5;
-- Repair using RMAN
RMAN> BLOCKRECOVER CORRUPTION LIST;
-- Check undo segments
SELECT segment_name, status, tablespace_name
FROM dba_rollback_segs
WHERE status != 'ONLINE';
-- Create new undo tablespace
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/undotbs2_01.dbf' SIZE 2G;
-- Switch to new undo
ALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE=BOTH;
-- Drop corrupted undo
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
-- Identify corrupted indexes
ANALYZE TABLE schema.table_name VALIDATE STRUCTURE CASCADE;
-- Rebuild corrupted index
ALTER INDEX schema.index_name REBUILD ONLINE;
-- Or drop and recreate
DROP INDEX schema.index_name;
CREATE INDEX schema.index_name ON schema.table_name(column_name);
-- Flush shared pool
ALTER SYSTEM FLUSH SHARED_POOL;
-- Clear buffer cache
ALTER SYSTEM FLUSH BUFFER_CACHE;
-- Restart instance if necessary
SHUTDOWN IMMEDIATE;
STARTUP;
-- Gather key information for MOS search
SELECT
'ORA-00600 [' || argument1 || ']' as search_term,
version,
platform_name
FROM (
SELECT REGEXP_SUBSTR(message_text, '\[(.*?)\]', 1, 1, NULL, 1) as argument1
FROM x$dbgalertext
WHERE message_text LIKE '%ORA-00600%'
AND ROWNUM = 1
), v$version, v$database
WHERE banner LIKE 'Oracle Database%';

Search My Oracle Support (MOS) with:

  • Complete error message
  • First argument
  • Database version
  • Platform
-- Common bugs by version
-- 19c: Bug 30409864 - ORA-600 [kdsgrp1]
-- 12.2: Bug 26731663 - ORA-600 [kcratr_scan_lastbwr]
-- 12.1: Bug 19708342 - ORA-600 [qertbFetchByRowID]
-- Check installed patches
SELECT patch_id, action, status, description
FROM sys.dba_registry_sqlpatch
ORDER BY action_time DESC;
Terminal window
# Download patch from MOS
# Example: Patch 32218454 for 19c
# Apply using OPatch
cd $ORACLE_HOME
opatch lsinventory
opatch apply /tmp/patch_32218454
# For RAC
opatchauto apply /tmp/patch_32218454
-- Disable problematic features
ALTER SYSTEM SET "_fix_control"='27268249:OFF' SCOPE=BOTH;
-- Common workaround parameters
ALTER SYSTEM SET "_optimizer_adaptive_plans"=FALSE SCOPE=BOTH;
ALTER SYSTEM SET "_px_adaptive_dist_method"='OFF' SCOPE=BOTH;
-- Force different execution plan
ALTER SESSION SET optimizer_index_cost_adj = 10000;
-- Use hints to avoid problem
SELECT /*+ NO_INDEX(t idx_problem) */ *
FROM table_name t
WHERE conditions;
-- Create SQL Profile to fix plan
DECLARE
my_hint VARCHAR2(500);
BEGIN
my_hint := 'NO_INDEX(@"SEL$1" "TABLE_ALIAS"@"SEL$1" "INDEX_NAME")';
DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
sql_text => 'SELECT ...',
profile => SQLPROF_ATTR(my_hint),
name => 'PROFILE_ORA600_FIX'
);
END;
/
  1. Alert log - Complete error with timestamp
  2. Trace files - All related traces
  3. AWR report - Around error time
  4. RDA output - Remote Diagnostic Agent
  5. Test case - If reproducible
Problem Summary: ORA-00600 [first_argument]
Database Version: 19.12.0.0
Platform: Linux x86_64
Error Frequency: [Once/Intermittent/Frequent]
Business Impact: [Production down/Performance impact/Development blocked]
Error Details:
ORA-00600: internal error code, arguments: [complete_arguments]
Reproducible: [Yes/No]
If Yes: [Steps to reproduce]
Diagnostic Package: [Incident package uploaded]
-- Create health check procedure
CREATE OR REPLACE PROCEDURE db_health_check AS
BEGIN
-- Check for corruption
FOR corrupt IN (SELECT * FROM v$database_block_corruption) LOOP
DBMS_OUTPUT.PUT_LINE('Corruption found in file ' ||
corrupt.file# || ' block ' || corrupt.block#);
END LOOP;
-- Check alert log
FOR alert IN (
SELECT message_text
FROM x$dbgalertext
WHERE message_text LIKE 'ORA-%'
AND originating_timestamp > SYSTIMESTAMP - INTERVAL '1' DAY
) LOOP
DBMS_OUTPUT.PUT_LINE('Alert: ' || alert.message_text);
END LOOP;
END;
/
-- Schedule health check
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'DAILY_HEALTH_CHECK',
job_type => 'STORED_PROCEDURE',
job_action => 'db_health_check',
repeat_interval => 'FREQ=DAILY; BYHOUR=6',
enabled => TRUE
);
END;
/
-- Monitor for ORA-600 patterns
CREATE TABLE ora600_history (
error_date TIMESTAMP,
first_argument VARCHAR2(100),
full_error VARCHAR2(4000),
trace_file VARCHAR2(500)
);
-- Capture ORA-600 errors
CREATE OR REPLACE TRIGGER capture_ora600
AFTER SERVERERROR ON DATABASE
BEGIN
IF ora_is_servererror(600) THEN
INSERT INTO ora600_history VALUES (
SYSTIMESTAMP,
SUBSTR(ora_server_error_msg(1),
INSTR(ora_server_error_msg(1), '[') + 1,
INSTR(ora_server_error_msg(1), ']') -
INSTR(ora_server_error_msg(1), '[') - 1),
ora_server_error_msg(1),
NULL
);
COMMIT;
END IF;
END;
/
  • Note 153788.1 - ORA-600 Troubleshooting Tool
  • Note 1092832.1 - Master Note for ORA-600
  • Note 28184.1 - ORA-600 Argument Lookup
  1. Assess Impact

    SELECT COUNT(*) active_sessions FROM v$session WHERE status = 'ACTIVE';
  2. Capture Diagnostics

    Terminal window
    # Quick diagnostic collection
    sqlplus / as sysdba @?/rdbms/admin/hanganalyze.sql
    sqlplus / as sysdba @?/rdbms/admin/ashdump.sql
  3. Attempt Recovery

    -- If instance is hung
    ALTER SYSTEM CHECKPOINT;
    ALTER SYSTEM SWITCH LOGFILE;
    -- If corruption suspected
    ALTER SYSTEM SET DB_BLOCK_CHECKING = FULL SCOPE=MEMORY;
  4. Open Oracle SR

    • Severity 1 if production down
    • Upload incident package immediately
    • Provide business impact statement