“A operação de espera atingiu o tempo limite” ao executar o SQL Server no Hyper-V

22

Estou executando o SQL Server (2012) em uma instância do Hyper-V. Possui muitos recursos e 25% reservados do total de recursos, o VHD é colocado em uma unidade SSD muito rápida para tempos de resposta rápidos.

De vez em quando, quando os aplicativos que usam o SQL Server não são acessados ​​há um tempo, eles recebem o erro "A operação de espera expirou". Ao recarregar ou tentar novamente acessar o banco de dados, parece ter sido "despertado" e está mais rápido do que nunca.

Existe alguma maneira de garantir que esse modo de suspensão suave não ocorra nesse tipo de ambiente?

Adicionado

Detalhes da exceção: System.ComponentModel.Win32Exception: A operação de espera atingiu o tempo limite

Eric Herlitz
fonte
1
Uma possibilidade de verificar está nas opções do banco de dados, verifique se o Fechamento automático está definido como Falso. Você seria capaz de ver os eventos de fechamento e abertura no log do SQL se isso estivesse ocorrendo.
21712 Jason Cumberland
Alterar o AutoClose não funcionou, provavelmente não é o banco de dados que fica mais lento. O problema provavelmente está relacionado à combinação de Hyper-V e SQL Server.
22712 Eric Herlitz
Se outras respostas não funcionarem, tente stackoverflow.com/a/28626223/1290868, que informa para fazer o que está em support.microsoft.com/en-us/kb/2605597 Isso pode ajudar.
myuce
Para o Sql Server, a meta deve ser 100% reservada.
Joel Coel #

Respostas:

22

Tente executar este comando:

exec sp_updatestats

Incrivelmente, resolveu o problema.

O código acima é o erro antes da execução do comando.

[Win32Exception (0x80004005): The wait operation timed out]

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1742110
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5279619
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1434
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1355
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +140
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +316
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +86
   System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1482
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
   System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
   System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +79
   System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22
   System.Web.UI.Control.PreRenderRecursiveInternal() +83
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974
Jeferson Tenorio
fonte
3
Não basta executar este comando sem entender as consequências. sqlperformance.com/2013/07/sql-statistics/statistics-updates and stackoverflow.com/questions/23440770/…
Rosdi
2
Você deve saber as conseqüências prováveis ​​antes de executar este comando (na verdade, todos os comandos que você executa).
Sohail xIN3N
3
Estou realmente interessado em sua preocupação com as consequências disso? O post vinculado diz que "poderia realmente causar mais dano que bom, e é a opção menos recomendável". - mas parece que o único problema é que ele pode fazer as coisas que seus planos de manutenção já fazem ou ser ineficazes - se a alternativa for uma instância do servidor SQL completamente quebrada - não sei por que você se importaria com a demora ou redundante?
Ian Grainger
1
Estou me perguntando a mesma coisa que @IanGrainger ... alguém quer saber por que executar exec sp_updatestatsé uma má idéia?
Flo
1

Eu tive o mesmo problema. Correr exec sp_updatestatsfuncionava algumas vezes, mas nem sempre. Decidi usar a NOLOCKinstrução em minhas consultas para acelerar as consultas. Basta adicionar NOLOCKapós a cláusula FROM, por exemplo:

SELECT clicks.entryURL, clicks.entryTime, sessions.userID
FROM sessions, clicks WITH (NOLOCK)
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())

Leia o artigo completo aqui .

Flo
fonte
1

Eu tive exatamente o mesmo problema e descobri que foi causado por uma alocação de memória insuficiente na VM Hyper-V. Eu tinha a memória definida como dinâmica, mas ela não estava aumentando conforme necessário - a mudança para uma quantidade fixa de memória, no meu caso 32 GB, resolveu o problema. A interação entre SqlBulkCopy e Sql Server não parece capaz de obter mais memória quando necessário?

TRex
fonte