ORA-04031导致数据库宕机问题分析
背景介绍
2014/6/5接渠道反馈,用户数据库意外宕机,后经过重启服务器Oracle数据库恢复正常,用户希望能够排查原因,避免再次出现宕机事故,这种意外宕机原因排查是我们远程处理经常遇到的案例,虽然宕机的原因有很多,但是排查的步骤基本一致,都一个固定的套路,接下来就介绍下如何一步步定位问题。
分析步骤
步骤一.查询alert日志,查找错误信息
本案例这种情况,是属于事后分析,这种分析的方法只有一个,就是查看日志,如果是操作系统,就要查看操作系统的日志,是数据库自然就要查看数据库的日志。我们知道数据库有很多日志,但是最关键的日志就是alert日志,如果是RAC环境可能会涉及到CRS的日志,这里是单机环境,我们就只需要关注alert日志就可以,alert日志的路径和日志名称就不用太多介绍,作为DBA这点常识还是应该有,拿到alert日志首先就是查看数据库宕机时间段前后有什么异常记录,如下本案例在宕机前有如下错误提示信息:
Errors infile d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc:
ORA-00604:递归SQL 级别 1出现错误
ORA-04031:无法分配32 字节的共享内存("shared pool","select job, nvl2(last_date, ...","sqlarea","tmp")
Wed Jun04 18:59:17 2014
Errors infile d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc:
ORA-00604:递归SQL 级别 1出现错误
ORA-04031:无法分配32 字节的共享内存("shared pool","select count(*) from sys.job...","sqlarea","tmp")
Wed Jun04 18:59:22 2014
Errors infile d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc:
ORA-00604:递归SQL 级别 1出现错误
ORA-04031:无法分配32 字节的共享内存("shared pool","select job, nvl2(last_date, ...","sqlarea","tmp")
Wed Jun04 18:59:22 2014
Errors infile d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc:
ORA-00604:递归SQL 级别 1出现错误
ORA-04031:无法分配32 字节的共享内存("shared pool","select count(*) from sys.job...","sqlarea","tmp")
Wed Jun04 18:59:27 2014
Errors infile d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc:
ORA-00604:递归SQL 级别 1出现错误
ORA-04031:无法分配32 字节的共享内存("shared pool","select job, nvl2(last_date, ...","sqlarea","tmp")
通过日志信息,可以初步定位到这次故障的起因是ora-00604和ora-04031引起,为了进一步准确定位,我们应该查看提示中的子跟踪文件,如上面的d:\oracle\product\10.2.0\admin\oraxy\bdump\oraxy_cjq0_4340.trc,这里面肯定包含了更多详细的信息。