SQL Server - Extended Events


Olá pessoal tudo certo? 

Sabemos que a cada nova versão do SQL Server, diversas melhorias são feitas a fim de tornar mais fácil o trabalho do DBA perante a monitoração de um ambiente e resolução de problemas. Tivemos melhorias no SQLDIAG e no SQL Server Profiler, houve o surgimento das DMV’s e DMF’s no SQL Server 2005 e finalmente no SQL Server 2008, surgiu a funcionalidade que irei abordar neste post chamada Extended Events. 

O que são? 

 Extended Events é um sistema de manipulação de eventos que permite ao DBA coletar as informações que ele julgar necessárias para ajudá-lo a resolver determinado problema, permitindo ainda em alguns cenários que ele relacione os dados obtidos do SQL Server com os dados do sistema operacional através do Event Tracing for Windows, mais conhecido como ETW.


 Para quem quiser maiores detalhes sobre a arquitetura do Extended Events, vocês podem conferir o excelente whitepaper do Jonathan Kehayias que usei como referência na escrita deste post: http://msdn.microsoft.com/en-us/library/dd822788.aspx. 
 

Ná prática... 

 É importante dizer que no SQL Server 2008 nós não tínhamos uma interface gráfica que permitisse configurar uma sessão de Extended Events, o DBA precisava escrever queries complexas para fazer esta configuração. No SQL Server 2012 a vida ficou mais fácil, uma interface está disponível para esta finalidade, e pode ser acessada através do Management Studio, como mostra a figura abaixo:


 Vamos criar uma sessão simples simples que monitore a criação de novas bases de dados, no meu caso estou utilizando o SQL Server 2014 CTP1. 

1. Expanda a parte de Extended Events, em “Sessions”, clique com o direito e selecione “New Session Wizard”:


2. Em “Session Name”, vamos chamar a coleta de “NewDB”, clique em “Next”:
 

3. Deixe selecionado “Do not use a template”, clique em “Next”:


4. Localize o evento chamado “database_created”, e clique em “>” para adicioná-lo, depois clique em “Next”:

5. Selecione os campos que serão coletados no evento: “database_id”, “database_name” e “session_id”. Clique em “Next”:

6. Não é necessário aplicar nenhum filtro ou armazenamento dos dados, clique em “Next”.

7. Vamos configurar um arquivo de extensão “xel” onde serão gravados os dados coletados, no caso podemos deixar no diretório “c:\” com o nome “NewDBXevent.xel”, em “Maximum file size” deixe em 1 e a unidade em “GB”, marque a opção “Enable file rollover” e por último, em “Maximum number of files:” deixe em 5:


8. Em “Summary” confira se está tudo de acordo com o que configuramos e clique em “Finish”:

9. Na última tela, selecione a opção “Start the event session immediately after session creation” e clique em “Close”:

10. Agora que nossa coleta usando Extended Events foi configurada, abra uma janela de query e crie uma base de dados chamada “TESTEDB”:


CREATE DATABASE TESTEDB 
GO
 
11. Expanda a coleta que acabamos de criar e clique em “View Target Data...” em nosso pacote "xel" igual na imagem abaixo:


12. Perceba que o nosso evento de criação da base foi coletado com sucesso:

13. Apenas para concluir, o script para a criação desta coleta ficaria da seguinte forma: 

CREATE EVENT SESSION [NewDB] ON SERVER
ADD EVENT sqlserver.database_created(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.session_id))
ADD TARGET package0.event_file(SET filename=N'C:\NewDBXevent.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

Referências utilizadas para a criação deste post:  


Bom pessoal, é isso, espero que tenham gostado do post! Um abraço!

5 comentários:

  1. Anônimo5/12/14

    Boa parceiro...
    At. Szill

    ResponderExcluir
  2. Bom dia !!
    Aí André, este extend events tem a ver com a events() do SQL?
    Pois gostaria de fazer uma trigger de Grant para determinada procedure (caso recriem novamente), porém não estou conseguindo filtrar o evento pela procedure em específico..
    Teria alguma dica?
    Sem o filtro ficaria em algo do tipo:

    CREATE TRIGGER [tgrant_xxx] ON DATABASE FOR CREATE_PROCEDURE, ALTER_PROCEDURE
    AS
    BEGIN
    GRANT EXECUTE ON [xxx] TO [user];
    END
    GO

    Obrigado.

    ResponderExcluir