Como executar o SQL Profiler Trace à noite, em um horário específico?

Como executar o rastreamento do criador de perfil SQL quando um problema precisa ser detectado das 3:00 às 3:30 da manhã? Isso pode ser feito usando um rastreamento do lado do servidor, mas isso é extremamente inconveniente. Não é difícil, mas desconfortável e sempre preguiçoso. Finalmente, decidi automatizar isso de uma vez por todas. Assim:



Jenkins aqui, a propósito, é completamente opcional e serve apenas como uma interface para chamar um script com os parâmetros necessários:



Mostrarei a solução em detalhes, de qualquer maneira, existem muitas especificidades relacionadas especificamente à nossa infraestrutura. Ou seja, farei o que é mostrado à esquerda:



Portanto, o arquivo bat faz alguma coisa e transfere a ação já para o script do PowerShell, para o qual passa todos os parâmetros e mais duas variáveis ​​- '% BUILD_USER_ID%', '% BUILD_USER_EMAIL%' - recebidas da Jenkins. Eles serão úteis para nós mais tarde:



Curiosamente, pouco é realmente valioso no próprio ps1: um certo procedimento é chamado lá, o qual, pelo nome do servidor, cria e retorna o nome do diretório em um compartilhamento especial onde esse arquivo será colocado. O servidor em que esse diretório será criado depende do datacenter em que o servidor está localizado no qual o rastreamento será iniciado. Além disso, o usuário tem o direito de ler o rastreamento, e há um processo que limpa esses diretórios em alguns dias. Como você pode ver, você pode não precisar disso e pode pular tudo isso com segurança.

Agora a ação já está transferida para o servidor em que o rastreamento será iniciado, no arquivo SQL. loc é apenas um parâmetro que contém o caminho em que o rastreamento final será copiado. Você pode substituí-lo por uma constante.



Primeiro, precisamos encontrar um local onde escreveremos o arquivo de rastreamento localmente. Por exemplo, assim:



Em seguida, um pouco de limpeza. De repente, esse arquivo já existe ou alguém executou o rastreamento anteriormente? Você precisará executar o sys.traces e parar / excluir a gravação do rastreamento em% jenkinsTraceSch%, se já houver um. Em seguida, crie um rastreio (limite seu tamanho!) E um pouco de tédio com as chamadas sp_trace_setevent. Você pode facilitar sua vida fazendo CROSS JOIN entre eventos e colunas:



Agora adicione filtros a gosto. Aqui, apenas você termina sua coruja. Este é o primeiro local em que usamos parâmetros de script - tipo de filtro e nome do banco de dados:



Agora o thrash foi:



Em @j, você forma um comando para Job, que será:

  • Aguarde a hora certa com WAITFOR
  • Corra a pista
  • Aguarde o tempo solicitado
  • Pare a corrida
  • Aguarde mais um segundo para o caso - operações assíncronas
  • Forme uma equipe para copiar o rastreamento no lugar certo
  • Realize-a
  • Formulário Assunto e corpo
  • Envie uma carta ao cliente através de sp_send_dbmail com um link para o rastreio

Agora precisamos criar um trabalho com o passo 1 descrito em @j. No entanto, ainda adiciono suicídio a este trabalho, para que Joba desapareça sem deixar rasto no final do trabalho:



Aqui ouço gritos sobre xp_cmdshell ... Não quero comentar sobre isso. No final, ninguém deve testemunhar contra si mesmo no tribunal. Mas você pode fazer o contrário. É improvável que você consiga enviar o rastreamento por correio - é grande. Embora você possa embalá-lo. Bem, deixe-o no próprio servidor e deixe o usuário buscá-lo por conta própria ou puxe-o via UNC para um local acessível ao usuário

Então você tem:

  • Jenkins chama morcego
  • bat chama powershell
  • O powershell chama o script SQL por meio do sqlcmd
  • O script cria Job
  • Job cria um rastreio e envia e-mail antes do suicídio:

Eu nunca teria pensado que uma cadeia tão longa funcionaria. Mas funciona ...



PS: E sim, mesmo que xp_cmdshell seja proibido e você não possa ativá-lo, você tem pelo menos duas maneiras de escrever my_xp_cmdshell. Portanto, essa "proteção" não protege contra nada.

Source: https://habr.com/ru/post/pt431142/


All Articles