ITPub博客

首页 > 数据库 > Oracle > 通过shell定制ash脚本

通过shell定制ash脚本

Oracle 作者:dbhelper 时间:2014-11-26 10:54:33 0 删除 编辑
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} < 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来更有针对性的查看信息。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8494287/viewspace-1346984/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2017-10-14

  • 博文量
    651
  • 访问量
    392152