通过shell定制ash脚本(r3笔记第33天)

时间:2022-05-04
本文章向大家介绍通过shell定制ash脚本(r3笔记第33天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

ash是在10g以来一个很有用的特性,能够作为awr的补充,对于排查一些历史的问题能够提供更加详细和针对性的数据。 当然个人在使用ash的时候感觉最慢的地方就是在于输入时间戳了,每次输入侧时候都得一边看着样例,一边按照格式,一份ash的报告,至少20%以上的时间耗在这个时间戳上了。 有时候想查看几个时间点的数据,如果精确到分钟,那么运行ashrpt.sql就得一次又一次的输入时间戳,虽然报告生成的速度还是很快,但是老是感觉手工劳动的部分太多,毕竟有很多的选项我们并不需要。 所以使用了如下的脚本来定制ash,只需要通过shell脚本输入两个时间戳即可。

print "
        WHENEVER SQLERROR EXIT 5
        SET FEEDBACK  OFF
        SET HEAD OFF
        SET PAGES 0 
        connect ${DB_CONN_STR}@${SH_DB_SID}n
         set linesize 150
        select  d.dbid||','||i.instance_number||',to_date('||chr(39)||$1||chr(39)||','||chr(39)||'yyyymmddHH24MISS'||chr(39)||'),to_date('||chr(39)||$2||chr(39)||','||chr(39)||'yyyymmddHH24MISS'||chr(39)||')'  text
                        from v$database d,
             v$instance  i ;
        " | sqlplus -s /nolog > ash_inputs.lst
sqlplus -s ${DB_CONN_STR}@${SH_DB_SID}  <<EOF
set echo off verify off timing off feedback off trimspool on  trimout on
set long 1000000 pagesize 6000 linesize 80
spool  ashrpt_$1_$2.lst
select output from table(dbms_workload_repository.ash_report_text(`cat  ash_inputs.lst`));
spool off;
EOF

比如我想查看22号7点25分到7点26分的ash数据,就直接输入下面的命令即可。

ksh genashtext.sh 20141022072500 20141022072600

OUTPUT -------------------------------------------------------------------------------- ASH Report For TEST01/TEST01

DB Name DB Id Instance Inst Num Release RAC Host ------------ ----------- ------------ -------- ----------- --- ------------ TEST01 3645037571 TEST01 1 11.2.0.3.0 NO rac1

CPUs SGA Size Buffer Cache Shared Pool ASH Buffer Size ---- ------------------ ------------------ ------------------ ------------------ 2 299M (100%) 48M (16.1%) 200M (67.0%) 4.0M (1.3%)

Analysis Begin Time: 22-Oct-14 07:25:00 Analysis End Time: 22-Oct-14 07:26:00 Elapsed Time: 1.0 (mins) Begin Data Source: V$ACTIVE_SESSION_HISTORY End Data Source: V$ACTIVE_SESSION_HISTORY 关于ash还是有一些额外的东西需要补充,ash和awr的部分还是有一些不同,比如ash的数据有在内存中的有在硬盘中归档了的。 在生成ash报告的时候就可以选择。 完整的方法和参数是下面的样子。 FUNCTION ash_report_text(l_dbid IN NUMBER, l_inst_num IN NUMBER, l_btime IN DATE, l_etime IN DATE, l_options IN NUMBER DEFAULT 0, l_slot_width IN NUMBER DEFAULT 0, l_sid IN NUMBER DEFAULT NULL, l_sql_id IN VARCHAR2 DEFAULT NULL, l_wait_class IN VARCHAR2 DEFAULT NULL, l_service_hash IN NUMBER DEFAULT NULL, l_module IN VARCHAR2 DEFAULT NULL, l_action IN VARCHAR2 DEFAULT NULL, l_client_id IN VARCHAR2 DEFAULT NULL, l_plsql_entry IN VARCHAR2 DEFAULT NULL, l_data_src IN NUMBER DEFAULT 0 ) 其中l_data_src就决定了数据来源是从内存,硬盘还是两者兼有。默认是都有。 当然了还可以根据需要来绑定sql/session来更有针对性的查看信息。