Ho un'app utilizzata per la gestione dei database per le demo del nostro software, una delle cose che fa è ottenere una copia di un database da un server centrale e ripristinare a un'istanza SQL locale. Tutto funziona correttamente sulla porzione di backup ma sul ripristino alcune persone stanno segnalando che ottengono la seguente eccezione nel mezzo del ripristino.SMO.Restore.SqlRestore a volte genera un'eccezione di timeout sui computer distribuiti
Microsoft.SqlServer.Management.Smo.FailedOperationException: Restore failed for Server 'Computername'.
---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:
An exception occurred while executing a Transact-SQL statement or batch.
---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
(snip)
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
--- End of inner exception stack trace ---
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
(snip)
at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv)
--- End of inner exception stack trace ---
at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv)
at ContractFlowTool.WebInfinity2.AttachDatabase.RestoreLocal(AttachDatabaseArgs arg)
La MSDN is fairly light sul funzionamento interno delle classi SMO. Non sono riuscito a trovare alcun metodo per modificare il tempo di timeout per l'esecuzione del ripristino. Cosa posso fare in modo che l'eccezione non accada?
ecco il codice che esegue il ripristino
private static bool RestoreLocal(AttachDatabaseArgs arg)
{
if (arg.DestDatabase == null)
throw new ArgumentNullException("DestDatabase");
SqlConnectionInfo serverConnInfo = new SqlConnectionInfo(/*snip*/);
ServerConnection serverConn = null;
serverConn = new ServerConnection(serverConnInfo);
var remoteServer = new Server(serverConn);
var clinicFolder = ClinicFolder(arg);
var restore = new Restore();
restore.PercentCompleteNotification = 5;
restore.NoRecovery = false;
restore.RelocateFiles.Add(/*snip mdf*/);
restore.RelocateFiles.Add(/*snip ldf*/);
restore.Database = arg.LocalDB;
restore.ReplaceDatabase = true;
restore.Action = RestoreActionType.Database;
restore.PercentComplete += arg.ProgressForm.Restore_PercentComplete;
restore.SqlRestore(remoteServer);
}
Can si reprod questo lo fai personalmente? La dimensione del database è un fattore? Ci sono campi binari davvero enormi che potrebbero causare questo? Il timeout si verifica dopo un intervallo di tempo consistente? Se sei davvero bloccato, potresti avere un po 'di fortuna a scavare negli assiemi usando Reflector per vedere come funzionano (e replicandolo, probabilmente attraverso la riflessione (per ottenere membri privati / interni), con un timeout più alto). Hai visto [questo] (http://stackoverflow.com/q/5979086/21475)? – Cameron