Hurriyet

13 Mart 2014 Perşembe

Oracle Veritabanı: AWR Raporunun Otomatikleştirilmesi - Automating AWR Report

AWR raporlarının nasıl çalıştırıldığını daha önce de görmüştük. $ORACLE_HOME/rdbms/admin altındaki awrrpt.sql scriptini çalıştırarak raporumuzu oluşturabiliriz. Bununla birlikte raporumuzu oluştururken bizden bazı girdileri isteyecektir. İnteraktif olarak bunları girmek yerine direk bu girdileri verebilirsek işimizi otomatize etmiş oluruz.

Otomatikleştirme işleminin yararı ise snapshot ayarlarından bağımsız olarak istediğimiz kadar raporları tutmuş oluruz. Raporları tutmaklada kalmayıp bunun analiz edilmiş çıktısını da saklamış oluruz. Böylece ileriki zamanlarda raporlara ihtiyaç duyduğumuzda veya çeşitli bilgiler için analiz etmek istediğimizde bu raporlar elimizin altında olacaktır.

Belirtilen script'i damir-vadas.blogspot.com'da bulabilirsiniz. Bu script'e günlük kontrollerim sırasında ihtiyacım olduğu için gerek duydum. Böylece günlük olarak hem iş yükünü hem de karşılaşılan sorunları görebilecektim.

Script'de Neler Yapılmakta?

Script  içerisinde raporumuza koyacağımız bilgileri belirlenmektedir. Örneğin DBID'si, Snapshot id'sini gibi bilgileri alınmaktadır. Snapshot bilgilerini alırken de 07-18 saat dilimleri arası alınmaktadır. Sonrasında v_dir değişkeniyle belirtilen klasörün tanımı veritabanına yapılır. Bu tanım ALL_DIRECTORIES tablosundan görülebilinir.

select * from all_directories  

Ardından da dosya açılır ve rapor dosyanın içine yazdırılır.  Script içine fazladan dbms_output.put_line('1'); gibi komutlar eklenmiştir. Bu script'in ortam değişikliği durumunda debug edilmesi, karşılaşılan hataların hangi aşamada görülmesini sağlamak içi konulmuştur.

Script çalıştırılırken klasör adına, snapshot aralığına ve gerekli yetkilere dikkat edilmelidir.

set serveroutput on  
 set linesize 166  
 set pagesize 600  
 set trimout on  
   
 DECLARE  
  cursor c_instance is  
   SELECT instance_number, instance_name  
   FROM  gv$instance  
   ORDER BY 1  
  ;  
   
  v_dir     CONSTANT VARCHAR2(256) := '/home/users/oracle';  
  --v_dir     VARCHAR2(256) ;  
    
  v_dbid    v$database.dbid%TYPE;  
  v_dbname   v$database.name%TYPE;  
  v_inst_num  v$instance.instance_number%TYPE := 1;  
  v_begin    NUMBER;  
  v_end     NUMBER;  
  v_start_date VARCHAR2(20);  
  v_end_date  VARCHAR2(20);  
  v_options   NUMBER := 8; -- 0=no options, 8=enable addm feature  
  v_file    UTL_FILE.file_type;  
  v_file_name  VARCHAR(50);  
   
 BEGIN  
  -- get database id  
  SELECT dbid, name  
   INTO v_dbid, v_dbname  
   FROM v$database;  
   dbms_output.put_line('1');  
   
  -- get end snapshot id  
  SELECT MAX(snap_id)  
   INTO v_end  
   FROM dba_hist_snapshot  
   WHERE to_char(begin_interval_time,'HH24') = '18';  
  dbms_output.put_line('end snap_id '||v_end);  
  dbms_output.put_line('2');  
  -- get start snapshot id  
  SELECT MAX(snap_id)  
   INTO v_begin  
   FROM dba_hist_snapshot  
   WHERE to_char(begin_interval_time,'HH24') = '07'  
    AND snap_id < v_end;  
  dbms_output.put_line('begin snap_id '||v_begin);  
    dbms_output.put_line('3');  
  SELECT to_char(begin_interval_time,'YYMMDD_HH24MI')  
   INTO v_start_date  
   FROM dba_hist_snapshot  
   WHERE snap_id = v_begin  
    AND instance_number = v_inst_num  
  ;  
  dbms_output.put_line('v_start_date '||v_start_date);  
  dbms_output.put_line('4');  
  SELECT to_char(begin_interval_time,'HH24MI')  
   INTO v_end_date  
   FROM dba_hist_snapshot  
   WHERE snap_id = v_end  
    AND instance_number = v_inst_num  
  ; dbms_output.put_line('5');  
  dbms_output.put_line('v_end_date '||v_end_date);  
    
  -- Thanx to Yu Denis Sun - we must have directory defined as v_dir value!  
  execute immediate('create or replace directory xx_some_temp_dir as '''||v_dir||'''');  
   dbms_output.put_line('6');  
  -- let's go to real work...write awrs to files...   
  FOR v_instance IN c_instance LOOP  
   dbms_output.put_line('v_instance.instance_name:'||v_instance.instance_name);  
   v_file := UTL_FILE.fopen('XX_SOME_TEMP_DIR', 'awr_' || v_instance.instance_name ||'_'|| v_instance.instance_number || '_' || v_start_date || '_' || v_end_date || '.html', 'w', 32767);  
   FOR c_report IN (  
    SELECT output  
     FROM TABLE(dbms_workload_repository.awr_report_html( v_dbid,  
                                v_instance.instance_number,  
                                v_begin,  
                                v_end,  
                                v_options  
                               )  
          )  
   ) LOOP  
    UTL_FILE.PUT_LINE(v_file, c_report.output);  
   END LOOP;  
   UTL_FILE.fclose(v_file);  
   dbms_output.put_line('7');  
  END LOOP;  
   dbms_output.put_line('8');  
  execute immediate('drop directory xx_some_temp_dir');  
  dbms_output.put_line('9');  
 EXCEPTION  
  WHEN OTHERS THEN  
   DBMS_OUTPUT.PUT_LINE(SQLERRM);  
    dbms_output.put_line('10');  
   IF UTL_FILE.is_open(v_file) THEN  
    UTL_FILE.fclose(v_file);  
   END IF;  
   BEGIN  
    execute immediate('drop directory xx_some_temp_dir');  
   EXCEPTION  
    WHEN OTHERS THEN  
     null;  
   END;  
 END;  
 /

Burada günlük olarak çalışma koşulu max(snap_id) ve begin_interval_time koşulu ile sağlanmaktadır. Böylece saat 18 snapshot'ı doğal olarak en son gün için yüksek olacağı hep o günün AWR raporu alınacaktır.

Aşağıda yazdığım kod ise $HOME dizininde raporun bir benzeri varsa çıkmakta, yoksa da awrrpt.sql scriptini çalıştırmaktadır.

 cd ;  
 x=$(date +"%y%m%d");  
 ls *$x* >> /dev/null 2>&1;  
 if [ $? != 0 ];  
 then  
  sqlplus -s "/ as sysdba" @$ORACLE_HOME/rdbms/admin/awrrpt.sql;  
 else  
  exit;  
   
 fi 

Referans:
1-AWR Raporunun Otomatik Çalıştırılması Script :http://damir-vadas.blogspot.com.tr/2009/11/automated-awr-reports-in-oracle-10g11g.html

Hiç yorum yok:

Yorum Gönder