2011-11-30 14 views
5

Yazılımımızın demoları için veritabanlarını yönetmek için kullanılan bir uygulamam var, yaptığı şeylerden biri veritabanının bir kopyasını merkezi sunucudan almak ve geri yüklemek. yerel bir SQL örneğine. Her şey yedek kısımda doğru şekilde çalışıyor ancak geri yükleme sırasında bazı insanlar geri yükleme işleminin ortasında aşağıdaki istisnaları aldıklarını bildiriyorlar. SMO.Restore.SqlRestore bazen dağıtılan bilgisayarlarda bir zaman aşımı istisnası atar

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) 

SMO sınıfları iç çalışma ile MSDN is fairly light

. Geri yüklemeyi yürütmek için zaman aşımı süresini değiştirmek için herhangi bir yöntem bulamadım. Ne yapabilirim ki istisna olmayacak?


İşte bu sorunun çözümü, ben ServerConnection.StatementTimeout yüksek ayarlamanız gerekir olmasıydı Camerons öneriye

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

size Can REPROD Bunu şahsen mi yaptın? Veritabanı boyutu bir faktör mü? Buna neden olabilecek gerçekten büyük ikili alanlar var mı? Zaman aşımı tutarlı bir zaman aralığından sonra ortaya çıkıyor mu? Eğer gerçekten sıkışmışsanız, nasıl çalıştığını (ve muhtemelen yansıtma yoluyla (özel/dahili üyelere ulaşmak için), daha yüksek bir zaman aşımıyla) görmek için Reflector'u kullanarak gerçek meclisleri kazmaktan biraz şansınız olabilir. Bunu gördünüz mü (http://stackoverflow.com/q/5979086/21475)? – Cameron

cevap

8

Teşekkür geri gerçekleştiren kodudur. Görünüşe göre bu, veritabanlarının 3 GB'den büyük olduğu durumlarda sıkça görülür. Eğer bağlantı dizesini veya bağlantı dizesinde zaman aşımı değiştirilmesini çalışmıyor değiştiremezsiniz zaman

(...) 
serverConn = new ServerConnection(serverConnInfo); 
serverConn.StatementTimeout = 240; //<- set this. 
var remoteServer = new Server(serverConn); 
var clinicFolder = ClinicFolder(arg); 
(...) 
0

U kullanabiliriz, özel olarak bu 2 üzerinde yansıtılmış veritabanı için benim için

kullanma GB

(SqlConnection1bağlantı işleri , backup_directory + backupfile)

Dim sqlStmt As string = String.Format ("DİSK = '{0}' İÇİN backup database haritası")

  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 
+1

Evet, StatementTimeout, CommandTimeout ile eşleşir, ancak bu soru SMO SqlCommand kullanmadı. –