通过shell定制ash脚本

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来更有针对性的查看信息。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。