«Тайм-аут операции ожидания» при запуске SQL Server в Hyper-V

22

Я использую SQL Server (2012) на экземпляре Hyper-V. Он имеет много ресурсов и зарезервирован на 25% от общего объема ресурсов. VHD размещен на очень быстром SSD-диске для быстрого отклика.

Время от времени, когда приложения, использующие SQL Server, не были доступны в течение некоторого времени, они получают сообщение об ошибке «Время ожидания истекло». При перезагрузке или повторной попытке доступа к базе данных она, похоже, «проснулась» и работает так же быстро, как и раньше.

Есть ли способ гарантировать, что этот режим мягкого сна не происходит в такой среде?

добавленной

Сведения об исключении: System.ComponentModel.Win32Exception: истекло время ожидания операции ожидания

Эрик Херлиц
источник
1
Одна возможность проверить это на параметрах базы данных, убедитесь, что для Auto Close установлено значение False. Вы сможете увидеть события закрытия и открытия в журнале SQL, если это происходит.
Джейсон Камберленд
Изменение AutoClose не сработало, вероятно, не базы данных замедляются. Эта проблема, скорее всего, связана с комбинацией Hyper-V и SQL Server.
Эрик Херлиц
Если другие ответы не работают, попробуйте stackoverflow.com/a/28626223/1290868, в котором говорится, что делать на support.microsoft.com/en-us/kb/2605597. Это может помочь.
Myuce
Для Sql Server цель должна быть зарезервирована на 100%.
Джоэл Коэль

Ответы:

22

Попробуйте выполнить эту команду:

exec sp_updatestats

Это, невероятно, решило проблему.

Код над ошибкой перед выполнением команды.

[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
Джефферсон Тенорио
источник
3
Не запускайте эту команду без понимания последствий. sqlperformance.com/2013/07/sql-statistics/statistics-updates и stackoverflow.com/questions/23440770/…
Росди
2
Вы должны знать вероятные последствия перед выполнением этой команды (фактически каждой команды, которую вы выполняете).
Сохаил xIN3N
3
Мне искренне интересно, что вы беспокоитесь о последствиях этого? В сообщении говорится, что «на самом деле может принести больше вреда, чем пользы, и это наименее рекомендуемый вариант». - но, похоже, единственная проблема в том, что он может делать то, что ваши планы обслуживания уже делают, или быть неэффективным - если альтернативой является экземпляр SQL-сервера, который полностью сломан - я не уверен, почему вы не возражаете, что он может быть медленным или избыточный?
Ян Грейнджер
1
Мне интересно то же самое, что и @IanGrainger ... кто-нибудь хочет уточнить, почему исполнение exec sp_updatestats- плохая идея?
Flo
1

Я была такая же проблема. Бег exec sp_updatestatsработал иногда, но не всегда. Я решил использовать это NOLOCKутверждение в своих запросах, чтобы ускорить запросы. Просто добавьте NOLOCKпосле вашего предложения FROM, например:

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

Прочитайте полную статью здесь .

Фло
источник
1

У меня была точно такая же проблема, и я обнаружил, что она была вызвана нехваткой памяти на виртуальной машине Hyper-V. У меня была установлена ​​динамическая память, но она не увеличивалась должным образом - переход к фиксированному объему памяти, в моем случае 32 ГБ, решил проблему. Взаимодействие между SqlBulkCopy и Sql Server, по-видимому, не в состоянии получить больше памяти при необходимости.

TRex
источник