Eu tenho um processo que inicia e interrompe sessões de eventos estendidos para transferir dados de arquivos de eventos para tabelas SQL. Em um servidor SQL Server 2022 RTM, vejo muitas linhas gravadas nos arquivos de log por este processo:
Gostaria que o início e a interrupção das sessões XE não fossem gravados no arquivo de log porque meus arquivos de log agora estão esmagadoramente preenchidos com essas entradas. Esse comportamento não ocorre em uma instância do Microsoft SQL Server 2019 (RTM-CU22-GDR).
Como posso evitar que o SQL Server registre o início e a interrupção das sessões XE nos arquivos de log do servidor?
Nota do leitor: Isso foi feito com símbolos públicos do Microsoft Symbols Server .
Os itens de início e parada do log de erros estão sendo gerados nas funções
XEventController::AlterEventSession
eXEventController::VLR_StopXESession::CommitAndRelease
, respectivamente, nosqllang.dll
SQL Server 2022 RTM.Iniciar gravações
Olhando primeiro para a função start, que é uma função muito grande, a chamada antes de 0x107e:
O
mov
intoecx
está carregando0x6499
a passagemsqllang!scierrlog
que podemos deduzir é o número do erro para escrever a mensagem, que de fato0x6499
(0n25753
) corresponde à documentação pública .Olhando para os itens que podem executar o código, há uma única ramificação que aponta nessa direção
sqllang!XEventController::AlterEventSession+0x101f
Não parece haver um sinalizador de rastreamento ou outra verificação facilmente definida; na verdade, parece depender do retorno de um ponteiro de função em
sqllang!XE_API::sm_ClientAPI+0xa8
. Eu diria que para o item start errorlog, não haveria uma maneira facilmente configurável de desligá-lo.Dado que agora você sabe onde encontrar isso, você pode injetar seu próprio código e
NOP
(oujmp
) a chamada parascierrlog
a qual claramente não seria suportada.Observando uma instância CU24 do SQL Server 2019, a mesma função não tem referências ao log de erros e tem muitas alterações diferentes. Parece que em 2022 foram feitas adições a esta função que não foram retroportadas para 2019.
Parar gravações
É interessante que stop não esteja na mesma função, visto que start era onde
AlterEventSession
se pensaria que seria usado paraALTER
comandos T-SQL para sessões de eventos 🤷♂️Felizmente
sqllang!XEventController::VLR_StopXESession::CommitAndRelease
é uma função muito menor. Usando o que aprendemos na investigação da função anterior, haverá um carregamento deecx
com o número de erro correspondente e, em seguida, uma chamada parascierrlog
. Com certeza, está lá e é muito fácil de identificar logo no início da função!Aqui podemos ver no
ecx
valor de 32 bits de0x649A
(0n25754
) carregado e depois uma chamada parascierrlog
, curiosamente antes disso existe uma chamada semelhante asqllang!XE_API::sm_ClientAPI
mas com um deslocamento muito diferente. Independentemente disso, não há teste condicional em torno do retorno da chamada, portanto, ele sempre gravará isso no log de erros e não parece ser controlado por um traceflag ou outro mecanismo. Isso é muito mais simples do que a montagem inicial.A mesma opção se aplica aqui, substitua a instrução de chamada por
NOP
s.Verificar esta função em relação à mesma instância SQL 2019 CU24 mencionada anteriormente também mostra um pouco de código diferente no início da função, que, novamente, não parece ter a chamada de log de erros nem ser portado (para melhor ou para pior).
Maior esforço
Uma maneira que poderia ser suportada seria criar um driver de filtro de sistema de arquivos muito pequeno para verificar se há gravações de arquivos especificamente no arquivo de log de erros e verificar se os dados que estão sendo gravados são algo que você realmente não deseja. Você poderia então jogá-lo fora silenciosamente e ninguém saberia, o log não o mostraria e, esperançosamente, o driver do filtro não teria bugs ou quebraria qualquer outra coisa no ambiente.
Menor esforço
Abra um ticket de suporte com a Microsoft e solicite que seja feita uma alteração no produto para uma opção de desligar o registro das mensagens para que haja uma forma suportada.