Oracle->自定义调用AWR&ADDM

需求描述:

  前面设定每天自动生成AWR用于提供前一天的数据库状态信息,但因数据库和信息过多不利于直观检查。此次新增ADDM诊断。

ADDM诊断脚本分析:

    $ORACLE_HOME/rdbms/admin/addmrpt.sql--ADDM自动诊断资料库的主脚本

      用于显示当前的数据库和实例,并调用@@addmrpti.sql脚本

  1. [oracle@xxx~]$ cat $ORACLE_HOME/rdbms/admin/addmrpt.sql |grep -v "#"|grep -v "-"|grep -v "Rem"|grep -v "^$"
  2. define num_days = 3;
  3. set heading on echo off feedback off verify off underline on timing off;
  4. column inst_num heading "Inst Num" new_value inst_num format 99999;
  5. column inst_name heading "Instance" new_value inst_name format a12;
  6. column db_name heading "DB Name" new_value db_name format a12;
  7. column dbid heading "DB Id" new_value dbid format 9999999999 just c;
  8. prompt
  9. prompt Current Instance
  10. prompt ~~~~~~~~~~~~~~~~
  11. select d.dbid dbid
  12. , d.name db_name
  13. , i.instance_number inst_num
  14. , i.instance_name inst_name
  15. from v$database d,
  16. v$instance i;
  17. @@addmrpti
  18. set heading on echo off feedback 6 verify on underline on timing off;
  19. undefine num_days
  20. undefine report_name
  21. undefine inst_num
  22. undefine inst_name
  23. undefine db_name
  24. undefine dbid

   $ORACLE_HOME/rdbms/admin/addmrpti.sql ---查询当前snapshot快照点,接收用户输入,设置和执行dbms_advisor程序包。

    这两个sql脚本用于接收和显示awr快照点的信息下,需说明addm诊断报告会在每个awr快照点生成后自动产生。@@awrinput.sql

@@awrinpnm.sql &report_name_prefix &report_name_extension

  1. [oracle@xxxx~]$ cat $ORACLE_HOME/rdbms/admin/addmrpti.sql |grep -v "#"|grep -v "-"|grep -v "Rem"|grep -v "^$"
  2. define report_name_prefix = 'addmrpt_';
  3. define report_name_extension = '.txt';
  4. set heading on echo off feedback off verify off underline on timing off;
  5. @@awrinput.sql
  6. @@awrinpnm.sql &report_name_prefix &report_name_extension
  7. set pagesize 0;
  8. set heading off echo off feedback off verify off;
  9. variable task_name varchar2(40);
  10. prompt
  11. prompt
  12. prompt Running the ADDM analysis on the specified pair of snapshots ...
  13. prompt
  14. begin
  15. declare
  16. id number;
  17. name varchar2(100);
  18. descr varchar2(500);
  19. BEGIN
  20. name := '';
  21. descr := 'ADDM run: snapshots [' || :bid || ', '
  22. || :eid || '], instance ' || :inst_num
  23. || ', database id ' || :dbid;
  24. dbms_advisor.create_task('ADDM',id,name,descr,null);
  25. :task_name := name;
  26. dbms_advisor.set_task_parameter(name, 'START_SNAPSHOT', :bid);
  27. dbms_advisor.set_task_parameter(name, 'END_SNAPSHOT', :eid);
  28. dbms_advisor.set_task_parameter(name, 'INSTANCE', :inst_num);
  29. dbms_advisor.set_task_parameter(name, 'DB_ID', :dbid);
  30. dbms_advisor.execute_task(name);
  31. end;
  32. end;
  33. /
  34. prompt
  35. prompt Generating the ADDM report for this analysis ...
  36. prompt
  37. prompt
  38. spool &report_name;
  39. set long 1000000 pagesize 0 longchunksize 1000
  40. column get_clob format a80
  41. select dbms_advisor.get_task_report(:task_name, 'TEXT', 'TYPICAL')
  42. from sys.dual;
  43. spool off;
  44. prompt
  45. prompt End of Report
  46. prompt Report written to &report_name.
  47. set termout off;
  48. clear columns sql;
  49. ttitle off;
  50. btitle off;
  51. repfooter off;
  52. set pagesize 14;
  53. set heading on echo off feedback 6 verify on underline on timing off;
  54. set long 80 longchunksize 80
  55. set termout on
  56. undefine dbid
  57. undefine inst_num
  58. undefine num_days
  59. undefine begin_snap
  60. undefine end_snap
  61. undefine report_name
  62. undefine report_name_prefix
  63. undefine report_name_extension
  64. whenever sqlerror continue;

