通過shell定製ash指令碼

kingsql發表於2014-10-23
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部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1307974/,如需轉載,請註明出處,否則將追究法律責任。

相關文章