Восстановление разностной резервной копии с помощью объекта SMO Restore - PullRequest
4 голосов
/ 25 июня 2009

Я пытаюсь восстановить базу данных, сначала восстановив полную резервную копию, а затем восстановив разностную резервную копию с помощью класса Microsoft.SqlServer.Management.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

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

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 с сообщением «Не удалось восстановить серверное имя сервера». Нужно ли явно указывать, что я восстанавливаю дифференциальную резервную копию, и если да, то как мне это сделать? Или проблема менее очевидна, чем эта? Будем весьма благодарны за любые предложения относительно того, что я делаю неправильно (или пренебрегаю).

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

fullRestore.AddDevice(...);

должно быть

fullRestore.Devices.AddDevice(...)

1 Ответ

4 голосов
/ 25 июня 2009

После еще немного раскопок я понял это. Чтобы дифференциальное резервное восстановление работало, необходимо выполнить полное восстановление, установив для NoRecovery значение true:

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

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

...