在Hyper-V中运行SQL Server时,“等待操作超时”


22

我在Hyper-V实例上运行SQL Server(2012)。VHD具有足够的资源,并且保留了总资源的25%,VHD放置在非常快的SSD驱动器上,以加快响应速度。

偶尔,当使用SQL Server的应用程序有一段时间没有被访问时,会出现错误“等待操作超时”。重新加载或尝试访问数据库时,它似乎已被“唤醒”,并且速度一如既往。

有什么方法可以确保在这种环境下不会出现这种软睡眠模式?

添加

异常详细信息: System.ComponentModel.Win32Exception:等待操作超时


1
一种检查方法是在数据库选项上,确保将“自动关闭”设置为“假”。如果发生这种情况,您将能够在SQL日志中看到关闭和打开事件。
杰森·坎伯兰

更改自动关闭功能无效,可能不是数据库速度变慢。该问题很可能与Hyper-V和SQL Server组合有关。
埃里克·赫里兹

如果其他答案不起作用,请尝试stackoverflow.com/a/28626223/1290868,该命令告诉您执行support.microsoft.com/en-us/kb/2605597上的内容,这可能会有所帮助。
myuce

对于Sql Server,目标应该是100%保留。
Joel Coel 2015年

Answers:


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


2
在运行此命令(实际上是您运行的每个命令)之前,您应该知道可能的后果。
Sohail xIN3N 2014年

3
我对您对这种后果的担忧真的很感兴趣?链接的帖子说:“实际上可能会造成更大的损失,这是最不值得推荐的选择。” -但似乎唯一的问题是它可能会执行您的维护计划已经做的事情,或者效率很低-如果替代方案是一个完全损坏的SQL Server实例-我不确定您为什么介意它会很慢还是多余?
伊恩·格兰杰

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 VM上的内存分配不足引起的。我将内存设置为动态,但没有按要求扩展-切换到固定数量的内存(以我的情况为32GB)解决了该问题。SqlBulkCopy和Sql Server之间的交互似乎无法在需要时获得更多的内存?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.