„Upłynął limit czasu operacji oczekiwania” podczas uruchamiania programu SQL Server w Hyper-V

22

Korzystam z programu SQL Server (2012) w instancji funkcji Hyper-V. Ma mnóstwo zasobów i 25% rezerwy w stosunku do wszystkich zasobów, dysk VHD jest umieszczony na bardzo szybkim dysku SSD dla szybkiego czasu reakcji.

Co jakiś czas, gdy aplikacje korzystające z SQL Server nie były dostępne przez jakiś czas, pojawia się błąd „Upłynął limit czasu operacji oczekiwania”. Podczas ponownego ładowania lub ponownej próby uzyskania dostępu do bazy danych wydaje się, że została „przebudzona” i działa tak szybko, jak zawsze.

Czy istnieje sposób, aby zapewnić, że ten miękki tryb uśpienia nie wystąpi w tego rodzaju środowisku?

Dodany

Szczegóły wyjątku: System.ComponentModel.Win32Exception: Upłynął limit czasu operacji oczekiwania

Eric Herlitz
źródło
1
Jedną z możliwości sprawdzenia są opcje bazy danych, upewnij się, że Auto Close jest ustawione na False. W dzienniku SQL można zobaczyć zdarzenia zamknięcia i otwarcia.
Jason Cumberland
Zmiana AutoClose nie działała, prawdopodobnie nie spowalnia ona baz danych. Problem najprawdopodobniej związany jest z kombinacją Hyper-V i SQL Server.
Eric Herlitz,
Jeśli inne odpowiedzi nie działają, spróbuj stackoverflow.com/a/28626223/1290868, który mówi, aby zrobić to, co jest na support.microsoft.com/en-us/kb/2605597 To może pomóc.
myuce
W przypadku Sql Server cel powinien być w 100% zarezerwowany.
Joel Coel

Odpowiedzi:

22

Spróbuj wykonać to polecenie:

exec sp_updatestats

To niewiarygodnie rozwiązało problem.

Kod powyżej błędu przed wykonaniem polecenia.

[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
źródło
3
Nie uruchamiaj tego polecenia bez zrozumienia konsekwencji. sqlperformance.com/2013/07/sql-statistics/statistics-updates and stackoverflow.com/questions/23440770/…
Rosdi
2
Powinieneś znać prawdopodobne konsekwencje przed uruchomieniem tego polecenia (w rzeczywistości każdego polecenia, które uruchomisz).
Sohail xIN3N
3
Jestem naprawdę zainteresowany twoją troską o konsekwencje tego? W poście z łączem jest napisane: „może faktycznie wyrządzić więcej szkód niż to dobre i jest to najmniej godna polecenia opcja”. - ale wydaje się, że jedynym problemem jest to, że może robić to, co już robią plany konserwacji, lub może być nieefektywne - jeśli alternatywą jest instancja serwera SQL, która jest całkowicie zepsuta - nie jestem pewien, dlaczego miałbyś tak powolny czy zbędne?
Ian Grainger
1
Zastanawiam się nad tym samym, co @IanGrainger ... ktoś chciałby wyjaśnić, dlaczego wykonanie exec sp_updatestatsjest złym pomysłem?
Flo
1

Miałem ten sam problem. Bieganie exec sp_updatestatsczasem działało, ale nie zawsze. Postanowiłem użyć NOLOCKinstrukcji w moich zapytaniach, aby przyspieszyć zapytania. Po prostu dodaj NOLOCKpo klauzuli FROM, np .:

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

Przeczytaj cały artykuł tutaj .

Flo
źródło
1

Miałem dokładnie ten sam problem i stwierdziłem, że był on spowodowany niewystarczającą alokacją pamięci w maszynie wirtualnej Hyper-V. Pamięć była ustawiona na dynamiczną, ale nie wymagała ona skalowania w miarę potrzeby - przejście na stałą ilość pamięci, w moim przypadku 32 GB, rozwiązało problem. Interakcja między SqlBulkCopy i Sql Server nie wydaje się być w stanie uzyskać więcej pamięci, gdy jest to wymagane?

TRex
źródło