Viajando en el Tiempo
Espero que aquellos que pudieron ver la cinta cinematografica tengan un buen recuerdo de esos momentos , es comun que en nuestro trabajo con la base de datos oracle nos ocurra algo similar a esta pelicula, y es verificar a traves del tiempo que fue lo que sucedio en un determinado periodo. ( Hojala se pudiera hacer los mismo en la vida real , muchos de nosotros no hubieramos comprado aquello o invitado aquel , etc,etc, etc).
Motivos por los cuales queremos ver que sucedio? quiero revisar una session en particular o con todas las sessiones que operaban , "El reporte no terminaba" , " La consulta nunca dio resultado", " Deteminar si la cuenta de usuario opero en ese momento" , "el wait time sospecho actuo en ese periodo de tiempo" , " dos sessiones corrieron al mismo tiempo para un trabajo en particular", etc.
La base de datos oracle , nos permite realizar la tarea de viajar en el tiempo de diferentes maneras , en esta ocasion quiero desarrollar la mas sencilla a traves de los reportes ya programados de AWR,ASH. Usualmente dentro de oracle ya viene pre-configurado en la base de datos que cada hora tome metricas de diferentes indicadores ( Sistema Operativos y Base de datos con una retencion de 7 dias una mejor referencia ver el articulo Magia Negra ) , a cada punto en el tiempo en que se tomo una imagen de como era el comportamiento de la base de datos se le denomina snapshot.
Como veo los datos de mi base de datos
Ejecutar SCRIPT[1]
===============
SQL>alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS';
SQL>Select dBID,begin_interval_time,snap_id
from dba_hist_snapshot
where begin_interval_time between
to_Date('25-JUL-12 08:00:00','DD/MON/YY HH24:MI:SS') and
to_date('26-JUL-12 21:00:00','DD/MON/YY HH24:MI:SS')
order by 2
Facilmente se puede visualizar cual es el snap_id que corresponde a cada hora , este valor es sumamente importante para poder determinar cuales son las ventanas de tiempo , que se desea visualizar. veamos en la practica como se utiliza despues de utilizar el script [1]
procedo a Ejecutar
SQL> SELECT output FROM TABLE( DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT((select dbid from v$database), 1, 28617, 28620) ) ;
Donde es el snap_id 28617 es la hora inicial y 28620 es el snap_id de la hora final , los parametros del paquete como ven son muy sencillos
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(DBID, 1=instancia,snap_id inicial , snap_id final)
tambien puedes ver el resultado en html
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML ( Mismos parametros)
Este AWR ( Automatic Work Load Repository) te dara un buen resumen de como estaba la base de datos en memoria, procesos, cargas , bloqueos , parametros , eventos de espera, queries corriendo,etc. [ como estaba en una ventana de tiempo todas las sessiones,
ahora que sucede si deseo comparar dos periodos de tiempo ?
Ejecutar
SELECT output FROM TABLE(dbms_workload_repository.awr_diff_report_text(
(select dbid from v$database),
1,
( Select MIN(Snap_id) from dba_hist_snapshot where begin_interval_time >='25-JUL-2012 08:00:00'),
( Select MIN(Snap_id) from dba_hist_snapshot where begin_interval_time >='25-JUL-2012 06:00:00 PM'),
(select dbid from v$database),
1,
( Select MIN(Snap_id) from dba_hist_snapshot where begin_interval_time >='26-JUL-2012 08:00:00'),
( Select MIN(Snap_id) from dba_hist_snapshot where begin_interval_time >='26-JUL-2012 06:00:00 PM')
));
Este reporte es bastante grande y un poco dificil de analizar todo en texto pero con empeño todo es posible , la misma version en HTML , mas facil de visualizar se logra con
SELECT output FROM TABLE(dbms_workload_repository.awr_diff_report_html(
(select dbid from v$database),
1,
26722,
26734,
(select dbid from v$database),
1,
26746,
26758 ));
Para aquellos lectores atentos veran que los parametros de snap_id , los obtuve de diferente manera ambas completamente validas , si han tenido la paciencia de leer a este punto , la mejor parte de este episodio es la que sigue.
Solo quiero ver los queries mas pesados que pasaron en la reciente historia ?
select output from table(dbms_workload_repository.ash_report_text( (select dbid from v$database),1,sysdate-4/24,Sysdate ));
puedo ver en ASH (Automatic Storage History) que sucedio en las ultimas x horas , reporte util para determinar que es un query en especifico el que me esta causando un cuello de botella , ahora quiero saber como se ha comportado ese query en especifico en los ultimos y dias.
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(
(select dbid from v$database),1,sysdate-3,sysdate,
l_sql_id => 'abcdefghij123' ));
Con este material ahora se puede explorar muchas cosas ,
Hasta la siguiente aventura en el tiempo.
Comentario de Anibal G. Garcia Soto el agosto 2, 2012 a las 3:13pm Gracias a Ronald Vargas , ( Orgullosamente Oracle Ace para los centro americanos) tambien a Joel Perez (Oracle de Latinoamerica el Primero).
Deseo hacer una aclaracion importante , el uso de los tunning packs de oracle son una parte gratuita en caso tener una licencia Oracle Enterprise , en caso de no tener licencia enterprise o licenciamiento de los Stats Packs tunning packs se incurre en una falta en el licenciamiento. ( como saber si estoy utilizando esta funcionalidad de la BD hay que consultar dba_feature_usage_statistics).
El valor agregado de correr los reportes AWR,ASH desde un query , es que lo puedes ejecutar de manera automatica con sqlplus y mas tarde enviarlos por correo. Usualmente los dbas corren los reporten utilizando el script que se encuentra en $ORACLE_HOME/rdbms/admin/awrrpt.sql , $ORACLE_HOME/rdbms/admin/ashrpt.sql .
Comentario de Enrique Orbegozo el agosto 21, 2012 a las 3:56pm Hola Anibal, me parece que hay un error, el uso de Tuning Pack solo es posible en Enterprise Edition previo pago de la respectiva licencia, a la cual se debe adicionar el licenciamiento del Diagnostic Pack. En el caso de SE sencillamente el uso del Tuning Pack esta prohibido.
Saludos.
Oracle Tuning Pack provides database administrators with expert performance management for the Oracle environment, including SQL tuning and storage optimizations. Oracle Diagnostics Pack is a prerequisite product to Oracle Tuning Pack. Therefore, to use Oracle Tuning Pack, you must also have Oracle Diagnostics Pack.
Oracle Tuning Pack includes the following features:
SQL Access Advisor
SQL Tuning Advisor
Automatic SQL Tuning
SQL Monitoring
Reorganize objects
In order to use the features listed above, you must purchase licenses for Oracle Tuning Pack...
Comentario de Anibal G. Garcia Soto el agosto 22, 2012 a las 12:04am Gracias por la aclaracion el articulo hace referencia al ASH y AWR rerportes que son partes del Diagnostic Pack.
Que se puede comprobar el licenciamiento en el parametro interno
control_management_pack_access
<SQL> show parameter control_management_pack_access
NAME TYPE VALUE
control_management_pack_access string DIAGNOSTIC+TUNING
que muestra con toda claridad si ambos estan licenciados.
Comentario de Enrique Orbegozo el agosto 22, 2012 a las 12:32am Pues el parámetro control_management_pack_access tiene por defecto el valor DIAGNOSTIC+TUNING, cuando se trata de EE, y NONE cuando no es EE (http://docs.oracle.com/cd/E14072_01/server.112/e10820/initparams036...)
Pero el documento de licenciamiento (ya referenciado) dice:
In order to use the features listed above, you must purchase licenses for Oracle Diagnostics Pack. A new initialization parameter,
CONTROL_MANAGEMENT_PACK_ACCESS, controls access to Oracle Diagnostics Pack and Oracle Tuning Pack.
Con lo que se entiende que, si bien Oracle ha considerado conveniente poner un valor por defecto que te permite usar los packs, es responsabilidad del DBA realizar el ajuste, de ser necesario, para que cumpla con el licenciamiento por el que ha pagado.
Saludos Anibal.
Comentario
Bienvenido a
Comunidad Oracle Hispana
© 2013 Creado por Fernando Garcia.
¡Tienes que ser miembro de Comunidad Oracle Hispana para agregar comentarios!
Participar en Comunidad Oracle Hispana