Subject: ORA-00600 [12235] Content Type: TEXT/PLAIN Creation Date: 20-JAN-1996 [12235] This internal error is because a background process is not correctly invoked hence terminated. That means the type of the detached process cannot be determined. The detached process is one of the following: 1. detached background processes - pmon, smon, dbwr etc. 2. multi-threaded server 3. dispatcher 4. query server (since version 7.1.x) then this [12235] internal error occurs with the sga dump for debugging in the trace file. This internal error is not database corruption error. Code: opirip module is to handle the oracle program interface: if (ksbgpd()) { /* I am detached process */ ksbrdp(); /* run detached process */ } else if (kmmsts()) /* starting up server */ ... else if (kmmstd()) /* starting up dispatcher */ { /* this is a dispatcher */ err = kmmrdp(); /* run the dispatcher */ if (err) ksesec0(OER(err)); } else if (kxfpsqs()) kxfprdp(); /* run query server */ else { /* If you're debugging this, ** look in the sga for ksbsga ** and see why it was all zero */ if (ksmmpd) { ksdwrf( "SSP:\n----- Dump of the SGA -----\n" ); ksddmp((ptr_t)&ksmsgf, (size_t)((ub1 *)(&ksmsgl+1) - (ub1 *)&ksmsgf)); } ksesic0(OERI(12235)); } Known problem: * Many bugs has been reported about this internal error but not reproducible. * The problem may be related to MTS installation with certain race condition in the shared server startup when site has a heavy load on the system. (bug 281186) * Before 7.1.5, this internal may occur when issuing a parallel query with a degree of parallelism that is higher than our init.ora parameter, parallel_max_servers. (bug 225677) * The error trapping for this internal error has been changed in the 7.0.15, so the error should consider differently from the 7.1 release. Please check bug 141220 for earlier 7.0 related bug. * Note that by typing "oracle" at the shell prompt will result in a similar trace output. So, analyst should make sure customer is not doing similar mistake as described here. Also check the following diagnosis program supplied by developer. Stack: get_frame0 sdtcs ksedmp ksfdmp kgeriv kgesiv ksesic0 opirip opidrv sou2o main _start Additional diagnosis: The following notes and program are provided by developer to diagnose this internal error. 1. README.: Bug# 271045 The internal error 12235 indicates that an Oracle process is starting up, but it doesn't know what it is supposed to do, i.e. be an MTS dispatcher, MTS server, background process, etc. Although we dump the fixed SGA when we get this internal error, all this will tell us is that certain parts of the SGA indicate that no Oracle process is supposed to be starting up. What would give us more information is the name of the process, i.e. "ora_pmon_*", "ora_dbwr_*", etc. The oracle.c file is a program that will print the name of the process to the alert log and then execute the real Oracle executable. This will not fix anything, but will give us more information as to what is happening. We will still require the alert log and any trace files generated the next time the problem occurs. The customer will need to:- 1) rename the Oracle executable, i.e. "mv $ORACLE_HOME/bin/oracle $ORACLE_HOME/bin/oracle.save" 2) compile and link the test program, i.e. "cc oracle.c -o $ORACLE_HOME/bin/oracle" 3) set the environment variable "ORACLE_ALERT_FILE" to be the full pathname of the alert file for the given instance Now, when the internal error 12235 happens, we should also get something printed to the alert file which gives us the name of the process which was trying to start up. 2. oracle.c: #include #include main(argc, argv) int argc; char *argv[]; { int fd; char *alert_file; char *oh; char buf[80]; char *getenv(); if (!(alert_file = getenv("ORACLE_ALERT_FILE"))) { fprintf(stderr, "ORACLE_ALERT_FILE environment variable not set!\n"); } else { if ((fd = open(alert_file, O_WRONLY|O_APPEND)) < 0) { perror("Couldn't open alert file"); } else { sprintf(buf, "Oracle executable being run with argv[0] = %s\n", argv[0]); if (write(fd, buf, strlen(buf)) < 0) perror("Couldn't write to alert file"); close(fd); } } if (!(oh = getenv("ORACLE_HOME"))) { fprintf(stderr, "Oracle executable: ORACLE_HOME not set!\n"); exit(1); } sprintf(buf, "%s/bin/oracle.save", oh); if (execv(buf, argv) < 0) perror("Oracle executable - execv() failed"); Solution: ORA-600 [12235] DIAGNOSTICS FOR TECHNICAL ANALYSTS *** Internal *** This document is designed for use by Technical Support Analysts to accelerate the diagnostic process when encountering this error. This information is not intended to provide a complete solution, rather to provide understanding and pointers to enable further investigation. The material covered here is not suitable for external distribution. [12235] This internal error is because a background process is not correctly invoked hence terminated. That means the type of the detached process can not be determined. The detached process is one of the following: 1. detached background processes - pmon, smon, dbwr etc. 2. multi-threaded server 3. dispatcher 4. query server (since version 7.1.x) then this [12235] internal error occurs with the sga dump for debugging in the trace file. This internal error is not database corruption error. Code: opirip module is to hangle the oracle program internface: if (ksbgpd()) { /* I am detached process */ ksbrdp(); /* run detached process */ } else if (kmmsts()) /* starting up server */ ... else if (kmmstd()) /* starting up dispatcher */ { /* this is a dispatcher */ err = kmmrdp(); /* run the dispatcher */ if (err) ksesec0(OER(err)); } else if (kxfpsqs()) kxfprdp(); /* run query server */ else { /* If you're debugging this, ** look in the sga for ksbsga ** and see why it was all zero */ if (ksmmpd) { ksdwrf( "SSP:\n----- Dump of the SGA -----\n" ); ksddmp((ptr_t)&ksmsgf, (size_t)((ub1 *)(&ksmsgl+1) - (ub1 *)&ksmsgf)); } ksesic0(OERI(12235)); } Known problem: * Many bugs has been reported about this internal error but not reproducible. * The problem may be related to MTS installation with certain race condition in the shared server startup when site has a heavy load on the system. (bug 281186) * Before 7.1.5, this internal may occur when issuing a parallel query with a degree of parallelism that is higher than our init.ora parameter, parallel_max_servers. (bug 225677) * The error trapping for this internal error has been changed in the 7.0.15, so the error should consider differently from the 7.1 release. Please check bug 141220 for earlier 7.0 related bug. * Note that by typing "oracle" at the shell prompt will result in a similar trace output. So, analyst should make sure customer is not doing similar mistake as descirbed here. Also check the following dianosis program supplied by developer. Stack: get_frame0 sdtcs ksedmp ksfdmp kgeriv kgesiv ksesic0 opirip opidrv sou2o main _start Additional diagnosis: The following notes and program are provided by developer to diagose this internal error. 1. README.: Bug# 271045 The internal error 12235 indicates that an Oracle process is starting up, but it doesn't know what it is supposed to do, i.e. be an MTS dispatcher, MTS server, background process, etc. Although we dump the fixed SGA when we get this internal error, all this will tell us is that certain parts of the SGA indicate that no Oracle process is supposed to be starting up. What would give us more information is the name of the process, i.e. "ora_pmon_*", "ora_dbwr_*", etc. The oracle.c file is a program that will print the name of the process to the alert log and then execute the real Oracle executable. This will not fix anything, but will give us more information as to what is happening. We will still require the alert log and any trace files generated the next time the problem occurs. The customer will need to:- 1) rename the Oracle executable, i.e. "mv $ORACLE_HOME/bin/oracle $ORACLE_HOME/bin/oracle.save" 2) compile and link the test program, i.e. "cc oracle.c -o $ORACLE_HOME/bin/oracle" 3) set the environment variable "ORACLE_ALERT_FILE" to be the full pathname of the alert file for the given instance Now, when the internal error 12235 happens, we should also get something printed to the alert file which gives us the name of the process which was trying to start up. 2. oracle.c: #include #include main(argc, argv) int argc; char *argv[]; { int fd; char *alert_file; char *oh; char buf[80]; char *getenv(); if (!(alert_file = getenv("ORACLE_ALERT_FILE"))) { fprintf(stderr, "ORACLE_ALERT_FILE environment variable not set!\n"); } else { if ((fd = open(alert_file, O_WRONLY|O_APPEND)) < 0) { perror("Couldn't open alert file"); } else { sprintf(buf, "Oracle executable being run with argv[0] = %s\n", argv[0]); if (write(fd, buf, strlen(buf)) < 0) perror("Couldn't write to alert file"); close(fd); } } if (!(oh = getenv("ORACLE_HOME"))) { fprintf(stderr, "Oracle executable: ORACLE_HOME not set!\n"); exit(1); } sprintf(buf, "%s/bin/oracle.save", oh); if (execv(buf, argv) < 0) perror("Oracle executable - execv() failed");