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改写就好了。