¿Cómo realizar un trace?

Muchas veces, se requiere saber qué es lo que está pasando con un proceso que está demorando mucho tiempo en ejecutarse. Si uno tiene el privilegio suficiente, desde la sesión actual, podemos generar un trace a partir del cuál, podremos ver en dónde está la demora. También si tenemos acceso con un usuario con privilegios de DBA, podemos generar dicho trace para cualquier sesión que esté conectada en ese momento.

Un trace, registrará toda instrucción SQL (select, insert, update, delete) que se ejecute dentro o fuera del procedimiento mientras el trace esté activado. Ok, veámos qué es lo que requerimos hacer para cada uno de los casos.

Trace de la sesión actual.

1. El usuario con el que estamos ejecutando el proceso, debe tener el privilegio de:

ALTER SESSION

2. Hay que ver el directorio que está asignado al parámetro de la base de datos user_dump_dest:

SQL> show parameter user_dump
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      D:\ORACLE\PRODUCT\10.2.0\ADMIN
                                                 \LAB\UDUMP

En dicho directorio, se generará nuestro archivo trace.

3. Tenemos que saber cuál es el spid de nuestra actual sesión. Esto lo hacemos con el siguiente query:

SQL> select pro.spid, ses.username, ses.machine, ses.osuser
  2  from   v$session ses,
  3         v$process pro
  4  where  ses.paddr    = pro.addr
  5    and  ses.username = upper ('&usuario');
 Enter value for usuario: admaud
 old   5:  and  a.username = upper ('&usuario')
 new   5:   and  a.username = upper ('admaud')
SPID         USERNAME             MACHINE              OSUSER
------------ -------------------- -------------------- -------------------------
5432         ADMAUD               RESOURCEIT\OOOLAPTOP OOOLAPTOP\Administrador
Este spid, nos servirá para identificar el archivo que se generará por el proceso del trace.

4. Ya teniendo los datos anteriores, podemos ahora si lanzar el trace, para esto, usamos la instrucción, alter session como se muestra a continuación:

alter session set events '10046 trace name context forever, level no_nivel';

donde no_nivel es el nivel de detalle del trace, y puede tener los siguientes valores:

  •  1 – Similar a sql_trace=true
  •  4 – Incluye los valores de bind variables
  •  8 – Incluye los eventos de espera
  • 12 – que incluye valores de bind variables y eventos de espera..

5. Una vez ejecutado el paso anterior, ya podemos ejecutar cualquier query o el proceso que se está demorando.

SQL> select sysdate from dual;
SYSDATE
--------
06/10/08
SQL> exec rit_audit_trail.process_trail (sysdate);
PL/SQL procedure successfully completed.

6. Ya que se ejecutaron todos los queries y procesos que se requieren, se tiene que detener el trace por medio de la siguiente instrucción:

alter session set events '10046 trace name context off';

7. Con esto, hay que ir al directorio que obtuvimos en el punto 2 y listar el archivo trace que contenga el spid que obtuvimos en el punto 3.

D:\Oracle\Product\10.2.0\db10g\BIN>cd D:\ORACLE\PRODUCT\10.2.0\ADMIN\LAB\UDUMP
D:\Oracle\Product\10.2.0\admin\lab\udump>dir *5432*
 El volumen de la unidad D es MetalliOra  El número de serie del volumen es: 9079-081A
 Directorio de D:\Oracle\Product\10.2.0\admin\lab\udump
27/09/2008  02:10 p.m.           191,300 lab_ora_5432.trc
               1 archivos        191,300 bytes

8. Ya tienendo el archivo, lo único que tenemos que hacer, es ejecutar el comando tkprof para convertir el texto a algo más legible. El formato del comando es:

tkprof nombre_archivo.trc nombre_arch_salida.extensión
Aplicando esto al ejemplo que estamos haciendo:
D:\Oracle\Product\10.2.0\admin\lab\udump>tkprof lab_ora_5432.trc salida.txt
TKPROF: Release 10.2.0.2.0 - Production on Lun Oct 6 16:44:23 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Con esto, ya tendremos nuestro archivo trace para poder analizar en dónde se está tardando nuestro proceso.

Trace de cualquier sesión.

