2011-03-21 38 views
10

No estoy seguro si esto es posible. Estoy en 10g. El resultado final sería el siguiente: (?)¿Cómo encontrar las últimas 10 consultas de Oracle por nombre de usuario?

Username  | Date/Time   | sqltext 
jdoe   | 3/21/11 10:32:27  | select sum(total) from sales where in_date > '08-JAN-11' 
jdoe   | 3/21/11 10:32:21  | delete from products_old 
jdoe   | 3/21/11 10:32:18  | select item, description from products where item = 'blah' 
jdoe   | 3/21/11 10:32:06  | select count(item) from products 
jdoe   | 3/21/11 10:31:44  | describe products 

Parece V $ SQL almacena casi todas las consultas SQL enviadas vez, pero lo que puedo unirme a que para obtener un nombre de usuario y la fecha?

+1

V $ SESSION mantiene nombre de usuario. http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2088.htm – ukhardy

Respuesta

6

Si tiene la edición empresarial y el paquete de rendimiento y ajuste (de lo contrario, la consulta de las tablas AWR infringe su licencia), la vista V$ACTIVE_SESSION_HISTORY será la más cercana que obtendrá. Esto capturará en cada segundo lo que cada sesión activa estaba ejecutando. Si tiene un usuario que está ejecutando muchas sentencias SQL por segundo o sus sentencias SQL son lo suficientemente rápidas para que no estén activas en un segundo límite particular, sin embargo, no se capturarán todas las consultas. Si solo está tratando de obtener un muestreo general de las últimas 10 cosas que ha hecho un usuario en particular (con un sesgo para capturar consultas de mayor duración), el AWR debería ser suficiente. Pero si intenta hacer algo como rastrear lo que un usuario está haciendo en su sesión, el AWR no sería apropiado.

Si desea capturar absolutamente todo lo que hace un usuario, necesitará rastrear la sesión. Eso causará que se genere un archivo de rastreo bastante voluminoso en el servidor que puede resumir utilizando la utilidad tkprof. Pero eso requiere que habilite el rastreo para una sesión en particular antes de que se ejecute el SQL de interés, no es algo que se pueda hacer retroactivamente.

Si solo estaba interesado en los cambios realizados en la sesión, puede usar LogMiner para revisar los registros de rehacer y ver lo que el usuario estaba haciendo. Eso se puede hacer retroactivamente, pero dado que las instrucciones SELECT no generan REDO, no se escribirían en los registros de rehacer y serían invisibles para LogMiner.

1

Si está utilizando JDBC, siempre puede usar el Log4jdbc wrapper library. Registra toda la actividad de jdbc en - adivinó - log4j.

Puede configurar el nivel de registro para varios tipos de eventos, muestra el sql emitido (con variables de enlace reemplazadas por sus valores) y la información de tiempo. Lo uso todo el tiempo.

Cuestiones relacionadas