开始构造自定义SQL脚本<ora_auto_addmrpt.sql>

  1. [oracle@xxxxxx~]$ cat /opt/app/oracle/ora_auto/ora_auto_addmrpt.sql
  2. set echo off;
  3. set veri off;
  4. set feedback off;
  5. set termout on;
  6. set heading off;
  7. set pagesize 0;
  8. set heading off echo off feedback off verify off;
  9. variable task_name varchar2(40);
  10. variable dbid number;
  11. variable inst_num number;
  12. variable bid number;
  13. variable eid number;
  14. variable dbname varchar2(9);
  15. variable btime number;
  16. variable etime number;
  17. begin
  18. select dbid into :dbid from v$database;
  19. select instance_number into :inst_num from v$instance;
  20. select max(snap_id)-24 into :bid from dba_hist_snapshot where DBID=:dbid;
  21. select max(snap_id) into :eid from dba_hist_snapshot where DBID=:dbid;
  22. select lower(NAME) into :dbname from v$database;
  23. select to_char(end_interval_time,'YYYYMMDDHH24') into :btime from dba_hist_snapshot where snap_id=:bid;
  24. select to_char(end_interval_time,'DDHH24') into :etime from dba_hist_snapshot where snap_id=:eid;
  25.  
  26. end;
  27. /
  28.  
  29. --prompt
  30. --prompt
  31. --prompt Running the ADDM analysis on the specified pair of snapshots ...
  32. --prompt
  33. begin
  34. declare
  35. id number;
  36. name varchar2(100);
  37. descr varchar2(500);
  38. BEGIN
  39. name := '';
  40. descr := 'ADDM run: snapshots [' || :bid || ', '
  41. || :eid || '], instance ' || :inst_num
  42. || ', database id ' || :dbid;
  43. dbms_advisor.create_task('ADDM',id,name,descr,null);
  44. :task_name := name;
  45. dbms_advisor.set_task_parameter(name, 'START_SNAPSHOT', :bid);
  46. dbms_advisor.set_task_parameter(name, 'END_SNAPSHOT', :eid);
  47. dbms_advisor.set_task_parameter(name, 'INSTANCE', :inst_num);
  48. dbms_advisor.set_task_parameter(name, 'DB_ID', :dbid);
  49. dbms_advisor.execute_task(name);
  50. end;
  51. end;
  52. /
  53. --prompt
  54. --prompt Generating the ADDM report for this analysis ...
  55. --prompt
  56. --prompt
  57. column report_name new_value report_name noprint;
  58.  
  59. select :dbname||'_'||:btime||'to'||:etime||'.'||'txt' report_name from dual;
  60. set termout off;
  61. spool &report_name;
  62. set long 1000000 pagesize 0 longchunksize 1000
  63. column get_clob format a80
  64. select dbms_advisor.get_task_report(:task_name, 'TEXT', 'TYPICAL')
  65. from sys.dual;
  66. spool off;
  67. set termout on;
  68. prompt &report_name
  69. undefine dbid
  70. undefine inst_num
  71. undefine report_name
  72. exit

