我最近收到一个要求,要求提供每日自动 AWR 报告,应该发送到 DBA 团队的收件箱。这看起来是一个有趣的需求,所以我首先使用我的测试数据库完成了这个,有以下详细信息:
Single Instance database namely "test19c", running in rdbms 19.3 version. This is a cdb enabled database,running in RHEL 7.9 version.
复制
现在回到这个要求。像往常一样,我检查了 MOS 并得到了一个很好的提示,如下所示:
How to Create AWR Snapshots Outside the Regular Automatic Intervals? (Doc ID 2100903.1)
复制
这篇文章提供了一个建议,即编写一个自定义过程,这意味着该代码可以在其他数据库中重用。在编写此过程时,我遇到了生成的输出 html 文件大小的问题。再一次,我从 MOS 那里得到了帮助,并附上了以下说明:
How to Write CLOB Data > 32K Out to a File? (Doc ID 358641.1)
复制
一旦我可以生成所需的 html 报告并将输出放入文件中,我在发送此文件附件时遇到了问题。这是因为我不想为了邮寄目的而调用任何操作系统实用程序。同样,我从 MOS 那里得到了这个帮助:
How To Send Multiple Attachments Of Size Greater Than 32 KB Using UTL_SMTP Package (Doc ID 357385.1)
复制
在我的测试数据库中,快照每小时生成一次。我们使用系统日期而不是参数,这使得它依赖于作业的运行时间。初始快照取自前一天的第一个快照,结束快照取自前一天的最后一个快照。
我的自定义过程代码如下所示。您可能需要调整逻辑以在此过程中计算开始和结束快照 ID 以满足您的需要。
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."GET_AND_SEND_AWR_REPORT_YESTERDAY" is
v_dbid v$database.dbid%type;
v_inst_num v$instance.instance_number%type;
v_end_snapid dba_hist_snapshot.snap_id%type;
v_begin_snapid dba_hist_snapshot.snap_id%type;
v_start_date VARCHAR2 (20);
v_awr_report CLOB:=empty_clob();
v_html_report_row varchar2(1500);
po_err_msg varchar2(1000);
begin
select d.dbid, i.instance_number into v_dbid, v_inst_num from v$database d, v$instance i;
select MIN(snap_id) into v_begin_snapid from dba_hist_snapshot
where begin_interval_time > trunc(sysdate-1,'DD') and dbid = v_dbid and instance_number = v_inst_num;
select MIN(snap_id) into v_end_snapid from dba_hist_snapshot
where end_interval_time > round(sysdate,'DD') and dbid = v_dbid and instance_number = v_inst_num;
for cv in
(select output from table(dbms_workload_repository.awr_report_html(v_dbid,v_inst_num, v_begin_snapid, v_end_snapid)))
loop
v_html_report_row := cv.output;
-- now append v_html_report_row to v_awr_report
v_awr_report := v_awr_report || v_html_report_row;
end loop;
-- Convert the CLOB into a file
clob_to_file ('DATA_PUMP_DIR', 'AWRFILE_Latest_test_db.html', v_awr_report);
-- Mail this file to DBA
begin
demo_mail.send_email
(
P_DIRECTORY => 'DATA_PUMP_DIR',
P_SENDER => 'oracle@testserver.pythian.com',
P_RECIPIENT => '**@*.com',
P_CC => '**@*.com',
P_BCC => '**@*.com',
P_SUBJECT => 'AWR recent report for TEST database for '||to_char(sysdate-1,'MM/DD/YYYY'),
P_BODY => 'AWR report for test database',
P_ATTACHMENT1 => 'AWRFILE_Latest_test_db.html',
P_ATTACHMENT2 => null,
P_ATTACHMENT3 => null,
P_ATTACHMENT4 => null,
P_ERROR => po_err_msg
);
if po_err_msg <> '0' then
dbms_output.put_line('Call to demo_mail failed: '|| po_err_msg);
end if;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('Error while calling demo_mail package: '||sqlerrm);
end;
end;
/
复制
此过程经过手动测试并确认我们获得了所需的 AWR html 报告,因此将其作为数据库调度程序作业提交,如下所示:
begin
dbms_scheduler.create_job(
job_name=>'DAILY_AWR_JOB'
,job_type=>'PROCEDURE'
,job_action=>'get_and_send_awr_report_yesterday'
,start_date=>to_date(to_char(sysdate,'DD Mon YYYY')||' 01:20:00','DD Mon YYYY HH24:MI:SS')
,repeat_interval=>'FREQ=DAILY'
,auto_drop => false
,enabled => true);
end;
/
复制
现在,所需的电子邮件每天都会发送到收件箱中。
看起来很简单,对吗?我希望这篇文章能帮到你!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。