当数据库检测出内部错误时,会在告警日志内输出相关的错误代码,并输出相关的跟踪日志文件和事件日志文件。
例:
代码语言:javascript复制 --告警日志中的ORA-600错误
Fri May 16 03:55:01 2019
Errors in file <路径名>/SID_dbw0_2449.trc (incident=3488073):
ORA-00600: internal error code, arguments: [kcbo_write_process_3], [], [], [], [], [], [], [], [], [], [], []★
Incident details in: <路径名>/incident/incdir_3488073/SID_dbw0_2449_i3488073.trc
Errors in file <路径名>/SID_dbw0_2449.trc:
ORA-00600: internal error code, arguments: [kcbo_write_process_3], [], [], [], [], [], [], [], [], [], [], []★
代码语言:javascript复制 --告警日志中的ORA-7445错误
Fri Feb 03 08:17:12 2019
Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0xD] [PC:0x2CAB735, qerjoFetch() 4357] [flags: 0x0, count: 1]
Errors in file <路径名>/SID_ora_5193.trc (incident=36209):
ORA-07445: internal error code, arguments: [qerjoFetch() 4357] [SIGSEGV] [ADDR:0xD] [PC:0x2CAB735] [Address not mapped to object] []
Incident details in: <路径名>/SID_ora_5193_i36209.trc
当发生ORA-600错误的时候,后面的方括号内会有一个参数列表。
代码语言:javascript复制 格式:
ORA-00600 "internal error code, arguments: [参数1], [参数2],[参数3]..."。
参数1是内部消息号或字符串,通常表示这个错误是由哪个程序(Oracle源代码)引起的和错误的意义。
参数1和数据库版本号对于找到Ora-600的根本原因和潜在影响非常重要,可以大大地缩小问题范围。
剩余的参数是用来提供关于Oracle的源代码运行的进一步信息。
日志文件中会输出更详细的调用堆栈信息,可以帮助我们进一步分析和找到解决方案。
同样,Ora-7445错误发生的时候,后面的方括号内也会有一个参数列表。
代码语言:javascript复制 格式:
ORA-07445: "internal error code, arguments: [参数1], [参数2],[参数3]..."。
如前面所述,ORA-07445是没有被ORACLE的代码捕获的操作系统(OS)异常,所以仅仅通过参数不一定能够定位到问题的原因,所以主要是通过日志文件中详细的调用堆栈信息来分析和找到解决范围。
内部错误处理步骤
对于内部错误,通常来讲需要官方对代码进行修正,适用补丁程序。
但是,作为实用数据库的客户而言,了解其分析方法,对于一些问题也可以在应用层面上实施一些对策,从而避免由于代码修正周期长而导致的业务影响。
收集必要信息
在发现了内部错误后,首先应收集相关的错误信息以及日志等信息。
您可以通过TFA工具根据错误内容收集相关的必要信息。
参考文章:数据库故障诊断基础工具之TFA
代码语言:javascript复制 ORA-600:
$TFA_HOME/bin/tfactl diagcollect -srdc ora60
ORA-700:
$TFA_HOME/bin/tfactl diagcollect -srdc ora700
ORA-7445:
$TFA_HOME/bin/tfactl diagcollect -srdc ora7445
如果无法通过TFA收集的话,可以收集一下内容:
1.最近数据库或者应用上的变化,或者是问题发生时候的特征等。
因为如果是正常运行了很长时间,而突然发生的问题,很有可能和应用有关。
这样可以从某种程度上缩小问题的范围。
2.包含最后一次数据库启动信息以及问题发生时间点的告警日志。
之所以要看数据库启动参数信息,因为某些问题可能和数据库的启动设置有关。
而且通过连续的告警日志中可以确认到问题的时间序列,也有可能在输出更多的错误信息。
3.ORA-600/ORA-7445/ORA-700内部错误发生时候产生的跟踪日志文件和事件日志文件(incident)。
这是调查内部错误的主要信息。
日志的输出路径可以通过告警日志确认,也可以通过如下语句确认。
代码语言:javascript复制 SQL> select VALUE from v$diag_info where name ='Diag Trace';
4.opatch lsinventory -detail 的结果,更方便确认bug的修复状况以及版本信息。
代码语言:javascript复制 export ORACLE_HOME=<OracleHome>
cd $ORACLE_HOME/OPatch
opatch lsinventory -detail
信息的处理
为了给用户更好的用户体验,对于ORA-600/ORA-700/ORA-7445等内部错误,现阶段Oracle会通过最佳实践和机器学习等技术,进行自动分析给出解决方案。
所以,当遭遇ORA-600/ORA-700/ORA-7445时,如有官方MOS账号可以直接起一个SR,然后上传上述信息。
如果是已知的问题,会在最短的时间内获得自动分析结果。
当然,如果无法自动解析的情况下,技术工程师会继续帮您调查和提供解决方案。
对一些相对资深的数据库从业者,可能会对如何解析相关信息有兴趣,以后我们将通过一个例子理解如何处理相关问题。