批量取statspack的脚本

加入dbDao.com Oracle技术学习QQ群:171092051

 

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 400-690-3643 备用电话: 13764045638 邮箱:service@parnassusdata.com

 

做了一个脚本sprpt_batch.sh:

read line
snap_i_id=$1
end_snap=$2
 
sqlplus -s /nolog
<<EOF
conn /as sysdba;
define begin_snap=${snap_i_id};
define end_snap=${end_snap};
define report_name=sprpt_batch_${snap_i_id}_${end_snap}.txt
set echo off
set feedback off
@
myspreport
exit
EOF

将$ORACLE_HOME/rdbms/admin/spreport.sql和$ORACLE_HOME/rdbms/admin/sprepins.sql拷贝到工作目录下,重命名成myspreport.sql和mysprepins.sql

将mysprepins.sql中的部分注释掉:

/*
select to_char(s.startup_time,' dd Mon "at" HH24:mi:ss') instart_fmt
     , di.instance_name                                  inst_name
    , di.db_name                                        db_name
     , s.snap_id                                         snap_id
     , to_char(s.snap_time,'dd Mon YYYY HH24:mi')        snapdat
     , s.snap_level                                      lvl
    , substr(s.ucomment, 1,60)                          commnt
  from stats$snapshot s
     , stats$database_instance di
where s.dbid              = :dbid
   and di.dbid             = :dbid
   and s.instance_number   = :inst_num
   and di.instance_number  = :inst_num
   and di.dbid             = s.dbid
   and di.instance_number  = s.instance_number
   and di.startup_time     = s.startup_time
order by db_name, instance_name, snap_id;
*/

因为这一部分是显示statspack的保存记录的时间和snap id的。我们做成脚本,就不需要让他们显示了。

(一)
取单个statspack,可以执行:

sh sprpt_batch.sh <begin_snap_id> <end_snap_id>

如:

sh sprpt_batch.sh 118712 118713

(二)
如果要取最近30天的statspack,每隔15分钟为间隔,可以在数据库中

sqlplus "/ as sysdba"
Set line 300
Set pages 10000
Spool exec_script.sh
select script_text
  from (select 'sh sprpt_batch.sh ' || lag(snap_id) over(partition by startup_time order by snap_id) || ' ' || snap_id || chr(10) || chr(10) as script_text,
               lag(snap_id) over(partition by startup_time order by snap_id) as last_value,
               a.*
          from STATS$SNAPSHOT a
         order by snap_id desc
        )
where last_value is not null and snap_time>=sysdate-30
spool off

生成出来的结果如下:

sh sprpt_batch.sh 119082 119083
sh sprpt_batch.sh 119081 119082
sh sprpt_batch.sh 119080 119081
sh sprpt_batch.sh 119079 119080
……

然后执行这个exec_script.sh脚本,就可以批量的生成statspack了。

(三)如果需要每个1小时一个statspack,这个也可以做到,只需将snap_id排序,mod取4整除,(因为每4个snap id是一个小时)。
见下:

select 'sh sprpt_batch.sh ' || last_value || ' ' || snap_id || chr(10) ||
       chr(10) as script_text
  from (select lag(snap_id) over(partition by startup_time order by snap_id) as last_value,
               kk.*
          from (select mod(rank()
                           over(partition by startup_time order by snap_id),
                           4) as by_hour,
                       a.*
                  from STATS$SNAPSHOT a) kk
         where by_hour = 1)
where last_value is not null
   and snap_time >= sysdate - 30

关注dbDao.com的新浪微博

扫码关注dbDao.com 微信公众号:

关注dbDao.com的新浪微博

扫码加入微信Oracle小密圈,了解Oracle最新技术下载分享资源

TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569