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