Keyword:AWR snapshot Generation MMON Suspension
AWR是ORACLE数据库重要的诊断工具,但是有时可能遇到AWR快照无法获取的问题,影响性能监测。本文介绍如何诊断和解决这类问题。

■收集诊断信息1.获取AWR Snapshot的设定信息和过去取得信息
set mark html onspool Info.htmlalter session set NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF3'---数据库状态select open_mode from v$database;---AWR相关环境设定信息show parameter control_management_pack_accessshow parameter statistics---AWR设定信息select * from dba_hist_wr_control;---快照的取得信息select * from dba_hist_snapshot order by snap_id;---快照的最新取得时间信息col systimestamp form a35col most_recent_snap_time form a25col snap_interval form a17select systimestamp,most_recent_snap_time,snap_intervalfrom wrm$_wr_controlwhere dbid = (select dbid from v$database);---快照的错误信息col instance_number form 999 head INSTcol begin_interval_time form a25col flush_elapsed form a17col status form 999col error_count form 999 head ERRcol snap_flag form 999 head SNAPselect * from(select snap_id,instance_number,STARTUP_TIME,begin_interval_time,flush_elapsed,status,error_count,snap_flagfrom wrm$_snapshotwhere dbid = (select dbid from v$database)order by snap_id desc)where rownum <= 10order by snap_id;---快照的错误原因select * from wrm$_snap_errorwhere dbid = (select dbid from v$database)order by snap_id;---版本11.2.0.2以后,通过WRM$_SNAPSHOT_DETAILS视图获得各AWR对象表的处理时间set pagesize 999column name format a28column time format a29variable dbid numberexec select dbid into :dbid from v$database;variable snap_id numberexec select max(snap_id) into :snap_id from wrm$_snapshot where dbid=:dbid;select table_name_kewrtb name, end_time-begin_time timefrom wrm$_snapshot_details, x$kewrtbwhere snap_id = :snap_id and dbid = :dbidand table_id = table_id_kewrtborder by table_id;---获取AQ相关信息,看是否AQ的信息太多SELECT q_name, a, COUNT (*) HOW_MANYFROM (SELECT q_name, TRUNC(enq_time, 'DD') AS aFROM SYS.alert_qtORDER BY enq_time)GROUP BY a, q_nameORDER BY a;select systimestamp, count(*), QUEUE, MSG_STATEfrom aq$ALERT_QTgroup by msg_state, queue;spool off;set mark html off;
参考:
Troubleshooting: Missing Automatic Workload Repository (AWR) Snapshots and Other Collection Issues (Doc ID 1301503.1)
2.查看Alert log和相关的一些Trace信息(MMON,M00x等进程),看是否有有用的相关信息
例如:Suspending MMON slave action kewrmafsa_ for 82800 seconds
3.确认数据库的Path状况:
export ORACLE_HOME=<OracleHome>cd $ORACLE_HOME\OPatch./opatch lsinventory
4.确认MMON 是否挂起(Suspension)
oradebug setmypidoradebug unit_test kebm_dmp_slv_attrs kewrmafsa_输出例:oradebug setmypidStatement processed.oradebug unit_test kebm_dmp_slv_attrs kewrmafsa_Status: 2Flags: 0Runtime limit: 1800CPU time limit: 600Violations: 0Suspended until: 0 ★如果这个值大于0的话,则代表MMON发生了挂起oradebug setmypidoradebug unit_test kebm_dmp_slv_attrs kewrmrfsa_oradebug unit_test kebm_set_slv_attrs kewrmafsa_ retain retain retain retain 0 0
5.确认通过手动收集是否能够正常
例:exec dbms_workload_repository.create_snapshot();
6.确认用于保存AWR的SYSAUX表空间是否有空闲空间和使用状况。
SQL> connect / as sysdbaSQL> @?/rdbms/admin/awrinfo.sql
7.设置MMON 的动作Trace和snapshot flush Trace
(RAC情况下每个Instance都需要设置)
有效:---MMON action tracealter session set "_swrf_test_action" = 28;--snapshot flush Tracealter session set "_swrf_test_action" = 10;无效:(设置后等待1小时以上,包含AWR取得时间段)alter session set "_swrf_test_action" = 29;alter session set "_swrf_test_action" = 11;
8.设置针对MMON 的SQL trace
例:有效:begindbms_monitor.serv_mod_act_trace_enable(service_name=>'SYS$BACKGROUND',module_name=>'MMON_SLAVE',action_name=>'Auto-Flush Slave Action');dbms_monitor.serv_mod_act_trace_enable(service_name=>'SYS$BACKGROUND',module_name=>'MMON_SLAVE',action_name=>'Remote-Flush Slave Action');end;/无效:begindbms_monitor.serv_mod_act_trace_disable(service_name=>'SYS$BACKGROUND',module_name=>'MMON_SLAVE',action_name=>'Auto-Flush Slave Action');dbms_monitor.serv_mod_act_trace_disable(service_name=>'SYS$BACKGROUND',module_name=>'MMON_SLAVE',action_name=>'Remote-Flush Slave Action');end;/
9.也可以通过设置AWR test 事件来获取MMON 的SQL trace
有效:(trace AWR SQL)alter session set events 'immediate trace name awr_test level 3';另外,也可以通过以下的设置获得其他的一些trace。trace AWR snapshots:alter session set events 'immediate trace name awr_test level 1';trace AWR purging:alter session set events 'immediate trace name awr_test level 2';无效:(关闭所有awr test trace)alter session set events 'immediate trace name awr_test level 4';
10.如果在AWR快照时发生挂起(Hang)的话,通过如下方法获取hanganalyze和 systemstate,确认进程状态和errorstack信息。
SQL> connect /as sysdbaoradebug setmypidoradebug unlimitoradebug setinst alloradebug -g all hanganalyze 4oradebug -g all dump systemstate 266quit<等待...>connect /as sysdbaoradebug setmypidoradebug unlimitoradebug setinst alloradebug -g all hanganalyze 4oradebug -g all dump systemstate 266quit<等待...>connect /as sysdbaoradebug setmypidoradebug unlimitoradebug setinst alloradebug -g all hanganalyze 4oradebug -g all dump systemstate 266quit
或者,通过一下方法获取errostack
1.确认MMON的PIDp.pidFROM v$session s, v$process pWHERE s.paddr=p.addrAND s.program like '%(MMON)';2.获取errorstackoradebug setorapid <MMON_PID_from_previous_query>oradebug unlimitoradebug short_stack ---> Repeat this command one or more times.oradebug tracefile_name
通过如下方法尝试重新启动AWR 快照取得的动作
1.通过更改“restricted session”的mode重新唤醒MMON进程
例:alter system enable restricted session;alter system disable restricted session;
2.通过OS命令将MMON进程Kill
例:kill -9 <MMON Process ID>MMON被kill或,会自动启动MMON和MMON Slave进程(m00x)
3.重启数据库
通过重启数据库会重新启动MMON,从而解决相关问题
4.删除AQ相关信息
--alter system set "_alert_message_purge"=0;declarepo dbms_aqadm.aq$_purge_options_t;begindbms_aqadm.purge_queue_table(queue_table => 'ALERT_QT',purge_condition => NULL,purge_options => po);end;/alter system set "_alert_message_purge"=1;
5.重建AWR功能
参考:
How to Recreate the Automatic Workload Repository (AWR)? (Doc ID 782974.1)
6.字典表统计信息不准确导致性能慢
例:execute dbms_stats.gather_table_stats
7.如果发现在处理某个AWR对象时耗时间而导致无法完成的话,可以使用"_awr_disabled_flush_tables" 参数跳过对该对象的处理,这样会导致AWR缺少某些数据,但是整体可以完成。
例:alter system set "_awr_disabled_flush_tables" = 'wrh$_sql_bind_metadata';
用碎片化的时间,一点一滴地学习一套系统化的知识。

原文作者:SQL和数据库技术;如有侵权,请联系管理员删除。