一、故障说明
生产库RAC其中一节点突然无法自动生产快照,生成时间较长。如下图所示:
二、分析问题
1. 检查SYSAUX表空间是否不足(一般不会存在这种低级错误,不过还是要检查下)
查看SYSAUX还有13G左右的空间。
2. 检查MMON/MMNL进程是否异常
MMON进程作用是:
The memory monitor (MMON) process was introduced in 10g and is associated with the Automatic Workload Repository new features used for automatic problem detection and self-tuning. MMON writes out the required statistics for AWR on a scheduled basis.
MMNL进程作用是:
The Memory Monitor Light (MMNL) process is a new process in 10g which works with the Automatic Workload Repository new features (AWR) to write out full statistics buffers to disk as needed.
ps -ef |egrep "mmon|mmnl"
我查看我数据库进程是存在的,没什么异常
3. FIXED TABLE统计信息不准确
我首先去查看该节点的alert日志文件,看看有没有什么报错,发现出现好几处这样的信息
随后我就去看MMON的trace有没有什么日志,
结合查看MMON slave进程m000的trace文件,出现以下报错:
从上图可以看出执行insert into WRH$SERVICE_STAT出现了ora-12751的错误
exec dbms_workload_repository.create_snapshot;
我手动生成快照,一直也无法生成,查看活动会话,awr快照会话在执行以下SQL,也就是trace文件的报错
可以使用oradebug或者10046 收集下是哪里出现问题
会话1:
SQL>exec dbms_workload_repository.create_snapshot;
会话2:Open another session as sysdba:
SQL>conn / as sysdba;
SQL>oradebug setmypid
SQL>oradebug unlimit;
SQL>oradebug hanganalyze 3
Wait for some seconds
SQL>oradebug hanganalyze 3
Wait for some seconds
SQL>oradebug hanganalyze 3
SQL>oradebug tracefile_name
The generated files will be under udump.
$cd udump
$ls –ltr
上述插入语句在“FIXED TABLE FIXED INDEX$KEWSSVCV”步骤中花费了超过300秒的CPU时间:
为何在收集信息会这么慢呢,我就去查了下v$active_services,v$service_stats,发现v$service_stats视图中unknown记录数很多。
这些数据是怎么来的呢,想到这个节点每天都需要进行expdp备份,alert日志中就会出现修改service name的片段。
expdp每次开始备份,都会新增一个service name,备份结束后会去掉该service name,所以导致v$service_stats出现了很多unknown记录,
查看上述SQL执行计划,统计信息不准确
因此AWR快照生成过程中在执行上述SQL时,由于fixed table统计信息不准确或者尚无统计信息,oracle选择了效率较低的执行计划,SQL的执行消耗大量时间,导致oracle维护任务cpu time policy violation,AWR快照生成中断。
这是只对三个表进行重新收集统计信息
sqlplus / as sysdba
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'X$KSWSASTAB', no_invalidate=>false);
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'X$KEWSSMAP', no_invalidate=>false);
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'X$KEWSSVCV', no_invalidate=>false);
这是对SYS用户所以对象进行收集(尽量在空闲的时候操作)
SQL> EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS ('SYS');
最后收集fixed table的统计信息后,AWR快照可以正常生成。
参考mos的文档:
AWR Snapshots Are Not Generated due to ORA-12751 (文档 ID 2243670.1)
AWR Auto Flush Action Timeout at Insert Into WRH$_SERVICE_STAT (文档 ID 2294282.1)