1. 程式人生 > >Oracle 每天自動生成AWR報告

Oracle 每天自動生成AWR報告

awr into creat 格式 pla rac 賬戶 rom 資料

經驗豐富的老員工希望能夠每天為數據庫生成1個AWR報告,以便於後期分析數據庫的性能變化,手動生成太麻煩,查了一下資料,發現可以自動生成,過程如下。

數據庫環境:11gR2 RAC(雙節點)

AWR報告:由於是RAC數據庫,希望生成每個節點的報告及全局報告,時間段為:第一天的0點~第二天的0點。

(1)在oracle服務器上創建路徑

server2$[/home/oracle]mkdir awrreport

(2)創建directory並授權(使用sys賬戶執行)

create or replace directory DIR_AWRREPORT as /home/oracle/awrreport;
grant read,write on directory DIR_AWRREPORT to mydba; -- mydba為具有dba權限的用戶 grant select on v_$database to mydba; grant select on dba_hist_snapshot to mydba; grant execute on sys.dbms_workload_repository to mydba;

(3)編寫腳本(使用監控賬戶mydba執行)

CREATE OR REPLACE PROCEDURE auto_awrreport
AS /* 用途 :自動生成AWR報告 創建人 :gegeman 創建日期:2017-12-08 */ start_snap number; end_snap number; rpt_interval number := 24; --報告間隔(小時) start_time varchar2(14); end_time varchar2(14); awr_file utl_file.file_type; v_dbid number; v_dbname varchar2(20); begin --確定數據庫名稱與id select dbid,name into v_dbid,v_dbname from v$database
; ---查詢起始的快照id select max(snap_id) into end_snap from dba_hist_snapshot; start_snap := end_snap-rpt_interval; ---格式化快照時間 select to_char(end_interval_time-rpt_interval/24, yyyymmddhh24),to_char(end_interval_time, yyyymmddhh24) into start_time,end_time from dba_hist_snapshot where snap_id = end_snap and instance_number = 1; --實例1報告 awr_file := utl_file.fopen(DIR_AWRREPORT,lower(v_dbname)||_1_||start_time||_||end_time||.html, a,32767); for awr_info in (select output from table(dbms_workload_repository.awr_report_html(v_dbid,1,start_snap,end_snap,0))) loop UTL_FILE.put_line(awr_file,awr_info.output); end loop; utl_file.fclose(awr_file); --實例2報告 awr_file := utl_file.fopen(DIR_AWRREPORT,lower(v_dbname)||_2_||start_time||_||end_time||.html, a,32767); for awr_info in (select output from table(dbms_workload_repository.awr_report_html(v_dbid,2,start_snap,end_snap,0))) loop UTL_FILE.put_line(awr_file,awr_info.output); end loop; utl_file.fclose(awr_file); --全局報告 awr_file := utl_file.fopen(DIR_AWRREPORT,lower(v_dbname)||_global_||start_time||_||end_time||.html, a,32767); for awr_info in (select output from table(dbms_workload_repository.awr_global_report_html(l_dbid => v_dbid,l_inst_num => ‘‘,l_bid => start_snap,l_eid => end_snap,l_options => 0))) loop UTL_FILE.put_line(awr_file,awr_info.output); end loop; utl_file.fclose(awr_file); end auto_awrreport;

(4)授予監控用戶執行procedure權限(使用sys賬戶)

grant execute on mydba.auto_awrreport to mydba;

(5)創建job,每天晚上12:30執行(監控賬戶)

declare
job1 number;
begin
sys.dbms_job.submit(job => job1,
what => auto_awrreport;,
next_date => sysdate,
interval => TRUNC(SYSDATE+1) + 30/(24*60),
instance => 2
); 
end;

Oracle 每天自動生成AWR報告