Generación automática de informes AWR con shell script

Hola de nuevo.

Hoy os queremos mostrar un script que hemos generado para extraer informes AWR de varias bases de datos de una sola vez.

El script original lo hemos obtenido de www.orainternals.com y lo ha creado Riyaj Shamsudeen. El script es muy completo pero lo hemos adaptado en un par de puntos:

  1. El script original genera el informe a partir de los dos últimos snapshots de la base de datos, lo hemos adaptado para que busque el primero y el último (esta generación falla si la instancia se ha reiniciado entre estos dos snapshots).
  2. Si hay varias entradas en la vista dba_hist_database_instance el script original coge el primer dbid. Lo hemos modificado para que ordene por STARTUP_TIME y coja el del mayor fecha.

También hemos incluido el nombre de la instancia en el salida del informe para tener más claro a que base de datos corresponde cada informe AWR.

El script con las modificaciones es el siguiente:

 

REM ————————————————————————————————–
REM Author: Riyaj Shamsudeen @OraInternals, LLC
REM www.orainternals.com
REM
REM Functionality: This script is to get all AWR report from all nodes.
REM **************
REM
REM Source : AWR tables
REM
REM Exectution type: Execute from sqlplus or any other tool.
REM
REM Parameters: No parameters. Uses Last snapshot and the one prior snap
REM No implied or explicit warranty
REM @Copyright : OraInternals, LLC
REM
REM Please send me an email to rshamsud@orainternals.com, if you found issues in this script 🙂
REM ————————————————————————————————–
prompt
PROMPT
PROMPT
PROMPT awrrpt_all_gen.sql v1.03 by Riyaj Shamsudeen @orainternals.com
PROMPT
PROMPT To generate AWR Report from all RAC instances concurrently.
PROMPT
PROMPT Creates reports using last two snap_ids.
PROMPT
PROMPT …Generating awrrpt_all.sql script…. Please wait….
set define off
set feedback off
set termout off
set pages 0
set lines 120
set serveroutput on
spool awrrpt_all_html.sql
declare
v_str varchar2(180);
procedure p (l_str varchar2)
is
begin
dbms_output.put_line(l_str);
end;
begin
p(‘REM ————————————————————————————————–‘);
p(‘REM Author: Riyaj Shamsudeen @OraInternals, LLC’);
p(‘REM www.orainternals.com’);
p(‘REM’);
p(‘REM Functionality: This script is to get all AWR report from all nodes.’);
p(‘REM **************’);
p(‘REM’);
p(‘REM Source : AWR tables’);
p(‘REM’);
p(‘REM Exectution type: Execute from sqlplus or any other tool.’);
p(‘REM’);
p(‘REM Parameters: No parameters. Uses Last snapshot and the one prior snap’);
p(‘REM No implied or explicit warranty’);
p(‘REM @Copyright OraInternals, LLC’);
p(‘REM Please send me an email to rshamsud@orainternals.com, if you found issues in this script. ‘);
p(‘REM ————————————————————————————————–‘);
p(‘set pages 0’);
p(‘variable dbid number’);
p(‘variable inst_num number’);
p(‘variable bid number’);
p(‘variable eid number’);
p(‘variable rpt_options number’);
p(‘variable inst_name varchar2(40)’);
p(»);
p(‘declare’);
p(‘begin’);
p(‘select’);
p(‘ (select min(SNAP_ID) from dba_hist_snapshot ‘);
p(‘) bid, ‘);
p(‘max_snap_id eid ‘);
p(‘into :bid, :eid ‘);
p(‘from ‘);
p(‘( ‘);
p(‘ select distinct first_value (snap_id) over( ‘);
p(‘ order by snap_id desc rows between unbounded preceding and unbounded following) max_snap_id ‘);
p(‘ from dba_hist_snapshot );’);
p(‘select dbid into :dbid from (select dbid from dba_hist_database_instance order by STARTUP_TIME desc) where rownum=1;’);
p(‘end;’);
p(‘/’);

p(‘exec :rpt_options :=0;’);
p(‘column rpt_name new_value rpt_name noprint;’);

for c1 in (select instance_number, instance_name from gv$instance order by instance_number)
loop
p(‘exec :inst_num :=’||c1.instance_number ||’;’);
p(‘exec :inst_name :=»’||c1.instance_name ||»’;’);
v_str := q'[select ‘awrrpt_’||:inst_name||’_’||:bid||’_’||:eid||’.htm’ rpt_name from dual;]’;
p(v_str);
p(‘set lines 1500’);
p(‘SET TRIMSPOOL ON’);
p(‘spool &rpt_name’);
p(‘ select rtrim(output) from table(sys.dbms_workload_repository.awr_report_html( :dbid,’);
p(‘ :inst_num,’);
p(‘ :bid, :eid,’);
p(‘ :rpt_options ));’);
p(‘spool off’);
p(‘set termout on’);
p(‘PROMPT …AWR report created for instance ‘||c1.instance_number||’. Please wait..’);
p(‘set feedback off’);
v_str := q'[select ‘….File_name: awrrpt_’||:inst_name||’_’||:bid||’_’||:eid||’.htm’ file_name from dual;]’;
p(v_str);
p(‘set termout off’);
p(‘set feedback on’);
end loop;
end;
/
spool off
set define on
set feedback on
set termout on
PROMPT …Completed script generation.
PROMPT
PROMPT Executing awrrpt_all.sql to generate AWR reports.
PROMPT …Generates AWR reports with file name format awrrpt_<inst>_<bid>_<eid>.htm for each instance.
PROMPT …Please wait for few minutes…
PROMPT
set termout off
@awrrpt_all_html.sql
set termout on
set pagesize 24
PROMPT AWR reports created.

Para llamar el script para todas las instancias utilizamos oraenv:

export ORACLE_SID=TEST1
. oraenv
export ORACLE_SID=TEST11
sqlplus / as sysdba << EOF
@awr.sql
EOF
export ORACLE_SID=TEST2
. oraenv
export ORACLE_SID=TEST21
sqlplus / as sysdba << EOF
@awr.sql
EOF
export ORACLE_SID=TEST3
. oraenv
export ORACLE_SID=TEST31
sqlplus / as sysdba << EOF
@awr.sql
EOF
export ORACLE_SID=TEST4
. oraenv
export ORACLE_SID=TEST41
sqlplus / as sysdba << EOF
@awr.sql
EOF

 

La salida es la siguiente:

ls -ltr

-rw-r–r– 1 oracle oinstall 1299378 Jun 26 12:12 awrrpt_TEST11_10065_10267.htm
-rw-r–r– 1 oracle oinstall 1347477 Jun 26 12:13 awrrpt_TEST12_10065_10267.htm
-rw-r–r– 1 oracle oinstall 1829700 Jun 26 12:13 awrrpt_TEST21_1808_2011.htm
-rw-r–r– 1 oracle oinstall 1675548 Jun 26 12:13 awrrpt_TEST22_1808_2011.htm
-rw-r–r– 1 oracle oinstall 1366568 Jun 26 12:13 awrrpt_TEST31_10034_10236.htm
-rw-r–r– 1 oracle oinstall 1205663 Jun 26 12:13 awrrpt_TEST32_10034_10236.htm
-rw-r–r– 1 oracle oinstall 1766898 Jun 26 12:14 awrrpt_TEST41_10069_10272.htm
-rw-r–r– 1 oracle oinstall 1721956 Jun 26 12:14 awrrpt_TEST42_10069_10272.htm

Como podéis ver os genera un informe AWR por cada instancia del RAC de una forma sencilla y rápida

Espero que os sea de utilidad.

Hasta la próxima.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *