C # Восстановление базы данных застрял в «Восстановление ...» - PullRequest
0 голосов
/ 19 сентября 2011

Я вставляю раздел резервного копирования и восстановления базы данных SQL в мою программу.Я использовал MSDN Примеры (попробовал другой, и это не будет работать).Страница MSDN - http://msdn.microsoft.com/en-us/library/ms162133.aspx

У меня работает резервный файл, и я проверил его в Management Studio.

Но у меня возникли проблемы с восстановлением файла.

Кажется, что код работает, но база данных в SQL Server застряла в "Восстановление ..."

            if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Server sqlServer = new Server();

                Restore sqlRestore = new Restore();
                sqlRestore.NoRecovery = true;
                sqlRestore.Action = RestoreActionType.Database;

                BackupDeviceItem deviceItem = new BackupDeviceItem(openFile.FileName, DeviceType.File);
                sqlRestore.Devices.Add(deviceItem);
                sqlRestore.Database = "firstRecoverTest";

                sqlRestore.SqlRestore(sqlServer);

                //Add the recovered database into the Entity Table
                SqlCommand intoEntity = new SqlCommand("IF NOT EXISTS(SELECT entityName FROM Entitys WHERE entityName = 'firstRecoveryTest') INSERT INTO Entitys VALUES ('firstRecoveryTest');", sqlConnection);                   
                sqlConnection.Open();
                intoEntity.ExecuteNonQuery();

                Database db = default(Database);
                db = sqlServer.Databases["firstRecoverTest"];
                db.RecoveryModel = (RecoveryModel)1;
                db.AutoClose = true;
                //db.Alter();

            }

В примере есть db.Alter ();функция, но при этом выдается сообщение об ошибке «Произошел сбой при изменении базы данных« firstRecoverTest »».

Пожалуйста, дайте мне знать ваши мысли

Заранее спасибо

ОБНОВЛЕНИЕ

После вставки «ReplaceDatabase = true;»не было никаких изменений в конечном результате.Кроме того, пошаговое выполнение кода показывает, что оно проходит через него.

"db.Alter ();"это просто то, что помещается в конец кода (показывается как комментарий).Он используется при создании резервной копии и работает без ошибок.InnerError показывает эту информацию при использовании db.Alter ();

"ALTER DATABASE не разрешен, когда база данных находится в состоянии восстановления"

Интересная часть - это файлы журнала SQL.Я получаю 3 журнала:

«Запуск базы данных« firstRecoverTest ».»

«База данных« firstRecoverTest »помечена как« RESTORING »и находится в состоянии, которое не позволяет выполнить восстановление.«

» База данных была восстановлена: База данных: firstRecoverTest, дата (время создания): 2011/09/20 (15:44:48), первый LSN: 37: 159: 37, последний LSN: 37: 175: 1, количество устройств дампа: 1, информация об устройстве: (FILE = 1, TYPE = DISK: {'C: \ Users \ Administrator \ Desktop \ installer_backup'}). Информационное сообщение. Действия пользователя не требуются. "

Однако, когда я делаю обычное восстановление с помощью SQL Management Studio, появляется еще 2 записи в журнале, в которых говорится

«Запуск базы данных« [имя_базы_данных] ».»

«Восстановление завершено прибаза данных '[databaseName]'. База данных теперь доступна "

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

1 Ответ

4 голосов
/ 19 сентября 2011

Вы должны попытаться удалить базу данных или использовать sqlRestore.ReplaceDatabase = true;.

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.replacedatabase.aspx

Если похоже, что ничего не происходит, вы можете запустить процесс в отдельном потоке и подключитьсясобытия для уведомления об изменениях прогресса, используя их.

sqlRestore.Complete += new ServerMessageEventHandler(completionEvent);
sqlRestore.PercentCompleteNotification = 10; // Call progress event every x percent change.
sqlRestore.PercentComplete += new PercentCompleteEventHandler(progressEvent);

Если это не сработает, пожалуйста, опубликуйте код Alter, который не работал.Также проверьте журналы и разрешения сервера SQL.

ОБНОВЛЕНО

Хорошо, это обновление имеет больше смысла.Причина в том, что вы устанавливаете sqlRestore.NoRecovery = true;.Это приводит к тому, что после завершения восстановления БД сохраняется в состоянии восстановления, поэтому вы можете восстановить дополнительную дифференциальную резервную копию в дополнение к только что восстановленной полной.

Пока она находится в этом состоянии, вы не будетебыть в состоянии сделать что-нибудь еще с базой данных.Я бы посоветовал вам, если вы этого не потребуете, оставить значение по умолчанию NoRecovery = false.

См. http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.norecovery.aspx

Надеюсь, что это поможет.

...