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
orreplace
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 **$instance orderby1
)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
byround
(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改寫就好了。
Oracle 每天自動生成AWR報告
經驗豐富的老員工希望能夠每天為資料庫生成1個awr報告,以便於後期分析資料庫的效能變化,手動生成太麻煩,查了一下資料,發現可以自動生成,過程如下。資料庫環境 11gr2 rac 雙節點 awr報告 由於是rac資料庫,希望生成每個節點的報告及全域性報告,時間段為 第一天的0點 第二天的0點。1 在o...
Oracle 每天自動生成AWR報告
經驗豐富的老員工希望能夠每天為資料庫生成1個awr報告,以便於後期分析資料庫的效能變化,手動生成太麻煩,查了一下資料,發現可以自動生成,過程如下。資料庫環境 11gr2 rac 雙節點 awr報告 由於是rac資料庫,希望生成每個節點的報告及全域性報告,時間段為 第一天的0點 第二天的0點。1 在o...
oracle基礎 awr報告
重點關注 一 snapshot information session 連線的總的會話數 cursors session 每個會話平均開啟的游標數 elapsed 快照產生的總時間 通過elapsed db time比較,反映出資料庫的繁忙程度。如果awr報告頂部的db time遠大於elapsed...