SQL Server: база данных застряла в состоянии «Восстановление» - PullRequest
532 голосов
/ 06 февраля 2009

Я создал резервную копию базы данных:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

А потом попытался восстановить его:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

И теперь база данных застряла в состоянии восстановления.

Некоторые люди предполагают, что причина в том, что в резервной копии не было файла журнала, и его нужно было перенести, используя:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Кроме того, что, конечно, терпит неудачу:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

И именно то, что вы хотите в катастрофической ситуации, - это восстановление, которое не будет работать.


Резервная копия содержит данные и файл журнала:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF

Ответы [ 23 ]

649 голосов
/ 28 июля 2009

У меня была такая ситуация при восстановлении базы данных до экземпляра SQL Server 2005 Standard Edition с использованием Symantec Backup Exec 11d. После завершения задания восстановления база данных оставалась в состоянии «Восстановление». У меня не было проблем с дисковым пространством - база данных просто не вышла из состояния «Восстановление».

Я запустил следующий запрос к экземпляру SQL Server и обнаружил, что база данных сразу стала пригодной для использования:

RESTORE DATABASE <database name> WITH RECOVERY
417 голосов
/ 06 февраля 2009

Вам необходимо использовать опцию WITH RECOVERY с командой вашей базы данных RESTORE, чтобы перевести вашу базу данных в оперативный режим как часть процесса восстановления.

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

Ваша команда должна выглядеть следующим образом,

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

У вас может быть больше успехов при использовании мастера восстановления базы данных в SQL Server Management Studio. Таким образом, вы можете выбрать конкретные местоположения файлов, параметр перезаписи и параметр WITH Recovery.

97 голосов
/ 08 мая 2009

Вот как вы это делаете:

  1. Остановить службу (MSSQLSERVER);
  2. Переименуйте или удалите файлы базы данных и журналов (C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) или везде, где у вас есть файлы;
  3. Запустить службу (MSSQLSERVER);
  4. Удалить базу данных с проблемой;
  5. Восстановить базу данных снова.
82 голосов
/ 11 января 2011

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

RESTORE DATABASE <database name> WITH RECOVERY

База данных сообщений:

RESTORE DATABASE успешно обработал 0 страниц за 18,530 секунд (0,000 МБ / с).

База данных снова использовалась после этих 18 секунд.

73 голосов
/ 05 сентября 2014

У меня была похожая проблема с восстановлением с помощью SQL Management Studio. Я попытался восстановить резервную копию базы данных на новую с другим именем. Сначала это не удалось, и после исправления имен файлов новой базы данных оно было успешно выполнено - в любом случае описываемая мной проблема повторялась, даже если я понял это правильно с первого раза. Таким образом, после восстановления исходная база данных осталась с (Восстановление ...) рядом с ее именем. Учитывая ответы на форуме выше (Bhusan's), я попытался запустить в редакторе запросов на стороне следующее:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

которая исправила проблему. Сначала у меня были проблемы из-за имени базы данных, которое содержало специальные символы. Я решил эту проблему, добавив двойные кавычки - одинарные кавычки не работали бы с ошибкой «Неверный синтаксис рядом ...».

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

34 голосов
/ 26 июня 2009

ОК, у меня похожая проблема, и точно так же, как и в случае с Pauk, она была вызвана тем, что серверу не хватило места на диске во время восстановления, и поэтому вызвала состояние постоянного восстановления. Как завершить это состояние без остановки служб SQL Server?

Я нашел решение:)

Drop database *dbname*
29 голосов
/ 17 января 2014

С параметром RECOVERY используется по умолчанию при выполнении команд RESTORE DATABASE / RESTORE LOG. Если вы застряли в процессе «восстановления», вы можете вернуть базу данных в оперативное состояние, выполнив:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Если требуется восстановление нескольких файлов, для команд CLI требуются WITH NORECOVERY и WITH RECOVERY соответственно - только последний файл в команде должен иметь WITH RECOVERY для возврата базы данных в оперативный режим:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

Вы также можете использовать мастер SQL Server Management Studio:

enter image description here

Существует также процесс виртуального восстановления, но вам придется использовать сторонние решения. Обычно вы можете использовать резервную копию базы данных в качестве онлайн-базы данных. ApexSQL и Idera имеют свои собственные решения. Обзор SQL Hammer о ApexSQL Restore . Виртуальное восстановление является хорошим решением, если вы имеете дело с большим количеством резервных копий. Процесс восстановления намного быстрее, а также может сэкономить много места на диске. Вы можете посмотреть инфографику здесь для сравнения.

23 голосов
/ 16 июля 2014

Это может быть довольно очевидно, но это сбило меня с толку только сейчас:

Если вы делаете резервную копию хвостового журнала, эта проблема также может быть вызвана проверкой этой опции в мастере восстановления SSMS - «Оставить исходную базу данных в состоянии восстановления (WITH NORECOVERY)»

enter image description here

15 голосов
/ 11 февраля 2009

Я понял, почему.

Если клиент, который выполнил команду RESTORE DATABASE, отключается во время восстановления, восстановление застрянет.

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

10 голосов
/ 03 октября 2012

этот работал:

http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

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

Что я сделал, чтобы выйти из этой ситуации:

  1. Остановите все службы, связанные с SQL, из служб Windows.

  2. Я открыл папку DATA, в которой файлы Ldf и Mdf находятся в каталоге SQL, обычно это так: "C: \ Program Files *********** \ MSSQL \ DATA

  3. Затем я скопировал файлы базы данных Ldf и Mdf: [имя базы данных] .mdf и [имя базы данных] _log.ldf

Я скопировал оба этих файла в другую папку.

  1. Затем я снова запустил все связанные с SQL службы (на шаге 1) из служб Windows.

  2. Запустил мою студию MS SQL Management с обычным логином.

  3. Щелкните правой кнопкой мыши базу данных преступников и нажмите УДАЛИТЬ (чтобы удалить базу данных вообще).

  4. Все файлы LDF и MDF, относящиеся к этой базе данных, были взяты из папки DATA (упомянутой в шаге 2).

  5. Создана новая база данных с тем же именем (то же имя, которое я удалил на шаге 6 - база данных виновников).

  6. Затем [имя базы данных] -> щелчок правой кнопкой мыши -> задачи -> Отключить.

  7. Затем я скопировал оба файла (из шага 3) обратно в папку DATA (шаг 2).

  8. [имя базы данных] -> щелчок правой кнопкой мыши -> задачи -> Подключить к сети.

...