ORA-00600 Internal Error - Oracle Support & Resolution Guide
ORA-00600: Internal Error Code
Section titled “ORA-00600: Internal Error Code”Error Overview
Section titled “Error Overview”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.
Understanding ORA-00600
Section titled “Understanding ORA-00600”Error Structure
Section titled “Error Structure”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.
Common First Arguments
Section titled “Common First Arguments”Argument | Area | Description |
---|---|---|
kdsgrp1 | Data Layer | Row piece issues |
kkpofpd | Parser | SQL parsing errors |
qertbFetchByRowID | Query | Row fetch problems |
kcratr1_lostwrt | Recovery | Lost write detection |
kddummy_blkchk | Block Check | Block corruption |
2662 | SCN | SCN issues |
4194 | Undo | Undo segment recovery |
Initial Diagnostic Steps
Section titled “Initial Diagnostic Steps”1. Capture Error Details
Section titled “1. Capture Error Details”-- Check alert log for full errorSELECT originating_timestamp, message_textFROM x$dbgalertextWHERE message_text LIKE '%ORA-00600%' AND originating_timestamp > SYSTIMESTAMP - INTERVAL '1' DAYORDER BY originating_timestamp DESC;
-- Find associated trace fileSELECT value || '/alert_' || instance_name || '.log' as alert_logFROM v$parameter, v$instanceWHERE name = 'background_dump_dest';
-- Get trace file locationSELECT p.tracefileFROM v$session s, v$process pWHERE s.paddr = p.addr AND s.sid = (SELECT sid FROM v$mystat WHERE rownum = 1);
2. Gather Diagnostic Information
Section titled “2. Gather Diagnostic Information”-- Database version and patch levelSELECT * FROM v$version;SELECT * FROM dba_registry_sqlpatch ORDER BY action_time DESC;
-- System informationSELECT dbid, name, platform_name, platform_id FROM v$database;
-- Recent DDL operationsSELECT owner, object_name, object_type, last_ddl_timeFROM dba_objectsWHERE last_ddl_time > SYSDATE - 1ORDER BY last_ddl_time DESC;
3. Create Incident Package
Section titled “3. Create Incident Package”# Using ADRCI to package incidentadrci
ADRCI> show homesADRCI> set home diag/rdbms/mydb/mydbADRCI> show incident
# Find ORA-600 incidentADRCI> show incident -mode detail -p "error_text like '%ORA-00600%'"
# Create incident packageADRCI> ips create package incident <incident_id>ADRCI> ips generate package 1 in /tmp
Common ORA-00600 Scenarios
Section titled “Common ORA-00600 Scenarios”Scenario 1: Block Corruption [kdsgrp1]
Section titled “Scenario 1: Block Corruption [kdsgrp1]”-- Check for corruptionSELECT * FROM v$database_block_corruption;
-- Validate database structureRMAN> VALIDATE DATABASE;RMAN> VALIDATE CHECK LOGICAL DATABASE;
-- Check specific datafileRMAN> VALIDATE DATAFILE 5;
-- Repair using RMANRMAN> BLOCKRECOVER CORRUPTION LIST;
Scenario 2: Undo Corruption [4194]
Section titled “Scenario 2: Undo Corruption [4194]”-- Check undo segmentsSELECT segment_name, status, tablespace_nameFROM dba_rollback_segsWHERE status != 'ONLINE';
-- Create new undo tablespaceCREATE UNDO TABLESPACE undotbs2DATAFILE '/u01/oradata/undotbs2_01.dbf' SIZE 2G;
-- Switch to new undoALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE=BOTH;
-- Drop corrupted undoDROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
Scenario 3: Index Corruption
Section titled “Scenario 3: Index Corruption”-- Identify corrupted indexesANALYZE TABLE schema.table_name VALIDATE STRUCTURE CASCADE;
-- Rebuild corrupted indexALTER INDEX schema.index_name REBUILD ONLINE;
-- Or drop and recreateDROP INDEX schema.index_name;CREATE INDEX schema.index_name ON schema.table_name(column_name);
Scenario 4: Memory Corruption
Section titled “Scenario 4: Memory Corruption”-- Flush shared poolALTER SYSTEM FLUSH SHARED_POOL;
-- Clear buffer cacheALTER SYSTEM FLUSH BUFFER_CACHE;
-- Restart instance if necessarySHUTDOWN IMMEDIATE;STARTUP;
Resolution Approaches
Section titled “Resolution Approaches”1. Search Oracle Support
Section titled “1. Search Oracle Support”-- Gather key information for MOS searchSELECT 'ORA-00600 [' || argument1 || ']' as search_term, version, platform_nameFROM ( 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$databaseWHERE banner LIKE 'Oracle Database%';
Search My Oracle Support (MOS) with:
- Complete error message
- First argument
- Database version
- Platform
2. Apply Known Fixes
Section titled “2. Apply Known Fixes”Check for Known Bugs
Section titled “Check for Known Bugs”-- 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 patchesSELECT patch_id, action, status, descriptionFROM sys.dba_registry_sqlpatchORDER BY action_time DESC;
Apply Patches
Section titled “Apply Patches”# Download patch from MOS# Example: Patch 32218454 for 19c
# Apply using OPatchcd $ORACLE_HOMEopatch lsinventoryopatch apply /tmp/patch_32218454
# For RACopatchauto apply /tmp/patch_32218454
3. Workarounds
Section titled “3. Workarounds”Disable Features Temporarily
Section titled “Disable Features Temporarily”-- Disable problematic featuresALTER SYSTEM SET "_fix_control"='27268249:OFF' SCOPE=BOTH;
-- Common workaround parametersALTER SYSTEM SET "_optimizer_adaptive_plans"=FALSE SCOPE=BOTH;ALTER SYSTEM SET "_px_adaptive_dist_method"='OFF' SCOPE=BOTH;
Change Execution Plans
Section titled “Change Execution Plans”-- Force different execution planALTER SESSION SET optimizer_index_cost_adj = 10000;
-- Use hints to avoid problemSELECT /*+ NO_INDEX(t idx_problem) */ *FROM table_name tWHERE conditions;
-- Create SQL Profile to fix planDECLARE 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;/
Creating Oracle SR
Section titled “Creating Oracle SR”Information to Gather
Section titled “Information to Gather”- Alert log - Complete error with timestamp
- Trace files - All related traces
- AWR report - Around error time
- RDA output - Remote Diagnostic Agent
- Test case - If reproducible
SR Template
Section titled “SR Template”Problem Summary: ORA-00600 [first_argument]
Database Version: 19.12.0.0Platform: 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]
Preventive Measures
Section titled “Preventive Measures”Regular Health Checks
Section titled “Regular Health Checks”-- Create health check procedureCREATE OR REPLACE PROCEDURE db_health_check ASBEGIN -- 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 checkBEGIN 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;/
Proactive Monitoring
Section titled “Proactive Monitoring”-- Monitor for ORA-600 patternsCREATE TABLE ora600_history ( error_date TIMESTAMP, first_argument VARCHAR2(100), full_error VARCHAR2(4000), trace_file VARCHAR2(500));
-- Capture ORA-600 errorsCREATE OR REPLACE TRIGGER capture_ora600AFTER SERVERERROR ON DATABASEBEGIN 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;/
Related Resources
Section titled “Related Resources”Oracle Support Notes
Section titled “Oracle Support Notes”- Note 153788.1 - ORA-600 Troubleshooting Tool
- Note 1092832.1 - Master Note for ORA-600
- Note 28184.1 - ORA-600 Argument Lookup
Related Errors
Section titled “Related Errors”- ORA-07445 - Exception encountered
- ORA-00604 - Error occurred at recursive SQL level
- ORA-03113 - End of file on communication channel
Emergency Actions
Section titled “Emergency Actions”Critical Response Steps
Section titled “Critical Response Steps”-
Assess Impact
SELECT COUNT(*) active_sessions FROM v$session WHERE status = 'ACTIVE'; -
Capture Diagnostics
Terminal window # Quick diagnostic collectionsqlplus / as sysdba @?/rdbms/admin/hanganalyze.sqlsqlplus / as sysdba @?/rdbms/admin/ashdump.sql -
Attempt Recovery
-- If instance is hungALTER SYSTEM CHECKPOINT;ALTER SYSTEM SWITCH LOGFILE;-- If corruption suspectedALTER SYSTEM SET DB_BLOCK_CHECKING = FULL SCOPE=MEMORY; -
Open Oracle SR
- Severity 1 if production down
- Upload incident package immediately
- Provide business impact statement