Categorias
SQL Server Troubleshooting Virtual PASS BR

Unable to cycle error log file

[bing_translator]

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.

 

Categorias
How To SQL Server Troubleshooting Virtual PASS BR

Aumentar o numero de arquivos do Errorlog e limitar o seu tamanho físico

O log de erro do SQL Server (ERRORLOG) contem muitas informações geradas pelo SQL Server como mensagens, alertas, eventos críticos, auditoria, informações geradas a partir dos usuários entre outras. O log de erro é um ótimo lugar para encontrar informações sobre o que está acontecendo com seu ambiente.

O ErrorLog é inicializado cada vez que a instancia do SQL Server é iniciada ou quando o log de erro é reciclado. Se a instancia não tem sido reiniciada por um longo tempo, o arquivo de log de erro pode crescer consideravelmente dificultando a seu leitura em uma possível analise.

Por padrão, os logs de erro de SQL Server são mantidos na subpasta de Log do SQL Server e há sete logs de erro do SQL Server. Quando o arquivo de log de erros é recriado, o log anterior é renomeado para Errorlog.1 e próximo log anterior (Errorlog.1) é renomeado para Errorlog.2 e assim por diante.

Aumentando o numero de arquivos

Para aumentar o numero de arquivos do ErrorLog do SQL Server, você deve se conectar a uma instancia e clicar com botão direito em SQL Server Log e depois em “Configure”.

Errorlog1

Figura 1

Depois habilite a única check box disponível e aumente o numero de log de erro que pode chegar até 99 arquivos.

Errorlog2

Figura 2

Para saber o caminho fisicamente onde os arquivos de log de erro estão armazenados você pode utilizar esse T-SQL para ajuda-lo.

SELECT SERVERPROPERTY(‘ErrorLogFileName’);

Abaixo o SCRIPT para a alterar a quantidade de ErrorLog :

USE [master]

GO

EXEC xp_instance_regwrite N’HKEY_LOCAL_MACHINE’, N’Software\Microsoft\MSSQLServer\MSSQLServer’, N’NumErrorLogs’, REG_DWORD, 99

GO

Novidade no SQL Server 2012

No SQL server 2012 existe uma nova opção para os arquivos de ErrorLog que é o limite por tamanho!
Podemos a partir de agora limitar o tamanho fisico do arquivo do ErrorLog 🙂
Com o comando abaixo limitamos o tamanho do arquivo em 5MB

USE [master];

GO

EXEC xp_instance_regwrite N’HKEY_LOCAL_MACHINE’,N’Software\Microsoft\MSSQLServer\MSSQLServer’, N’ErrorLogSizeInKb’, REG_DWORD, 5120;

GO

Na minha visão, essa opção é muito util quando temos grandes problema ou incidicio de problema eventos são gravados no errorlog. Com esse limitador de tamanho podemos ter a facilidade de abrir um arquivo de errorlog em um troubleshooting ou ate mesmo controlar o espaço em disco caso seja necessario!

Reciclar o ErrorLog

Para reciclar os arquivos de log de erro do SQL Server devemos executar a seguinte procedure de sistema:

sp_cycle_errorlog

Essa procedure deve ser executada diretamente na database master.

Essa procedure fecha o arquivo de log de erros atual e altera os números de extensão de log de erros, simulando um reinício da instancia.

Assim como log de erro do SQL Server o log de erro do SQL Server Agent é um ótimo lugar para buscar informações sobre o que está acontecendo com o SQL Server Agent. Porém, não é possível aumentar a quantidade de arquivos do log de erro do SQL Server Agent, sendo fixado em um total de 10 arquivos, com 1 arquivo corrente (SQLAGENT.OUT) e 9 arquivos de log (SQLAGENT.1 até SQLAGENT.9)

Da mesma maneira que acontece com o log de error do SQL Server o log de erro do SQL Server Agent é inicializado quando a instancia é iniciada ou quando o log de erro é reciclado.

Para reciclar os arquivos de log de erro do SQL Server Agent devemos executar a seguinte procedure de sistema:

sp_cycle_agent_errorlog

Essa procedure deve ser executada diretamente na database msdb.

Referencia:

Limit the size of the error log