工作需求:项目中需要把生产库中所有的AWR报告dump出来,然后导入到方便测试的数据库中。在测试库中的AWR报告需要根据dbid和实例名逐个导出,如果遇到很多再加上RAC系统,会很麻烦。在网上找了一些脚本,发现没有适合自己的,所以就自己学习了一个存储过程来实现这样的功能。

说明:在$ORACLE_HOME/rdbms/admin/awrrpti.sql中可以看到,生成AWR报告主要使用DBMS_WORKLOAD_REPOSITORY.awr_report_html包。至于喜欢玩哪种方式,要看个人偏好。

存储过程实现代码:

create or replace directory AWR_REPORTS_DIR as '/u01/awr/';
DECLARE l_snap_start NUMBER := 14632;
l_snap_end NUMBER := 14643;
l_dir VARCHAR2(50) := 'AWR_REPORTS_DIR'; l_last_snap NUMBER := NULL;
l_dbid NUMBER := 813977229;
l_file UTL_FILE.file_type;
l_file_name VARCHAR(50);
cursor cur_inum is SELECT instance_number FROM dba_hist_snapshot WHERE dbid = l_dbid GROUP BY instance_number ORDER BY instance_number; BEGIN for l_instance_number in cur_inum loop
l_last_snap := NULL;
FOR cur_snap IN (SELECT snap_id
FROM dba_hist_snapshot
WHERE instance_number = l_instance_number.instance_number
AND snap_id BETWEEN l_snap_start AND l_snap_end
ORDER BY snap_id)
LOOP
IF l_last_snap IS NOT NULL THEN
l_file := UTL_FILE.fopen(l_dir, 'awr_' ||l_instance_number.instance_number||'_'|| l_last_snap || '_' || cur_snap.snap_id || '.html', 'w', 32767); FOR cur_rep IN (SELECT output
FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_html(l_dbid, l_instance_number.instance_number, l_last_snap, cur_snap.snap_id)))
LOOP
UTL_FILE.put_line(l_file, cur_rep.output);
END LOOP;
UTL_FILE.fclose(l_file);
END IF;
l_last_snap := cur_snap.snap_id;
END LOOP;
end loop; EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
RAISE;
END;
/

 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

shell 脚本实现参考:

#!/bin/sh
# version 1.0 created by sprilich 20121101
# version 1.2 edited by sprilich 20121214
# set the environment
#ORACLE_SID=eupdb
#ORACLE_HOME=/u01/oracle/product/db10gr2
ORACLE_SID=portaldb1
ORACLE_HOME="$ORACLE_HOME"
PATH=$ORACLE_HOME/bin:$PATH
CONNECTSTR=" / as sysdba"
#BEGIN_ID="223"
#END_ID="226"
BEGIN_TIME="20140504_00:00:00"
END_TIME="20140506_12:00:00"
#FTPSERVERIP="10.193.16.86"
#FTPUSER="ftpuser"
#FTPPASS="1qaz2wsx"
export ORACLE_SID
export ORACLE_HOME
export PATH function Dbid {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off
select DBID from v\$database;
exit
EOF
} Instnum() {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off
select instance_number from v\$instance;
exit
EOF
} Instname() {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off
select instance_name from v\$instance;
exit
EOF
} function Snap_id_like_time {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off;
select SNAP_ID from dba_hist_snapshot
where to_char(end_interval_time,'hh24') in (9,10,11,12,14,15,17)
and trunc(end_interval_time,'mi')> trunc(sysdate-1)
and instance_number in (select instance_number from v\$instance)
order by snap_id;
exit
EOF
} function Snap_id_between_time {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off;
select SNAP_ID from dba_hist_snapshot
where trunc(end_interval_time,'hh')>= trunc(to_date('$BEGIN_TIME','YYYYMMDD_HH24:MI:SS'),'hh')
and trunc(end_interval_time,'hh')<= trunc(to_date('$END_TIME','YYYYMMDD_HH24:MI:SS'),'hh')
and instance_number in (select instance_number from v\$instance)
order by snap_id;
exit
EOF
} function Snap_id_between_id {
sqlplus -S $CONNECTSTR <<EOF
set pages 0 termout off verify off feedback off;
select SNAP_ID from dba_hist_snapshot
where snap_id>= to_number($BEGIN_ID)
and snap_id<= to_number($END_ID)
and instance_number in (select instance_number from v\$instance)
order by snap_id;
exit
EOF
} echo "==========++++++++++++++==========="; CMDPM=`echo $1 | awk '{print tolower($1)}'`
case $CMDPM in
bi | -bi | byid)
SNAP_ID=`Snap_id_between_id`
;;
bt | -bt | bytime)
SNAP_ID=`Snap_id_between_time`
;;
lt | -lt | liketime)
SNAP_ID=`Snap_id_like_time`
;;
*)
#SNAP_ID=`Snap_id_like_time`
echo "please usage like : $0 -bt"
;;
esac echo "$SNAP_ID";
echo "==========++++++++++++++==========="; #Lftp to sftpServer .lftp Just fo Linux.
function Lftp_awr_report {
cd .
for VAR in *.htm*
do
lftp -u ${FTPUSER},${FTPPASS} sftp://${FTPSERVERIP}<<EOF
cd /u01/docdata/olm/xh/121.160
put ${VAR}
bye
EOF
done;
} #FTP to ftpServer
function Ftp_awr_report {
cd /tmp
HOSTNAME=`hostname`;
LOCALDIR="olm/xh/`grep ${HOSTNAME} /etc/hosts|awk '{print $1;}'|head -1`";
ftp -n ${FTPSERVERIP} <<EOF
passive
prompt
user ${FTPUSER} ${FTPPASS}
cd ${LOCALDIR}
binary
mput *.html
ascii
mput out222*.log
bye
EOF
} function Create_awr_report {
for snap_id_line in $SNAP_ID ; do
bid="$eid"
eid="$snap_id_line"
if [ "$bid" != "" -a "$eid" != "" ] ; then
sqlplus -S $CONNECTSTR <<EOF
set echo off;
set veri off;
set feedback off;
set termout on;
set heading off;
set trimspool on;
set linesize 1500;
set termout off;
column report_name new_value report_name noprint;
select name1 || name2 as report_name
from (select a.snap_id as begin_snap_id,a.end_interval_time as begin_time,
to_char(a.end_interval_time, 'yyyymmdd_') ||
'`Instname`'||to_char(a.end_interval_time, '_hh24')||
to_char(a.end_interval_time, 'mi') || '-' as name1
from dba_hist_snapshot a
where a.snap_id = $bid
and a.instance_number = `Instnum`) t1,
(select b.snap_id as end_snap_id,b.end_interval_time as end_time,
to_char(b.end_interval_time, 'hh24') ||
to_char(b.end_interval_time, 'mi') || '.' || 'html ' name2
from dba_hist_snapshot b
where b.snap_id = $eid
and b.instance_number = `Instnum`) t2
where rownum < 2
and end_snap_id - begin_snap_id < 3
and end_time-begin_time<INTERVAL '2' HOUR;
set termout off;
spool &report_name;
select output from TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(`Dbid`,`Instnum`,$bid, $eid,0 ));
spool off;
set termout on;
clear columns sql;
ttitle off;
btitle off;
repfooter off;
exit
EOF
fi
done
} Create_awr_report;
#Ftp_awr_report;

国外哥们儿写的SQL参考:

 REM http://flashdba.com/database/useful-scripts/awr-generator/
REM AWR-Generator.sql: Script for creating multiple consecutive Oracle AWR Reports
REM
REM Creates an output SQL script which, when run, will generate all AWR Reports
REM between the specificed start and end snapshot IDs, for all instances
REM
REM For educational purposes only - no warranty is provided
REM Test thoroughly - use at your own risk
REM set feedback off
set echo off
set verify off
set timing off -- Set AWR_FORMAT to "text" or "html"
define AWR_FORMAT = 'text'
define DEFAULT_OUTPUT_FILENAME = 'awr-generate.sql'
define NO_ADDM = 0 -- Get values for dbid and inst_num before calling awrinput.sql set echo off heading on
column inst_num heading "Inst Num" new_value inst_num format 99999;
column inst_name heading "Instance" new_value inst_name format a12;
column db_name heading "DB Name" new_value db_name format a12;
column dbid heading "DB Id" new_value dbid format 9999999999 just c; prompt
prompt Current Instance
prompt ~~~~~~~~~~~~~~~~ select d.dbid dbid
, d.name db_name
, i.instance_number inst_num
, i.instance_name inst_name
from v$database d,
v$instance i;
-- Call the Oracle common input script to setup start and end snap ids
@@?/rdbms/admin/awrinput.sql -- Ask the user for the name of the output script
prompt
prompt Specify output script name
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt This script produces output in the form of another SQL script
prompt The output script contains the commands to generate the AWR Reports
prompt
prompt The default output file name is &DEFAULT_OUTPUT_FILENAME
prompt To accept this name, press <return> to continue, otherwise enter an alternative
prompt set heading off
column outfile_name new_value outfile_name noprint;
select 'Using the output file name ' || nvl('&&outfile_name','&DEFAULT_OUTPUT_FILENAME')
, nvl('&&outfile_name','&DEFAULT_OUTPUT_FILENAME') outfile_name
from sys.dual; set linesize 800
set serverout on
set termout off -- spool to outputfile
spool &outfile_name -- write script header comments
prompt REM Temporary script created by awr-generator.sql
prompt REM Used to create multiple AWR reports between two snapshots
select 'REM Created by user '||user||' on '||sys_context('userenv', 'host')||' at '||to_char(sysdate, 'DD-MON-YYYY HH24:MI') from dual; set heading on -- Begin iterating through snapshots and generating reports
DECLARE c_dbid CONSTANT NUMBER := :dbid;
c_inst_num CONSTANT NUMBER := :inst_num;
c_start_snap_id CONSTANT NUMBER := :bid;
c_end_snap_id CONSTANT NUMBER := :eid;
c_awr_options CONSTANT NUMBER := &&NO_ADDM;
c_report_type CONSTANT CHAR(4):= '&&AWR_FORMAT';
v_awr_reportname VARCHAR2(100);
v_report_suffix CHAR(5); CURSOR c_snapshots IS
select inst_num, start_snap_id, end_snap_id
from (
select s.instance_number as inst_num,
s.snap_id as start_snap_id,
lead(s.snap_id,1,null) over (partition by s.instance_number order by s.snap_id) as end_snap_id
from dba_hist_snapshot s
where s.dbid = c_dbid
and s.snap_id >= c_start_snap_id
and s.snap_id <= c_end_snap_id
)
where end_snap_id is not null
order by inst_num, start_snap_id; BEGIN dbms_output.put_line('');
dbms_output.put_line('prompt Beginning AWR Generation...'); dbms_output.put_line('set heading off feedback off lines 800 pages 5000 trimspool on trimout on'); -- Determine report type (html or text)
IF c_report_type = 'html' THEN
v_report_suffix := '.html';
ELSE
v_report_suffix := '.txt';
END IF; -- Iterate through snapshots
FOR cr_snapshot in c_snapshots
LOOP
-- Construct filename for AWR report
v_awr_reportname := 'awrrpt_'||cr_snapshot.inst_num||'_'||cr_snapshot.start_snap_id||'_'||cr_snapshot.end_snap_id||v_report_suffix; dbms_output.put_line('prompt Creating AWR Report '||v_awr_reportname
||' for instance number '||cr_snapshot.inst_num||' snapshots '||cr_snapshot.start_snap_id||' to '||cr_snapshot.end_snap_id);
dbms_output.put_line('prompt'); -- Disable terminal output to stop AWR text appearing on screen
dbms_output.put_line('set termout off'); -- Set spool to create AWR report file
dbms_output.put_line('spool '||v_awr_reportname); -- call the table function to generate the report
IF c_report_type = 'html' THEN
dbms_output.put_line('select output from table(dbms_workload_repository.awr_report_html('
||c_dbid||','||cr_snapshot.inst_num||','||cr_snapshot.start_snap_id||','||cr_snapshot.end_snap_id||','||c_awr_options||'));');
ELSE
dbms_output.put_line('select output from table(dbms_workload_repository.awr_report_text('
||c_dbid||','||cr_snapshot.inst_num||','||cr_snapshot.start_snap_id||','||cr_snapshot.end_snap_id||','||c_awr_options||'));');
END IF; dbms_output.put_line('spool off'); -- Enable terminal output having finished generating AWR report
dbms_output.put_line('set termout on'); END LOOP; dbms_output.put_line('set heading on feedback 6 lines 100 pages 45'); dbms_output.put_line('prompt AWR Generation Complete'); -- EXCEPTION HANDLER? END;
/ spool off set termout on prompt
prompt Script written to &outfile_name - check and run in order to generate AWR reports...
prompt --clear columns sql
undefine outfile_name
undefine AWR_FORMAT
undefine DEFAULT_OUTPUT_FILENAME
undefine NO_ADDM
undefine OUTFILE_NAME set feedback 6 verify on lines 100 pages 45

oracle批量导出AWR报告的更多相关文章

  1. 批量生成AWR报告(转载总结)

    [前提] 对Oracle进行性能分析其中一个“帮手”就是Oracle的AWR报告 PS:Oracle的企业版才有AWR报告,标准版是没有的{可以导出来,但是没有数据显示} [需求] 当需要针对某个月的 ...

  2. oracle手工生成AWR报告方法记录

    AWR(Automatic Workload Repository)报告是我们进行日常数据库性能评定.问题SQL发现的重要手段.熟练掌握AWR报告,是做好开发.运维DBA工作的重要基本功. AWR报告 ...

  3. 【oracle】生成AWR报告

    [第一步]找到awrrpt.sql文件 [ora11g@vm-kvm11820-app ~]$ locate awrrpt.sql /DATA/opt/app/ora11g/product//rdbm ...

  4. oracle命令生成AWR报告

    --命令生成AWR报告oracle@linux:~> sqlplus / as sysdba SQL*Plus: Release 11.1.0.7.0 - Production on Fri A ...

  5. oracle手工生成AWR报告方法

    AWR(Automatic Workload Repository)报告是我们进行日常数据库性能评定.问题SQL发现的重要手段.熟练掌握AWR报告,是做好开发.运维DBA工作的重要基本功. AWR报告 ...

  6. Oracle Awr报告_awr报告解读_基础简要信息

    导出 关于awr报告的导出,上一篇博客已经进行过讲述了.博客链接地址:https://www.cnblogs.com/liyasong/p/oracle_report1.html  这里就不再赘述. ...

  7. Oracle AWR报告提取方法

    本文旨在用来指导项目人员自行提取Oracle数据库的AWR报告. 1.当前连接实例的AWR报告提取:@?/rdbms/admin/awrrpt 2.RAC的其他实例AWR报告提取:@?/rdbms/a ...

  8. ORACLE AWR报告数据的导入导出实践

    关于AWR的快照数据可以导出.导入,一直没有亲手实践过.今天动手测试了一下如何导出.导入AWR数据,将AWR的数据从一测试服务器,导入到另外一台测试服务器. SQL> @?/rdbms/admi ...

  9. ORACLE 10g AWR报告设置总结

      1:查看.修改AWR报告快照数据的采样间隔.保存策略 SQL> COL DBID FOR 999999999999 SQL> COL SNAP_INTERVAL FOR A26 SQL ...

随机推荐

  1. 解决IE6下png图片不透明

    ie6着实是非常让人讨厌,显示一张图片,也要带着灰白色的背景色,一张好好的png图片就这么不透明了. 用n多中网上的方式,差点成功的就还有这个了 _background: none; _filter: ...

  2. 在delphi中, reintroduce作用

    在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用     reintroduce   关键字告知编译器,可以消除警告信息.如:          TPar ...

  3. SharePoint 2010遍历文档库中所有的文件,文件夹

    转:http://hi.baidu.com/sygwin/item/f99600849d51a12b110ef3eb 创建一个可视WebPart,并拖放一个label控件到ascx文件上,用于显示结果 ...

  4. 编程式事务、XML配置事务、注解实现事务

    Spring2.0框架的事务处理有两大类: 1 编码式事务 , 这个不说. 2 声明式事务 , 就说这个. 声明式事务又有三种实现方法: 1 (第一种) 最早的方法,用TransactionProxy ...

  5. codeforces 700B Connecting Universities 贪心dfs

    分析:这个题一眼看上去很难,但是正着做不行,我们换个角度:考虑每条边的贡献 因为是一棵树,所以一条边把树分成两个集合,假如左边有x个学校,右边有y个学校 贪心地想,让每条边在学校的路径上最多,所以贡献 ...

  6. C语言反转字符串

    也是面腾讯的一道编程题=,= 这题比较简单 代码如下: #include <stdio.h> #include <string.h> // 非递归实现字符串反转 char *r ...

  7. Python之正则

    从学习Python至今,发现很多时候是将Python作为一种工具.特别在文本处理方面,使用起来更是游刃有余. 说到文本处理,那么正则表达式必然是一个绝好的工具,它能将一些繁杂的字符搜索或者替换以非常简 ...

  8. 网页抓取:PHP实现网页爬虫方式小结

    来源:http://www.ido321.com/1158.html 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现 ...

  9. XNA Game Studio 4.0 Programming 随便读,随便记 “Game Class”

    XNA 中的 Game 类,是所有神奇事情发生的地方.几乎游戏中所有的事情都由它来操办. 它是项目中的王者,让我们深入窥探一番: 虚方法 Game 本身从众多其它地方继续了许多能力才能完成游戏中的事情 ...

  10. Things App Engine Doesn't Do...Yet

    当人们第一次使用App Engine的时候,他们会问一些App Engine不会做的事情.其中的一些事情Google在不久的将来会实现的,还有一些违背了App Engine设计的本质,将不可能增加(到 ...