Linux/Unix shell 自动发送AWR report(二)

简介:

 观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告。不过awrrpt.sql脚本执行时需要我们提供一些交互信息,因此可以将其整合到shell脚本中来实现自动产生指定时段的awr报告并发送给相关人员。本文对Linux/Unix shell 自动发送AWR report的功能进行了完善和补充。   

 

1、shell脚本

[python]  view plain  copy
 
 print?
  1. robin@SZDB:~/dba_scripts/custom/awr> more autoawr_by_time.sh  
  2. #!/bin/bash  
  3. # --------------------------------------------------------------------------+  
  4. #                 Generate AWR report and send mail automatically           |  
  5. #   Filename: autoawr_by_time.sh                                            |  
  6. #   Desc:                                                                   |  
  7. #       The script use to generate awr report by time period.               |  
  8. #       Three parameter for it.                                             |  
  9. #           para1: <ORACLE_SID>   mandatory parameter                       |  
  10. #           para2: [begin time]   optional parameter                        |    
  11. #           para3: [end time  ]   optional parameter                        |  
  12. #       Deploy it by crontab as requirement                                 |    
  13. #   Usage:                                                                  |  
  14. #       ./autoawr_by_time.sh <instance_name> [begin time] [end time]        |    
  15. #   Example:                                                                |  
  16. #       ./autoawr_by_time.sh TESTDB                                         |     
  17. #            --default,time period is from last midnight to today midnight  |  
  18. #       ./autoawr_by_time.sh TESTDB 2013031009                              |  
  19. #            --time period is from 2013031009 to now                        |  
  20. #       ./autoawr_by_time.sh TESTDB 2013031009 2013031012                   |  
  21. #            --time period by speicifed                                     |   
  22. #   Author : Robinson                                                       |   
  23. #   Blog   : http://blog.csdn.net/robinson_0612                             |  
  24. # --------------------------------------------------------------------------+  
  25. #  
  26. # -------------------------------  
  27. #  Set environment here   
  28. # ------------------------------  
  29.   
  30. if [ -f ~/.bash_profile ]; then  
  31.     . ~/.bash_profile  
  32. fi  
  33.   
  34. # ------------------------------------------------------------  
  35. #  Check the parameter, if no specify,then use default value  
  36. # ------------------------------------------------------------  
  37.   
  38. if [ -z "${1}" ] ;then  
  39.     echo "Usage: "  
  40.     echo "      `basename $0` <ORACLE_SID> [begin_date] [end_date]"  
  41. fi  
  42.   
  43. if [ -z "${3}" ] && [ -z "${2}" ];then  
  44.     begin_date=`date -d yesterday +%Y%m%d`'00'  
  45.     end_date=`date +%Y%m%d`'00'  
  46. elif [ -z "${3}" ]; then  
  47.     begin_date=${2}  
  48.     end_date=`date +%Y%m%d%H`  
  49. else  
  50.     begin_date=${2}  
  51.     end_date=${3}  
  52. fi  
  53.   
  54. ORACLE_SID=${1}  
  55. export ORACLE_SID begin_date end_date   
  56. export MACHINE=`hostname`  
  57. export MAIL_DIR=/users/robin/dba_scripts/sendEmail-v1.56  
  58. export MAIL_LIST='Robinson.chen@<span style="color:#000000;">12306</span>.com'  
  59. export AWR_CMD=/users/robin/dba_scripts/custom/awr  
  60. export AWR_DIR=/users/robin/dba_scripts/custom/awr/report/${ORACLE_SID}  
  61. export MAIL_FM='oracle@szdb.com'  
  62. RETENTION=31  
  63.   
  64. echo $ORACLE_SID   
  65. echo $begin_date  
  66. echo $end_date  
  67. # --------------------------------------------------------------------  
  68. #  Check the directory for store awr report,if not exist, create it  
  69. # --------------------------------------------------------------------  
  70.   
  71. if [ ! -d "${AWR_DIR}" ]; then  
  72.     mkdir -p ${AWR_DIR}  
  73. fi  
  74.   
  75. # ----------------------------------------------  
  76. # check if the database is running, if not exit  
  77. # ----------------------------------------------  
  78.   
  79. db_stat=`ps -ef | grep pmon_$ORACLE_SID | grep -v grep| cut -f3 -d_`  
  80. if [ -z "$db_stat" ]; then  
  81.     #date >/tmp/db_${ORACLE_SID}_stauts.log  
  82.     echo " $ORACLE_SID is not available on ${MACHINE} !!!"   # >>/tmp/db_${ORACLE_SID}_stauts.log   
  83.     MAIL_SUB=" $ORACLE_SID is not available on ${MACHINE} !!!"  
  84.     MAIL_BODY=" $ORACLE_SID is not available on ${MACHINE} at `date` when try to generate AWR."  
  85.     $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY   
  86.     exit 1  
  87. fi;  
  88.   
  89. # ---------------------------------------------  
  90. #  Generate the awr report  
  91. # ---------------------------------------------  
  92.   
  93. sqlplus -S "/ as sysdba" @${AWR_CMD}/autoawr_by_time.sql $begin_date $end_date   
  94.   
  95. status=$?  
  96. if [ $status != 0 ];then  
  97.     echo " $ORACLE_SID is not available on ${MACHINE} !!!"   # >>/tmp/db_${ORACLE_SID}_stauts.log  
  98.     MAIL_SUB=" Occurred error while generate AWR for ${ORACLE_SID}  !!!"  
  99.     MAIL_BODY=" Some exceptions encountered during generate AWR report for $ORACLE_SID on `hostname`."  
  100.     $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY  
  101.     exit  
  102. fi  
  103.   
  104. # ------------------------------------------------  
  105. # Send email with AWR report  
  106. # ------------------------------------------------  
  107.   
  108. filename=`ls ${AWR_DIR}/${ORACLE_SID}_awrrpt_?_${begin_date}_${end_date}*`  
  109. if [ -e "${filename}" ];then  
  110.     MAIL_SUB="AWR report from ${ORACLE_SID} on `hostname`."  
  111.     MAIL_BODY="This is an AWR report from ${ORACLE_SID} on `hostname`.Time period: $begin_date,$end_date. "  
  112.     $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY -a ${filename}  
  113.     echo ${filename}  
  114. fi  
  115.   
  116. # ------------------------------------------------  
  117. # Removing files older than $RETENTION parameter   
  118. # ------------------------------------------------  
  119.   
  120. find ${AWR_DIR} -name "*awrrpt*" -mtime +$RETENTION -exec rm {} \;  
  121.   
  122. exit  

2、产生awr report 的sql脚本

[sql]  view plain  copy
 
 print?
  1. robin@SZDB:~/dba_scripts/custom/awr> more autoawr_by_time.sql  
  2. SET ECHO OFF;  
  3. SET VERI OFF;  
  4. SET FEEDBACK OFF;  
  5. SET TERMOUT ON;  
  6. SET HEADING OFF;  
  7. SET TRIMSPOOL ON;  
  8.   
  9. VARIABLE rpt_options NUMBER;  
  10. DEFINE no_options = 0;  
  11.   
  12. define ENABLE_ADDM = 8;  
  13.   
  14. REM according to your needs, the value can be 'text' or 'html'  
  15.   
  16. DEFINE report_type='html';  
  17.   
  18. BEGIN  
  19.    :rpt_options := &no_options;  
  20. END;  
  21. /  
  22.   
  23. VARIABLE dbid NUMBER;  
  24. VARIABLE inst_num NUMBER;  
  25. VARIABLE bid NUMBER;  
  26. VARIABLE eid NUMBER;  
  27.   
  28. BEGIN  
  29.       SELECT snap_id  
  30.         INTO :bid  
  31.         FROM dba_hist_snapshot  
  32.        WHERE TO_CHAR (end_interval_time, 'yyyymmddhh24') = '&1';  
  33.   
  34.       SELECT snap_id  
  35.         INTO :eid  
  36.         FROM dba_hist_snapshot  
  37.        WHERE TO_CHAR (end_interval_time, 'yyyymmddhh24') = '&2';  
  38.   
  39.    SELECT dbid INTO :dbid FROM v$database;  
  40.   
  41.    SELECT instance_number INTO :inst_num FROM v$instance;  
  42. END;  
  43. /  
  44.   
  45. --print dbid;  
  46. --print bid;  
  47. --print eid;  
  48. --print inst_num;  
  49.   
  50. COLUMN ext NEW_VALUE ext NOPRINT  
  51. COLUMN fn_name NEW_VALUE fn_name NOPRINT;  
  52. COLUMN lnsz NEW_VALUE lnsz NOPRINT;  
  53. SELECT 'txt' ext  
  54.   FROM DUAL  
  55.  WHERE LOWER ('&report_type') = 'text';  
  56.   
  57. SELECT 'html' ext  
  58.   FROM DUAL  
  59.  WHERE LOWER ('&report_type') = 'html';  
  60.   
  61. SELECT 'awr_report_text' fn_name  
  62.   FROM DUAL  
  63.  WHERE LOWER ('&report_type') = 'text';  
  64.   
  65. SELECT 'awr_report_html' fn_name  
  66.   FROM DUAL  
  67.  WHERE LOWER ('&report_type') = 'html';  
  68.   
  69. SELECT '80' lnsz  
  70.   FROM DUAL  
  71.  WHERE LOWER ('&report_type') = 'text';  
  72.   
  73. SELECT '1500' lnsz  
  74.   FROM DUAL  
  75.  WHERE LOWER ('&report_type') = 'html';  
  76.   
  77. set linesize &lnsz;  
  78. COLUMN report_name NEW_VALUE report_name NOPRINT;  
  79.   
  80. SELECT instance_name || '_awrrpt_' || instance_number || '_' ||'&&1'||'_'||'&&2'|| '.' || '&ext'  
  81.           report_name  
  82.   FROM v$instance a,  
  83.        (SELECT TO_CHAR (begin_interval_time, 'yyyymmdd') timestamp  
  84.           FROM dba_hist_snapshot  
  85.          WHERE snap_id = :bid) b;  
  86.   
  87. SET TERMOUT OFF;  
  88. SPOOL ${AWR_DIR}/&report_name;  
  89. --SPOOL &report_name  
  90.   
  91. SELECT output  
  92.   FROM TABLE (DBMS_WORKLOAD_REPOSITORY.&fn_name (:dbid,  
  93.                                                  :inst_num,  
  94.                                                  :bid,  
  95.                                                  :eid,  
  96.                                                  :rpt_options));  
  97. SPOOL OFF;  
  98. SET TERMOUT ON;  
  99. CLEAR COLUMNS SQL;  
  100. TTITLE OFF;  
  101. BTITLE OFF;  
  102. REPFOOTER OFF;  
  103. SET TRIMSPOOL OFF;  
  104.   
  105. UNDEFINE report_name  
  106. UNDEFINE report_type  
  107. UNDEFINE fn_name  
  108. UNDEFINE lnsz  
  109. UNDEFINE no_options  
  110. exit;   

3、补充说明
a、该脚本实现了基于不同时段,不同instance自动生成awr report,具体如下
b、用法为./autoawr_by_time.sh <instance_name> [begin time] [end time],可以用于随时随地直接生成awr report
c、在省略[begin time] [end time]的情形下会自动生成昨天凌晨至今天凌晨的awr report
d、当仅仅省略[end time]时则从[begin time]开始至当前的最大snap_id来生成awr report
e、当[begin time] [end time]都被指定时则生成指定时段的awr report
f、通过调用sendEmail发送awr report,具体参考:不可或缺的 sendEmail

 

4、部署参考

[python]  view plain  copy
 
 print?
    1. #如果仅仅需要一整天的awr report,直接将其部署到crontab即可。  
    2. #如果需要一整天以及不同时段的awr report,则可以考虑采用如下方式来部署,将其合并到一个shell文件  
    3. robin@SZDB:~/dba_scripts/custom/awr> more awr.sh  
    4. #!/bin/bash  
    5. dt=`date +%Y%m%d`  
    6. start_date=$dt'05'  
    7. end_date=$dt'09'  
    8. /users/robin/dba_scripts/custom/awr/autoawr_by_time.sh CNMMBO               #获取一整天的awr report  
    9. /users/robin/dba_scripts/custom/awr/autoawr_by_time.sh CNMMBO $start_date   #获取指定起始时间至今的awr report  
    10. /users/robin/dba_scripts/custom/awr/autoawr_by_time.sh CNMMBO $start_date $end_date #获取指定时间段的awr report  
    11. exit   
    12. robin@SZDB:~/dba_scripts/custom/awr> crontab -l  
    13. # DO NOT EDIT THIS FILE - edit the master and reinstall.  
    14. 45  11 * * * /users/robin/dba_scripts/custom/awr/awr.sh 
    15. 转:http://blog.csdn.net/leshami/article/details/8687690
文章可以转载,必须以链接形式标明出处。

本文转自 张冲andy 博客园博客,原文链接: http://www.cnblogs.com/andy6/p/5877500.html   ,如需转载请自行联系原作者
相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
69 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
28天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
569 2
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
30 0
|
3月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
4月前
|
Ubuntu 安全 Unix
在Linux中,有哪几种linux/unix发行版本?
在Linux中,有哪几种linux/unix发行版本?
|
4月前
|
监控 Shell Linux
在Linux中,如何使用shell脚本检测磁盘使用率?
在Linux中,如何使用shell脚本检测磁盘使用率?
下一篇
无影云桌面