Ahora, veremos como se realiza el proceso anterior pero desde / as sysdba, para algúna sesión en particular. En los siguientes pasos, muestro lo que se tiene que realizar para esto:

1. Primero tenemos que tener el usuario al que se le quiere generar el trace conectado.

SQL> conn admaud
Enter password:
Connected.
SQL>

2. Después, nos tenemos que conectar como / as sysdba por nuestro lado.

D:\>sqlplus / as sysdba
SQL*Plus: Release 10.1.0.4.2 - Production on Lun Oct 6 16:51:53 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production With the Partitioning, OLAP and Data Mining options
SQL>

2. Después, obtenemos el dato del spid como lo vimos en la sección anterior.

SQL> select pro.spid, ses.username, ses.machine, ses.osuser
  2  from   v$session ses,
  3         v$process pro
  4  where  ses.paddr    = pro.addr
  5  /
SPID         USERNAME             MACHINE              OSUSER
------------ -------------------- -------------------- -------------------------
2512                              OOOLAPTOP            SYSTEM
1784                              OOOLAPTOP            SYSTEM
4076                              OOOLAPTOP            SYSTEM
3084                              OOOLAPTOP            SYSTEM
1796                              OOOLAPTOP            SYSTEM
2676                              OOOLAPTOP            SYSTEM
452                               OOOLAPTOP            SYSTEM
3116                              OOOLAPTOP            SYSTEM
3904                              OOOLAPTOP            SYSTEM
1232                              OOOLAPTOP            SYSTEM
2912                              OOOLAPTOP            SYSTEM
3072                              OOOLAPTOP            SYSTEM
236          ADMAUD               RESOURCEIT\OOOLAPTOP OOOLAPTOP\Administrador
3788                              OOOLAPTOP            SYSTEM
4020         SYS                  RESOURCEIT\OOOLAPTOP OOOLAPTOP\Administrador
3928                              OOOLAPTOP            SYSTEM
2480                              OOOLAPTOP            SYSTEM
3800                              OOOLAPTOP            SYSTEM
18 rows selected.

De aqui, está marcado en negritas la el spid 236, porque será este al que se le genere el trace.

3. Ya con el spid del punto anterior podemos ejecutar los comandos para generar el trace:

oradebug setospid no_spid
oradebug event 10046 trace name context forever, level no_nivel;

Donde no_nivel, tendrá los valores que ya se describieron con anterioridad en este post. Por ejemplo:

SQL> oradebug setospid 236
Oracle pid: 16, Windows thread id: 236, image: ORACLE.EXE (SHAD)
SQL> oradebug event 10046 trace name context forever, level 12;
Statement processed.

4. Con lo anterior, ya está ejecutándose nuestro trace, repetimos el proceso de generar queries y ejecutar procesos:

SQL> select sysdate from dual;
SYSDATE
--------
06/10/08
SQL> exec rit_audit_trail.process_trail (sysdate);
PL/SQL procedure successfully completed.

5. Y una vez finalizado, ejecutamos la instrucción para finalizar el trace:

SQL> oradebug event 10046 trace name context off;
Statement processed.

6. Con esto, podemos ir al directorio obtenido en el punto 2 de la primer parte y ver nuestro archivo trace:

D:\Oracle\Product\10.2.0\admin\lab\udump>dir *236.trc
 El volumen de la unidad D es MetalliOra
 El número de serie del volumen es: 9079-081A
 Directorio de D:\Oracle\Product\10.2.0\admin\lab\udump
06/10/2008  05:32 p.m.            76,728 lab_ora_236.trc
01/08/2008  08:43 p.m.               587 lab_ora_7236.trc
               2 archivos         77,315 bytes
               0 dirs  16,007,000,064 bytes libres

Comentario final.

Una vez que se tiene generado el archivo trace y convertido con el tkprof, ya se puede obtener sin problema el punto donde se está generando la espera en nuestro proceso o en algún query. La lectura e interpretación de este tipo de archivos, la pueden ver en: ¿Cómo interpretar la salida de un trace?

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

2 Responses to ¿Cómo realizar un trace?

  1. Pingback: (LIOs vs PIOs) & Hit Ratio « Orlando Olguín Olvera

  2. Pingback: ¿Cómo interpretar la salida de un trace? « Orlando Olguín Olvera

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: