Oracle 自动 AWR 报告方法

5 篇文章 0 订阅
2 篇文章 0 订阅

Oracle的AWR报告对性能调优与监控都很有用,一般都是在DB出现性能问题时跑出来分析。
虽然我们有各种Oracle自身如建立基线、或监控工具进行持续的性能监控,但目前来看里面的内容详细度跟AWR报告比还有不少差距。
那我们如何让AWR报告自动生成,然后每天直接拿来就看呢?
记录一个通用且简单的方法:

--1. 使用sys用户向dbma用户收取
grant select on dba_hist_snapshot to dbma;
grant read,write on directory DATA_PUMP_DIR to dbma;
grant execute on utl_file to dbma;
--2. 使用dbma用户部署存储过程
CREATE OR REPLACE PROCEDURE dbma_awrrpt as
  v_str  varchar2(32767);
  v_dbid varchar2(20);
  v_host varchar2(50);
  v_days number;
  v_bsnp varchar2(8);
  v_bday date;
  v_esnp varchar2(8);
  v_eday date;
  v_file UTL_FILE.file_type;
  v_dir  VARCHAR2(50) := 'DATA_PUMP_DIR';
begin
  --设置报告存放路径
  v_str  := v_str || 'cd /home/oracle/AWRRPT' ||  chr(10);
  --设置报告天数(最大取决DB设置,默认设置下为6天,超过6天可能因无法获取对应snapid无法生成报告)
  v_days := 1;
  --获取dbid
  select dbid into v_dbid from dba_hist_snapshot where rownum = 1;
  --设置默认开始日期
  select trunc(sysdate - v_days) into v_bday from dual;
  --设置默认结束日期
  select trunc(sysdate) into v_eday from dual;
  --报告天数转为获取报告清单天数
  v_days := v_days + 1;
  --拼接AWR报告自生成语句
  for p in (select inst_id, host_name from gv$instance order by 1) loop
    v_host := p.host_name;
    v_str  := v_str || 'sqlplus / as sysdba << EOF' ||  chr(10) ||
              '@?/rdbms/admin/awrrpti.sql' ||  chr(10) || 'html' ||  chr(10) ||
              v_dbid ||  chr(10) || p.inst_id ||  chr(10) || v_days ||
               chr(10);
    for q in (select snap_id, round(end_interval_time, 'HH24') sj
                from dba_hist_snapshot
               where to_char(round(end_interval_time, 'HH24'), 'HH24') = '00'
                 and (round(end_interval_time, 'HH24') = v_bday or
                      round(end_interval_time, 'HH24') = v_eday)
                 and instance_number = p.inst_id
               order by round(end_interval_time, 'HH24')) loop
      v_str := v_str || q.snap_id ||  chr(10);
    end loop;
    v_str := v_str || p.host_name || '_' || to_char(v_bday, 'YYYYMMDD') || '_' ||
             to_char(v_eday, 'YYYYMMDD') || '.html' ||  chr(10) || 'exit' ||
              chr(10) || 'EOF' ||  chr(10);
  end loop;
  dbms_output.put_line(v_str);
  v_file := UTL_FILE.fopen(v_dir, 'awr_daily.sh', 'w', 32767);
  UTL_FILE.put_line(v_file, v_str);
  UTL_FILE.fclose(v_file);
end dbma_awrrpt;
--3. 使用dbma用户运行存储过程
call dbma_awrrpt;
##4. 使用oracle用户登陆Shell,对生成脚本授予运行权限
cd /u01/oracle/product/10.2.0.4/rdbms/log/
chmod 775 awr_daily.sh
##5. 使用oracle或jwdba用户上传脚本进入/home/oracle/dbma目录
## LinuxDaily.sh
##6. 测试运行
sh awr_daily.sh
##7. 配置每日计划任务:每日0:30执行
crontab -e
30 0 * * * sh /home/oracle/dbma/LinuxDaily.sh >> /home/oracle/dbma/LinuxDaily.log 2>&1

总结:
Crontab定Shell脚本自动任务 → Shell脚本调用存储过程→存储过程拼接Shell脚本→任务继续运行拼接出来的Shell脚本 = 万能套路lol~
如果担心安全,那就用Oracle调自动任务就好。
如果使用 Win,可用WSL直接运行,或者用Powershell\bat改写就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值