1.问题描述:
最近想要通过awr观察下某个oracle实例的性能情况,碰到了在sqlplus执行awrrpt.sql到选择snapshot区间的时候无任何区间供选导致无法进一步生成awr的情况,而且手动使用execute DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();一直执行无果。
2.问题分析:
可能的情况1:sysaux空间不足,因为awr报告的原始数据都是存放咋sysaux表空间的,若空间不足可能导致awr无数据。通过查询表空间的使用情况发现sysaux表空间充足,故排除该原因。
可能的情况2:awr数据字典无数据
SELECT * from wrh$_active_session_history; --快照采集信息情况,从v$active_session_history获取
select * from dba_hist_active_sess_history --是wrh$_active_session_history和其他几个视图的联合展现。这两个数据字典的数据时awr报告的主要数据来源,是通过定期获取其它性能视图的数据积累而成的。 通过查询发现这两个数据字典无数据,因此原因找到。
分析:
1. awr数据字典无数据的可能原因是相关的awr参数没有设置恰当,一般的statistics_level应为typical或者all,而且 timed_statistic因为true,通过查看这些参数没有发现异常。
2.参数设置没有问题,还有可能是采集时间和保留时间设置错误,因此通过查看 select * from DBA_HIST_WR_CONTROL来获取采样时间和保留时间,发现也没有问题。
3. 通过对应包进一步查看和确定保留时间一致
select dbms_stats.get_stats_history_availability from dual;
select dbms_stats.get_stats_history_retention from dual;
4. 网上有说法说可能重新设置下snap_ingterval和retention就可以了,因此使用execute DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( interval => 30,retention => 06*24*10);仍未有果。
5.google了好久终于找到一个类似的,原因是awr相关的性能视图被某些后台进程锁住了。
通过如下语句查看:
select sid,serial#,event,username,PROGRAM,BLOCKING_INSTANCE,blocking_session,state
from gv$session
where (event not like '%rdbms%' and event not like '%gcs remote%' and event not like 'smon timer%'
and event not like 'SQL*Net%' and event not like 'Streams AQ%' and event not like '%jobq slave wait%'
and event not like '%ASM background timer%' and event not like 'DIAG idle wait%')
and program like '%m00%' and status='ACTIVE' order by seconds_in_wait desc
发现有名为ORACLE.EXE (m000)的会话被其他会话锁住了。通过上一个查询得出的blocking_session,获取持锁会话为名为ORACLE.EXE (MMNL)的后台进程:
select * from v$session where sid=2186
通过查询v$locked_objects 和dba_objects发现有若干以wrh$开头的表被锁住了。
select a.*,b.object_name from v$locked_object a,dba_objects b where a.object_id=b.object_id
3.问题解决:
由于被锁和持锁进程都为后台进程,通过alter system kill session 命令无法结束,只能在os级停止对应的进程。
对于windows系统来说采用的是线程结构,根本无法结束对应的持锁进程,只能通过重启解决。
对于linux系统,可以先通过v$bgprocess和v$process获取其对应的spid,然后通过命令kill掉。
--转自