2009-06-24 9 views
4

Je tente de restaurer une base de données en restaurant d'abord une sauvegarde complète, puis en restaurant une sauvegarde différentielle à l'aide de la classe Microsoft.SqlServer.Management.Smo.Restore. La sauvegarde complète est restaurée avec le code suivant:Restauration d'une sauvegarde différentielle avec un objet SMO Restore

Restore myFullRestore = new Restore(); 
myFullRestore.Database = "DatabaseName"; 
myFullRestore.Action = RestoreActionType.Database; 
myFullRestore.AddDevice(@"C:\BackupFile.bak", DeviceType.File); 
myFullRestore.FileNumber = 1; 
myFullRestore.SqlRestore(myServer); // myServer is an already-existing instance of Microsoft.SqlServer.Management.Smo.Server 

Après la restauration de la sauvegarde complète (qui complète avec succès), mon code pour restaurer la sauvegarde différentielle est la suivante:

Restore myDiffRestore = new Restore(); 
myDiffRestore.Database = "DatabaseName"; 
myDiffRestore.Action = RestoreActionType.Database; 
myDiffRestore.AddDevice(@"C:\BackupFile.bak", DeviceType.File); 
myDiffRestore.FileNumber = 4; // file contains multiple backup sets, this is the index of the set I want to use 
myDiffRestore.SqlRestore(myServer); 

Cependant, ce code lancera une exception Microsoft.SqlServer.Management.Smo.FailedOperationException avec le message "La restauration a échoué pour le nom de serveur ''. Dois-je indiquer explicitement que je suis en train de restaurer une sauvegarde différentielle, et si oui, comment procéder? Ou le problème est-il moins évident que cela? Toute suggestion sur ce que je fais de mal (ou négliger de faire) serait grandement appréciée.

Mise à jour: Je ne sais pas si cela était à l'origine une faute de frappe ou si les versions antérieures avaient cette forme de l'API, mais pour les versions ultérieures de cette ligne

fullRestore.AddDevice(...); 

doivent être

fullRestore.Devices.AddDevice(...) 

Répondre

4

Après un peu plus de creuser j'ai compris celui-ci. Pour la restauration à effectuer une sauvegarde différentielle, la restauration complète doit être effectuée avec l'ensemble NoRecovery true:

// before executing the SqlRestore command for myFullRestore... 
myFullRestore.NoRecovery = true; 

Ceci indique qu'un autre journal des transactions doit être appliquée, ce qui dans ce cas est la sauvegarde différentielle. Cette page contient d'autres informations que j'ai trouvées utiles: http://doc.ddart.net/mssql/sql70/ra-rz_9.htm

+2

La restauration avec NoRecovery = true laissera la base de données dans un état de "restauration". Pour le rendre utilisable à nouveau, utilisez cette commande: RESTORE DATABASE WITH RECOVERY – James

+0

Bonjour, Donut de la même manière pouvez-vous s'il vous plaît me dire comment restaurer le différentiel de base de données en fonction d'une date donnée. –

+0

@kalyan Je ne sais pas exactement ce que vous demandez; avez-vous un ensemble de sauvegardes différentielles et vous souhaitez les restaurer ** jusqu'à une certaine date? Ou voulez-vous commencer ** à une date donnée et appliquer toutes les sauvegardes différentielles suivantes? Ou peut-être quelque chose d'autre entièrement - pourriez-vous clarifier? – Donut