Unable to cycle error log file

Recentemente, comecei a receber o seguinte erro:

Unable to cycle error log file from “C:\MSSQL10_50.InstanceA\MSSQL\Log\ERRORLOG” to “C:\MSSQL10_50.InstanceA\MSSQL\Log\ERRORLOG.1” due to OS error “32(failed to retrieve text for this error. Reason: 15105)”. A process outside of SQL Server may be preventing SQL Server from reading the files. As a result, errorlog entries may be lost and it may not be possible to view some SQL Server errorlogs. Make sure no other processes have locked the file with write-only access.” [SQLSTATE 42000] (Error 17049)  DBCC execution completed. If DBCC printed error messages, contact your system administrator. [SQLSTATE 01000] (Error 2528).  The step failed.

Eu tenho JOB que é executado periodicamente que faz a chamada para a procedure sp_cycle_errorlog e o mesmo erro acontece quando executo manualmente a procedure.

O error 32 do SO tem a seguinte descrição: “Operating system error 32(The process cannot access the file because it is being used by another process.)”

Primeira tentativa foi identificar quem poderia estar usando esse arquivo de dentro do SQL Server com o seguinte comando:

SELECT
    *
FROM
    sys.dm_exec_requests a
OUTER APPLY sys.dm_exec_sql_text(a.sql_handle) b
WHERE
    session_id > 50 AND session_id <> @@SPID AND (
    text = 'xp_readerrorlog' OR text = 'sp_cycle_errorlog'
    )
ORDER BY
    start_time;

Infelizmente esse comando não retornou nenhum registro.
Para tentar descobrir qual era o processo fora do SQL Server que estava com o usando o arquivo eu utilizei o Process Explorer. Ele permitiu que eu descobrisse que alem do processo SQLSERVR.EXE e  FDLAUCHER.EXE existia outros 2 processos de SISTEMA obtendo o handle do arquivo do Errorlog do SQL Server.

UnableCycleError02

Uma vez quer consegui identificar esses outros processo a pergunta era: Porque o S.O. estaria fazendo isso? Ou melhor qual thread do S.O estaria usando esses arquivos?

A partir desse momento eu envolvi o time de suporte da Microsoft.

Utilizamos o Process Monitor para capturar o que exatamente estava ocorrendo.UnableCycleError01

Foi identificado que o handle estava vindo via SMB.

https://msdn.microsoft.com/en-us/library/ee681828(VS.85).aspx

FSCTL_REQUEST_OPLOCK control code
Requests an opportunistic lock (oplock) on a file and acknowledges that an oplock break has occurred.
To perform this operation, call the DeviceIoControl function using the following parameters.

A partir de agora eu precisa descobrir da onde vinha a requisição SMB que estava fazendo gerar o erro e para isso utilizei dois comando PowerShell:

Get-SmbOpenFile | Where-Object -Property Path -Match "ERRORLOG" 

Get-SmbOpenFile | Where-Object -Property Path -Match "MSSQL\Log"

O segundo comando nao teve nenhum resultado mas o primeiro comando me retornou algo que ajudou a resolver o meu problema. 
UnableCycleError03

Pude constatar que a existia uma maquina da ferramenta de monitoramento que estava acessando o arquivo via SMB e fazendo lock no handle. A partir desse momento eu ja tinha insumos suficientes para entrar em contato com o fornecedor e solicitar a correção do meu problema.

Esse problema ocorreu apenas em apenas um ambiente (Windows Server 2012 R2 e SQL Server 2008 R2) onde era um bug da ferramenta de monitoramento, uma vez que atualizei a ferramenta para a versão mais recente esse comportamento parou de acontecer e meu problema não voltou a ocorrer.

Gostaria de agradecer ao Danilo e Daniel pela ajuda.

 

Maníaco, entusiasta, fascinado, fanático por SQL Server e nas horas vagas um DBA que adora o que faz! Também possui certificações como: MCT, MCSE - Data Management and Analystics, MCSE - Data Plataform e MCSA - SQL Server 2016/2014/2012

Responda