SMO.Restore.SqlRestore иногда выдает исключение тайм-аута на развернутых компьютерах - PullRequest
5 голосов
/ 30 ноября 2011

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

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)

MSDN довольно легкий по внутренней работе классов SMO. Я не мог найти какой-либо способ изменить время ожидания для выполнения восстановления. Что я могу сделать, чтобы исключение не произошло?


Вот код, выполняющий восстановление

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);
}

Ответы [ 2 ]

8 голосов
/ 01 декабря 2011

Благодаря предложению Кэмерона решение этой проблемы состояло в том, что мне нужно установить ServerConnection.StatementTimeout выше. По-видимому, это часто происходит, когда базы данных больше 3 ГБ.

(...) 
serverConn = new ServerConnection(serverConnInfo);
serverConn.StatementTimeout = 240; //<- set this.
var remoteServer = new Server(serverConn);
var clinicFolder = ClinicFolder(arg);
(...)
0 голосов
/ 24 февраля 2013

U может использовать это, особенно если вы не можете изменить строку подключения или не работает изменение времени ожидания в строке подключения Это работает для меня для зеркальной базы данных более 2 ГБ

Использование (SqlConnection1)

Dim sqlStmt As String = String.Format ("Карта резервного копирования базы данных в DISK = '{0}'", backup_directory + backupfile)

            Using bu2 As New SqlCommand(sqlStmt, SqlConnection1)
                SqlConnection1.Open()
                bu2.CommandTimeout = 180   //this line is the key
                bu2.ExecuteNonQuery()
                SqlConnection1.Close()
            End Using
        End Using
...