2009-06-24 4 views
4

Я пытаюсь восстановить базу данных, сначала восстановив полную резервную копию, а затем восстановив дифференциальную резервную копию, используя класс Microsoft.SqlServer.Management.Smo.Restore. Полная резервная копия будет восстановлена ​​с помощью следующего кода:Восстановление дифференциального резервного копирования с объектом восстановления SMO

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 

После восстановления полной резервной копии (которая завершает успешно), мой код для восстановления дифференциальной резервной копии следующим образом:

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

Однако, этот код будет вызывать исключение Microsoft.SqlServer.Management.Smo.FailedOperationException, с сообщением «Restore failed for server» servername ». Нужно ли явно указывать, что я восстанавливаю дифференциальную резервную копию, и если да, то как мне это сделать? Или проблема менее очевидна? Любые предложения относительно того, что я делаю неправильно (или пренебрежение делать), будут очень признательны.

Update: Не уверен, что если бы это было первоначально опечатка или были ли предыдущие версии этой формы API, но для более поздних версий эта линия

fullRestore.AddDevice(...); 

должен быть

fullRestore.Devices.AddDevice(...) 

ответ

4

После немного больше копая, я понял это. Для того, чтобы дифференциального резервного восстановления на работу, в полной мере должна быть выполнена с NORECOVERY значение ИСТИНА восстановления:

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

Это указывает, что другой журнал транзакций должен быть применен, который в данном случае является дифференциальное резервное копирование. На этой странице есть дополнительная информация, которую я нашел полезной: http://doc.ddart.net/mssql/sql70/ra-rz_9.htm

+2

Восстановление с помощью NoRecovery = true оставит базу данных в состоянии «Восстановить». Чтобы снова использовать его, используйте эту команду: RESTORE DATABASE <имя базы данных> С ВОССТАНОВЛЕНИЕМ – James

+0

Здравствуйте, пончик так же, пожалуйста, скажите мне, как восстановить Базовый дифференциал на основе определенной даты. –

+0

@kalyan Я не совсем уверен, что вы просите; у вас есть набор дифференциальных резервных копий, и вы хотите восстановить их ** до ** определенной даты? Или вы хотите ** запустить ** в заданную дату и применить все последующие дифференциальные резервные копии? Или, может быть, что-то еще - вы могли бы прояснить? – Donut

Смежные вопросы