DBMS_MONITOR activa el trace 10046 en una sesión que ya está conectada, sin cambiar la aplicación. Para WaitScope, actívelo con las esperas (waits => true) y sin los valores de bind (binds => false), justo antes de que empiece la operación, y desactívelo justo después de que termine.
Antes de empezar
- Permiso. Según la documentación de tracing de Oracle,
DBMS_MONITORsolo puede llamarlo un usuario con el rol DBA. Para activar el trace en su propia sesión, useDBMS_SESSION(en la propia sesión). - Consulta a las vistas. Para encontrar la sesión, usted consulta
V$SESSION, oGV$SESSIONen RAC. - Espacio en disco. El trace crece en la carpeta de trace del servidor de la base de datos mientras está activado: déjelo activado solo durante la operación.
- Referencia. Los parámetros de esta página son los de la referencia de DBMS_MONITOR en 19c.
Activar en una sesión (SID y serial#)
- Encuentre la sesión en
V$SESSIONpor el usuario, la máquina, el programa o el módulo:select sid, serial#, username, machine, program, module, status from v$session where username = 'EXEMPLO'; - Active el trace con el SID y el serial# de la sesión:
begin dbms_monitor.session_trace_enable( session_id => 123, serial_num => 4567, waits => true, binds => false); end; / - Compruebe que quedó activado:
select sql_trace, sql_trace_waits, sql_trace_binds, sql_trace_plan_stats from v$session where sid = 123;Resultado:
SQL_TRACEesENABLED,SQL_TRACE_WAITSesTRUEySQL_TRACE_BINDSesFALSE. - Ejecute la operación lenta en esa sesión.
- Desactive el trace:
begin dbms_monitor.session_trace_disable( session_id => 123, serial_num => 4567); end; /
El serial# garantiza que la llamada se aplica a esa sesión, y no a otra que reutilice el mismo SID más tarde. Para encontrar el archivo grabado, siga encontrar el archivo de trace.
En la propia sesión
Cuando es usted quien ejecuta la operación, active el trace en su sesión con DBMS_SESSION, que tiene los mismos parámetros waits, binds y plan_stat:
begin
dbms_session.session_trace_enable(waits => true, binds => false);
end;
/
-- ejecute la operación lenta
begin
dbms_session.session_trace_disable;
end;
/
Activar por client_id
Cuando la aplicación usa un pool de conexiones, la operación pasa por sesiones diferentes. Si la aplicación graba un identificador con DBMS_SESSION.SET_IDENTIFIER, active el trace por él. El valor aparece en la columna CLIENT_IDENTIFIER de V$SESSION: úselo tal como está allí, con las mismas mayúsculas y minúsculas.
begin
dbms_monitor.client_id_trace_enable(
client_id => 'EXEMPLO',
waits => true,
binds => false);
end;
/
Desactívelo al final de la operación:
begin
dbms_monitor.client_id_trace_disable(client_id => 'EXEMPLO');
end;
/
El trace por client_id se aplica a todas las instancias y sigue activado después de reiniciar la base de datos, hasta que usted lo desactive. Antes de terminar, compruebe en DBA_ENABLED_TRACES que no quedó ninguno olvidado (comprobar lo que quedó activado).
Oracle graba un archivo por cada proceso que atendió el client_id. Para ver la operación en un solo análisis, envíe los archivos juntos (analizar juntos): el informe muestra cada sesión y suma su tiempo. Con un pool de conexiones, el intervalo en que la sesión atendía otro client_id puede aparecer como tiempo no contabilizado entre llamadas.
Activar por servicio, módulo y acción
Si la aplicación se conecta por un servicio propio y graba módulo y acción con DBMS_APPLICATION_INFO, active el trace por esa combinación. El servicio es obligatorio; módulo y acción restringen más, y lo que usted omite vale para todos.
begin
dbms_monitor.serv_mod_act_trace_enable(
service_name => 'EXEMPLO_SRV',
module_name => 'EXEMPLO',
waits => true,
binds => false);
end;
/
Desactívelo con el mismo servicio y el mismo módulo:
begin
dbms_monitor.serv_mod_act_trace_disable(
service_name => 'EXEMPLO_SRV',
module_name => 'EXEMPLO');
end;
/
Este trace se aplica a toda la base de datos, y instance_name lo restringe a una instancia. Como en el client_id, cada proceso graba su propio archivo.
Qué valores usar
| Parámetro | Valor | Por qué |
|---|---|---|
waits | true | Sin las líneas WAIT, el perfil no separa la espera del resto: toda espera se convierte en tiempo no contabilizado, dentro y entre las llamadas. |
binds | false | WaitScope ignora los valores de bind. Activados, solo agregan al archivo datos que pueden ser personales, como números de identificación fiscal y correos electrónicos. |
plan_stat | omitido | El valor predeterminado graba el plan, en las líneas STAT, en la primera ejecución de cada cursor. 'ALL_EXECUTIONS' lo graba en cada ejecución y agranda el archivo; el informe muestra el último plan grabado de cada sentencia. 'NEVER' deja el informe sin plan. |
En RAC
SESSION_TRACE_ENABLEactiva el trace solo en la instancia a la que usted está conectado. Encuentre la instancia de la sesión en la columnaINST_IDdeGV$SESSIONy conéctese a ella antes de activar el trace.CLIENT_ID_TRACE_ENABLEse aplica a todas las instancias.SERV_MOD_ACT_TRACE_ENABLEse aplica a toda la base de datos, o solo a la instancia indicada eninstance_name.- Cada instancia graba los archivos en la carpeta de trace de su propio servidor: busque en cada nodo que atendió la operación.
select inst_id, sid, serial#, username, machine, module
from gv$session
where username = 'EXEMPLO';
Comprobar lo que quedó activado
Los traces por client_id, por servicio y de toda la base de datos aparecen en DBA_ENABLED_TRACES. Al final, la consulta debe volver vacía, o solo con lo que usted quiere mantener:
select trace_type, primary_id, qualifier_id1, qualifier_id2,
waits, binds, plan_stats, instance_name
from dba_enabled_traces;
El trace activado en una sesión no aparece en esa vista: compruébelo en la columna SQL_TRACE de V$SESSION, como en el paso 3 de la sesión.
Problemas frecuentes
- La llamada al paquete falla por falta de permiso. Pida al DBA que active el trace, o use
DBMS_SESSIONen su propia sesión. - La consulta muestra
SQL_TRACEigual aDISABLED. Compruebe el SID y el serial# y, en RAC, si está conectado a la instancia de la sesión. - Esperas igual a 0 en el Resumen del informe. El trace se activó sin las esperas. Actívelo de nuevo con
waits => true(niveles del 10046). - Texto no disponible: el cursor se abrió antes del inicio del trace. La página de la sentencia muestra este aviso cuando el trace se activó después de que la sentencia fue analizada. Actívelo antes de que empiece la operación.
- La misma operación dejó varios archivos. Envíelos todos juntos (analizar juntos).
Próximos pasos
- Encuentre el archivo de trace en el servidor de la base de datos.
- Antes de enviar, vea qué contiene un trace 10046.
- Envíe el archivo desde el navegador.