将ADDM sql脚本整合到自定义调用AWR shell脚本中

  1. Script:
  2. [oracle@ ~]$ cat /opt/app/oracle/ora_auto/oracle_auto_awr.sh
  3. #!/bin/bash
  4.  
  5. # auto gather awrrpt.sql
  6. #
  7. # parameters:
  8. # $ -> SID
  9. #
  10. # The whole package includes files;
  11. # oracle_auto_awr.sh(this file)
  12. # ora_auto_awrrpt.sql
  13. #
  14.  
  15. #引用oracle数据库环境变量
  16. . /home/oracle/.bash_profile ->(注意加上oracle环境变量,不然crontab排程运行时不能正常执行sql脚本). /home/oracle/.bash_profile
  17. PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin
  18. ORACLE_BASE=/opt/app/oracle;export ORACLE_BASE
  19. ORACLE_HOME=$ORACLE_BASE/product/11.2./dbhome_1;export ORACLE_HOME
  20. ORA_AUTO_PATH='/opt/app/oracle/ora_auto'
  21. #自定义awr脚本的SQL语句
  22. ORACLE_SQL=$ORA_AUTO_PATH/ora_auto_awrrpt.sql
    ORACLE_ADDM_SQL=$ORA_AUTO_PATH/ora_auto_addmrpt.sql
  23. DAY_TIME=`date +"%Y%m%d"`
  24. AWR_ZIP=AWR_$DAY_TIME.zip
  25. cd $ORA_AUTO_PATH
  26. echo "Dear Sir:">mail.log
  27. echo " This is oracle database Awr.">>mail.log
  28. mkdir -p $ORA_AUTO_PATH/$DAY_TIME
  29.  
  30. #脚本后跟上多个数据库名,用于集合
  31. array_1=$@
  32. for sid in ${array_1[@]}
  33. do
  34.  
  35. sleep
  36.  
  37. tnschk=`tnsping $sid`
  38. tnschk2=` echo $tnschk | grep -c OK`
  39. if [ ${tnschk2} -eq ] ; then
  40. echo " $sid start gather." >>mail.log
  41.  
  42. ###连接数据库字符串,注意连接数据库的账户是否有权限执行awr
  43. ORACLE_CONN='xxx/xxxx@'$sid
  44. $ORACLE_HOME/bin/sqlplus -s $ORACLE_CONN @$ORACLE_SQL >sqlplus_$sid_output.log
  45. $ORACLE_HOME/bin/sqlplus -s $ORACLE_CONN @$ORACLE_ADDM_SQL  >>sqlplus_${sid}_output.log
    ###将生成的档案名提取出来
  46. soput="`cat $ORA_AUTO_PATH/sqlplus_$sid_output.log|grep html`"
    addmsoput="`cat $ORA_AUTO_PATH/sqlplus_${sid}_output.log|grep txt`"
  47. if [ -f $soput ]; thenecho " mv $soput $ORA_AUTO_PATH/$DAY_TIME">>mail.log
  48. mv $soput $ORA_AUTO_PATH/$DAY_TIME
         mv $addmsoput $ORA_AUTO_PATH/$DAY_TIME
  49. fi
  50. else
  51. echo " No TNS Listener on $sid" >>mail.log
  52. fi
  53. done
  54. echo " zip -r $AWR_ZIP $DAY_TIME" >>mail.log
  55. #`/bin/tar -zcf $AWR_ZIP $DAY_TIME` 将awr报表进行压缩,减少邮件传输的流量
  56. `/usr/bin/zip -r $AWR_ZIP $DAY_TIME`
  57. echo " Thanks!">>mail.log
  58.  
  59. mutt -s "[CQ][SFIS DATABASE][AWR]: time: `date '+%y%m%d-%H%M'`" "接受邮件地址" -a $ORA_AUTO_PATH/$AWR_ZIP < $ORA_AUTO_PATH/mail.log
  60.  
  61. rm -rf $DAY_TIME
  62.  
  63. 设定排程[xxx.xxx.xx.x]
  64. * * * /xxx/app/oracle/ora_auto/oracle_auto_awr.sh oracle01 oracle02 oracle03

