Introducción
Como administrador de bases de datos nos interesa automatizar el seguimiento de los servidores de bases de datos, de tal forma que podamos recoger lo que ha sucedido o que se nos informe al momento. Para ello nos van a ser muy útiles los eventos y la infraestructura que tiene SQL Server que nos facilita el trabajo.
Las notificaciones de eventos son una forma de recuperar eventos específicos enviándolos a una cola de Service Broker. Una de las ventajas que tienen es que son asíncronas, por lo que podemos procesarlas después en grupo y realizar una actividad de auditoría o revisión. También ejecutar acciones a posteriori. O ambas cosas, como veremos en el siguiente artículo.
Otra de las ventajas es que se ejecutan fuera del ámbito de una transacción, por lo que el impacto que tienen en las transacciones de negocio es mínimo, aunque mayor que la traza al generarse siempre la información completa del evento y en formato XML. Sin embargo tiene dos ventajas muy importantes: una es que no tenemos que usar ficheros (o tablas especiales) y la otra es que siempre están activas aunque se reinicie el servidor de base de datos.
También debemos destacar que solo se lanzan si la transacción se acepta. Los eventos se guardan en una cola interna y no se mandan los mensajes hasta que no se acepta la acción que generó el evento. Por lo tanto, tenemos la seguridad de que cualquier evento DDL ha ocurrido.
La flexibilidad en la información nos la da el que los datos del evento se entregan en formato XML. Es el mismo formato que encontraríamos en un desencadenador DDL o en uno de inicio de sesión. Es decir, el formato es el de EVENTDATA.
La definición del esquema la podemos encontrar en el fichero events.xsd del subdirectorio schemas de la instalación de SQL Server. En Internet está publicada la última versión en:
Dentro de este esquema vamos a encontrar muchas definiciones, pero las de los eventos son las que empiezan por EVENT_INSTANCE_. Lo que hay a continuación es el nombre del evento, por ejemplo EVENT_INSTANCE_DATA_FILE_AUTO_GROW.
Por lo tanto, para consultar los datos de un evento, no los vamos a recibir en forma tabular como los de las trazas, sino que tendremos que usar consultas XQuery, siendo lo mejor usar value().
Como hemos dicho, los eventos se devuelven en formato XML. Veamos la definición de uno de ellos, que luego utilizaremos:
Podemos apreciar que hay una parte que tienen todos los eventos: el tipo, la hora y el identificador de proceso del sistema de la conexión que ha lanzado el evento. El resto de información depende del evento, aunque hay grupos que tienen información parecida y por lo tanto los podemos procesar a la vez.
Otra forma de ver los eventos a los que tenemos acceso es mediante una vista del catálogo de objetos. La vista sys.event_notification_event_types «devuelve una fila para cada evento o grupo de eventos en el que se puede activar una notificación de eventos». Fijémonos que se habla de grupo de eventos también. Es decir, la vista del catálogo es jerárquica y tiene un campo parent_type que nos dice el grupo al que pertenece cada evento. Si buscamos eventos relacionados con los archivos, podemos usar:
Si nos fijamos, las que nos interesan están relacionadas con el grupo de eventos 11002. Veamos si podemos usar el grupo. Para ello buscamos todas las de dicho grupo:
Como vemos, en el grupo hay un evento de más que, si no tenemos activado ningún espejo, entonces podríamos usar el grupo, pero por seguridad lo mejor es usar los cuatro eventos de crecimiento y reducción de archivos.
Si tenemos curiosidad por saber el grupo, podemos consultarlo:
Son eventos para seguimiento de la base de datos, por eso incluye el de espejo.
Por último, ¿cuál es la raíz de la jerarquía? Pues lo consultamos también:
Efectivamente, el grupo 11000 es el seguimiento de todos los eventos y es la raíz porque no tiene ascendiente.
Iniciamos una serie de artículos donde mediante un ejemplo para seguir los eventos de archivos de bases de datos, vamos a ver los objetos relacionados con el seguimiento de eventos. Hemos empezado por describir cómo conocer los eventos a los que tenemos acceso tanto mediante la definición XML de los eventos como mediante la vista del catálogo que los relaciona.
Dejar un comentario
¿Quieres unirte a la conversación?¡Siéntete libre de contribuir!