暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

[译文] 自动生成每日 AWR 报告

原创 Suresh Karthikeyan 2021-08-30
1163

我最近收到一个要求,要求提供每日自动 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; /
复制

现在,所需的电子邮件每天都会发送到收件箱中。

image.png

看起来很简单,对吗?我希望这篇文章能帮到你!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论