miércoles, 10 de junio de 2015

Creando una Traza SQL Server (Ejemplo)

Consulta y Creación de una Traza

Finalmente aplicaremos todas las sentencias para crear una traza que registre cada vez que:

° se inicia una instrucción Transact-SQL (event_id 40)

° se completa una instrucción Transact-SQL (event_id 41)

° se inicia un procedimiento almacenado (event_id 42)

° se completa un procedimiento almacenado (event_id 43)

° se inicia una instrucción Transact-SQL de un procedimiento almacenado (event_id 44)

° se ha creado un objeto, como para las instrucciones CREATE INDEX, CREATE TABLE o CREATE DATABASE (event_id 45)

° Realiza un seguimiento de las instrucciones Transact-SQL BEGIN, COMMIT, SAVE y ROLLBACK TRANSACTION (event_id 50)

Como primer paso consultaremos las trazas que estén creadas actualmente con el script

select * from sys.traces

go




Podemos notar que solo existe una traza que actualmente está en estado 1 es decir corriendo. Ahora crearemos una nueva traza lo primero seria definir variables con los argumentos necesarios para el procedimiento sp_trace_create.

declare @tracefile nvarchar(500) set @tracefile=N'F:\Trace\mi_primera_traza’ --(nombre y ubicación del archivo traza)

declare @trace_id int --(Declaramos el id de la traza y lo dejamos sin valor para que el procedimiento asigne este valor)

declare @maxsize bigint --(Declaramos la variable para el tamaño máximo que queremos que tenga cada archivo de la traza)

set @maxsize =20 --(asignamos el valor máximo de tamaño en este caso será de 20MB)

Una vez declarados todos los argumentos procedemos a crear la traza

exec sp_trace_create @trace_id output,2,@tracefile ,@maxsize

go

Si notamos el segundo argumento del procedimiento es un ‘2’ lo cual equivale a que será una traza de opción TRACE_FILE_ROLLOVER.



Si nuevamente consultamos las trazas existentes debe aparecer la que acabamos de crear




Configuración de una Traza

El procedimiento sp_trace_create solo crea la traza pero ahora es necesario añadir los eventos y columnas que la traza va a monitorear para esto usamos sp_trace_setevent, pero el proceso puede llegar a ser engorroso ya que por cada evento que vamos a añadir debemos ejecutar una vez el procedimiento y por cada columna para ese evento debemos ejecutar el procedimiento por ejemplo.

exec sp_trace_setevent 2,50, 1,1

Aquí añadimos a la traza 2 el evento 50 la columna 1 en estado on, para añadir más columnas al mismo debería hacer.

exec sp_trace_setevent 2,50, 2,1;
exec sp_trace_setevent 2,50, 3,1;
exec sp_trace_setevent 2,50, 4,1;

y así consecutivamente hasta poner todas las columnas que quiero para ese evento y posteriormente repetir el proceso para otros eventos, pero para hacer esto de una manera mas sencilla implementaremos un ciclo while de la siguiente manera.

declare @trace_id int --(Declaramos una variable para guardar el id de la traza)

set @trace_id=2 --(Asignamos el id de la traza a la variable)

declare @on bit --(Declaramos una variable para el on/off de la traza)

set @on=1 --(Asignamos el valor a la variable anterior)

declare @current_num int --(Declaramos una variable para el numero de la columna)

set @current_num =1 --(Asignamos un valor inicial)

while(@current_num <65) --(Iniciamos el while y le decimos que realice las acciones hasta que la variable de las columnas llegue a 65)
      begin

/*Iniciamos el proceso del ciclo en el que empezaremos a añadir los eventos y sus columnas, como esto se repetirá hasta que la variable de las columnas llegue a 65, quiere decir que nuestra traza tendrá las columnas de la 1 a la 65 para los eventos que mencionamos antes.*/

exec sp_trace_setevent @trace_id,50, @current_num,@on
exec sp_trace_setevent @trace_id,40, @current_num,@on
exec sp_trace_setevent @trace_id,41, @current_num,@on
exec sp_trace_setevent @trace_id,42, @current_num,@on
exec sp_trace_setevent @trace_id,43, @current_num,@on
exec sp_trace_setevent @trace_id,44, @current_num,@on
exec sp_trace_setevent @trace_id,45, @current_num,@on
set @current_num=@current_num+1
end
go



En este momento nuestra traza ya tiene los eventos y columnas a monitorear


Crear filtros y cambios de estados una Traza

Pero para hacer aún más específico este monitoreo utilizaremos un filtro con el procedimiento sp_trace_setfilter.

sp_trace_setfilter  2, 11, 0, 6 , N'%IUSR_Satelite%';
 go

En este filtro lo que estamos especificando es que filtre para la traza con id 2 en la columna 11 “LoginName” (Nombre de inicio de sesión de SQL Server del cliente.) y cuando ese nombre de inicio de sesión contenga IUSR_Satelite.

En query correspondería a decir Select * from traza2 where LoginName like’%IUSR_Satelite%’



Nuestra traza ya está lista para iniciarse para esto debemos utilizar el procedimiento sp_trace_setstatus porque en este momento la traza está en estado detenido y debemos iniciarla.

declare @trace_id int
set @trace_id=2
exec sp_trace_setstatus  @trace_id,1

Con esto nuestra traza se inicia como no establecimos una hora para que se detenga la detención debe hacerse manual.



Si nuevamente consultamos las trazas existentes veremos que el estado de nuestra traza paso de 0 a 1 es decir iniciada.



Para detenerla nuevamente solo ejecutamos el script anterior pero cambiamos el 1 por 0



Y para eliminar la traza utilizamos el estado 2


Posterior a esto consultamos las trazas y ya no se nos debe mostrar.



Los datos de la traza quedan almacenados en archivos en la ubicación que determinamos al momento de crear la traza.



Y estos pueden ser consultados con el siguiente script

select LoginName,DatabaseName,* from ::fn_trace_gettable(N'F:\Trace\mi_primera_traza.trc',default)
where TextData like '%DateOnly%'
go



Las utilidades dadas a las trazas dentro de la administración son múltiples y dependen de la configuración que se aplique a la misma.


No hay comentarios:

Publicar un comentario