(Oracle)自定义调用AWR&ADDM的更多相关文章

  1. (Oracle)自定义调用AWR

    Oracle->自动发送AWR报告 2016年9月21日 09:31 需求描述: 每日或定期手动使用AWR报告来检查Oracle数据库状态不仅耗时也费力,需求使用脚本自动收集AWR报告.   分 ...

  2. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  3. Oracle中的AWR,全称为Automatic Workload Repository

    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库.它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时 ...

  4. Oracle快速收集AWR的方案

    记一种方便的awr收集方法,该脚本可以按小时收集目标时段的awr 素材:awr_generate.sql(具体脚本内容请见本文末尾) (1)将awr_generate.sql置于数据库服务器本地路径, ...

  5. Oracle自定义数据类型 1

    原文 oracle 自定义类型 type / create type 一 Oracle中的类型 类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nva ...

  6. Oracle自定义函数和存储过程示例,自定义函数与存储过程区别

    参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...

  7. Oracle自定义聚集函数

    今天工作中看见别人写的自定义聚集函数,所以一门心思的想搞懂,就在网上找资料了. 自定义聚集函数 自定义聚集函数接口简介 Oracle提供了很多预定义好的聚集函数,比如Max(), Sum(), AVG ...

  8. oracle 存储过程调用 执行

    oracle 存储过程调用 博客分类: 数据库相关   oracle存储过程 2011年02月11日 星期五 14:47 SQL中调用存储过程语句: call procedure_name(); 调用 ...

  9. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

随机推荐

  1. ES6入门——函数的扩展

    1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...

  2. Python学习系列-----第二章 操作符与表达式

    2.1 数学运算和赋值的简便方法 例如: 2.2 优先级 在python中运算符有优先级之分,高优先级的运算符先执行,低优先级的运算符后执行.下面是运算符优先级:(同一行的运算符具有相同的优先级) 2 ...

  3. QT5.3.1 Quick 开发(二) 项目类型的选择

    作为一个转行QT开发的新手,面对基于QML的开发时候 看到很多的项目类型感到很困惑,不知道应该怎么选择.如图: 经过研究发现QT widgets Application.QtQuick Applica ...

  4. Springmvc ajax跨域请求处理

    上次给一个网站写网站  前后端分离 最后跪在ajax跨域上面了  自己在网上找了个方法  亲试可用  记录一下 写一个类  继承HandlerInterceptorAdapter package co ...

  5. maven学习(七)后续扩展、资料

    写这几篇博客的来源是 "maven实战 + 网上的博客 + 平时使用的心得 ".记录的都是比较常用的东西,也有一些只做了大概了解.或者干脆直接略过,在这里做一下总结,如果有需要在进 ...

  6. 关于实现XX系统设计时所实现的质量属性战术

    可用性: 1)使用Try-catch对抛出的异常进行处理 2)使用Spring事务管理 易用性: 1)在类似删除相关选项时,弹出提示框,防止误操作 2)在不编辑基本信息时,对其进行折叠或者隐藏 3)提 ...

  7. 关于map容器的元素被无参初始化

    使用C++中的map容器定义一个mp,当你执行if语句判断mp[3]是否为1时,那么如果mp[3]以前不存在,此时mp[3]就会被无参初始化,second赋值为0. 以下的程序可以证明这一点.执行了第 ...

  8. Python初学者第六天 列表操作练习

    6day 列表练习: 1.创建一个空列表,命名为names,往里面添加old_drilver,rain,jack,shanshan,peiqi,black_girl: names = [] names ...

  9. v1.0.2-2017.04.26

    v1.0.2-2017.04.26 增加支付宝.微信查询接口 增加订单轮询工程 增加网关下单后发起订单轮询业务流程 v1.0.1-2017.04.05 修复分页乱码bug 增加支付密码字段.商户服务器 ...

  10. Python学习---线程基础学习

    线程基础 什么是线程(thread) 线程是CPU调度能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流[换言之,线程就是一堆指令集合], ...