Hurriyet

14 Mart 2014 Cuma

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

Oracle veritabanı için yaptığımız günlük kontrollerde AWR raporunu otomatikleştirdikten sonra aynı şekilde ADDM raporunu da otomatikleştirmek istedim. Temelde aynı olmakla birlikte ADDM raporu çıkartıldığında CLOB kolonuna yazmaktadır. O yüzden CLOB kolonundan dosya yazdırmamız gerekmektedir.

Script'imizin ana hatları AWR raporunu otomatikleştirirkenki kullandığımız script'ten oluşmaktadır. Bununla beraber ADDM raprunun oluşturulması için task yaratılması, instance analizinin yapılması sonrasında da bunun bir dosyaya yazılması bulunmaktadır.

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;  -- l_fHandler         UTL_FILE.FILE_TYPE;  
  v_file_name VARCHAR(50);   
  c_chunk          CONSTANT PLS_INTEGER := 32767;  
  l_pos           PLS_INTEGER := 1;  
  p_clob CLOB;  
  tname varchar2(100);  
  BEGIN   
  -- get database id   
  SELECT dbid, name   
   INTO v_dbid, v_dbname   
   FROM v$database;   
     
     
  -- 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);   
     
  -- 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);   
      
  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);   
    
  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('v_end_date '||v_end_date);   
     
     
  execute immediate('create or replace directory TEMP_DIR as '''||v_dir||'''');   
    
  FOR v_instance IN c_instance LOOP   
   dbms_output.put_line('v_instance.instance_name:'||v_instance.instance_name);   
    
  tname := 'ADDM Raporu';   
  DBMS_ADDM.ANALYZE_INST(tname, v_begin, v_end);  
        
  select dbms_addm.get_report(tname) into p_clob from dual;  
      
   clob_to_file('TEMP_DIR', 'addm_' || v_instance.instance_name ||'_'|| v_instance.instance_number || '_' || v_start_date || '_' || v_end_date || '.html',p_clob );  
   
    
   
   END LOOP;   
   
  dbms_addm.delete(tname);  
  execute immediate('drop directory TEMP_DIR');   
  EXCEPTION   
  WHEN OTHERS THEN   
   DBMS_OUTPUT.PUT_LINE(SQLERRM);   
   BEGIN   
   execute immediate('drop directory TEMP_DIR');   
   EXCEPTION   
   WHEN OTHERS THEN   
    null;   
   END;   
  END;   
  /  

v_instance döngüsünün amacı RAC ortamları için instance tespit etmektir.

ADDM raporunun yaratılmasını dbms_addm.analyze_inst ile yapmaktayız. Burada dbms_addm.analyze_inst yerine dbms_addm.analyze_db ya da başka tip addm raporları oluşturabiliriz.

tname := 'ADDM Raporu';   
  DBMS_ADDM.ANALYZE_INST(tname, v_begin, v_end);  
        
  select dbms_addm.get_report(tname) into p_clob from dual;  
      
   clob_to_file('temp_dir', 'addm_' || v_instance.instance_name ||'_'|| v_instance.instance_number || '_' || v_start_date || '_' || v_end_date || '.html',p_clob ); 

Dosya yaratma ve silme haklarını kullanıcımıza vermek için aşağıdaki sorguları kullanabiliriz.

 grant create any directory to (kullanıcı);  
 grant drop any directory to (kullanıcı);  

Buradaki "clob_to_file" prosedürü daha önceden yazdığımız "Oracle Veritabanı: Clob'u Dosyaya Yazdırmak - Writing a Clob Colum To An OS File " adlı yazımızda bulabilirsiniz.


Referans:
ADDM prosedürleri: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_addm.htm#CACDBJFG

Hiç yorum yok:

Yorum Gönder