when working with the oracle database sooner or later you will face the ORA-07445 error reported in a trace file and the alertlog.
there is plenty of documentation about this error on oracle support and the web. in short: this is an unhandled exception in the oracle code ( in contrast the ORA-00600 errors are handled exceptions ). so why do I want to write about it ? because this is another example where you can map database behavior to the operating system. one common type of the ORA-07445 is this one: “type: SIGSEGV”.
what is this about and what does it stand for ?
software contains bugs. this is true for the linux kernel, this is true for the oracle database and this is true for probably all other software. to deal with unexpected behavior and to protect the system there must be some some sort of exception handler which processes/catches the exceptions once they occur and does the necessary steps to recover from the exceptions. the lowest level exceptions are raised by the CPU and must be handled by the operating system’s kernel. these exception are predefined and the kernel provides an exception handler for each of them.
some of them are:
- division by zero
- segment not present
- stack segment fault
- invalid opcode
- …
you can, for example, check the intel documentation for a complete list of defined exceptions.
when an exception is raised the corresponding exception handler sends a signal to the process which caused the exception. and this is exactly what the SIGSEGV is: it is a signal. signals, for example ( the following list is not complete ), can be:
- SIGSEGV: page faults, overflows
- SIGFPE: divide error
- SIGBUS: stack segments fault
- SIGILL: invalid opcode
most of these exceptions can only occur when the kernel is in user mode, that is, when executing tasks from user programs ( oracle in this case ). there are two ways in which the processor can halt ( or interrupt ) process execution:
- interrupts, which are ansynchron and typically triggered by I/O devices
- exceptions, which are synchron and triggered by the processor when it detects predefined conditions while executing
when the processor halts process execution it switches to the handler routine ( each routine is defined in the interrupt description table, IDT ). once the handler routine has executed its tasks control is given back to the interrupted process.
unfortunately there is not much you can do about it. you can try to find a workaround with oracle support ( e.g. by setting some database parameters or applying a patch ) or check the generated dumps to get some hints on what exactly caused the exception.
a recent search on oracle support returned about 2500 results for the term SIGSEGV. you see, this is not an unusual signal …