SQL Server: база данных застряла в состоянии восстановления

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

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

person Ian Boyd    schedule 06.02.2009    source источник
comment
У меня была такая же проблема, и все решения не удались. Интересно, что я напрямую вошел на SQL-сервер и выполнил команду DROP DATABASE db через SSMS, и она сработала (раньше я использовал SSMS с другого компьютера для выполнения команд). Я предполагаю, что другие решения также сработали бы.   -  person Salman A    schedule 27.04.2017


Ответы (27)


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

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

Ваша команда должна выглядеть так:

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

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

person John Sansom    schedule 06.02.2009
comment
Мне никогда не приходилось использовать заявление о восстановлении, когда я делал то, что делает он. WITH REPLACE должно хватить. - person Sam; 06.02.2009
comment
Да, я использовал NORECOVERY, но процесс восстановления зависает. Использование WITH RECOVERY, REPLACE больше не вешает процесс - person Junior Mayhé; 16.09.2009
comment
Это решило мою проблему. У нас произошел сбой SAN в середине восстановления, и это было быстрое и чистое решение. - person Registered User; 21.09.2009
comment
Сегодня у меня была аналогичная проблема с базой данных SQL Server 2005. В моем случае мне пришлось добавить ', RESTART' в предложение WITH, чтобы решить проблему. Он выдавал мне сообщение об ошибке, в котором говорилось, что предыдущая операция не удалась. - person XpiritO; 05.09.2011
comment
Я распространяю обновления нашей базы данных в виде резервных копий, которые заменяют старые, но пользователи могут установить их в любое место на своем жестком диске (не моя идея), а это значит, что мне нужно выполнить Exec SP_HelpFile из старой базы данных перед запуском Restore With Переместить, чего я не могу сделать, если он уже застрял при восстановлении. Есть ли способ использовать базу данных Master для получения имен файлов? Сейчас мое единственное решение - удалить и переустановить. - person Patrick; 21.09.2011
comment
У меня такая же проблема с запуском этой команды с драйвером PHP PDO от Microsoft. однако при работе с Microsoft SQL Server Management Studio он работает нормально. Есть идеи по поводу проблемы? - person channa ly; 29.01.2012
comment
WITH REPLACE, RECOVERY, RESTART и все та же ошибка (базу данных невозможно восстановить, поскольку журнал не был восстановлен.). Думаю, я отбрасываю БД ... [позже], которая, конечно, работала, но мне также пришлось удалить оставшийся файл журнала контрольной точки. - person ErikE; 30.07.2012
comment
@JohnSansom Конечно, использование опции восстановления в SQL Management Studio является наиболее гарантированным способом восстановления базы данных, но иногда люди распространяют экспресс-выпуски SQL Server без студии управления (например, наша компания), и им необходимо предоставить наши собственные инструменты для выполнить эти операции. - person Jerry Dodge; 22.12.2012
comment
@JohnSansom мне нужно сначала убить spid зависшего восстановления? - person FistOfFury; 26.06.2013
comment
@FistOfFury Если предыдущая операция восстановления той же базы данных находилась в приостановленном / спящем состоянии, тогда да. Простая остановка / отмена процесса восстановления должна иметь такой же эффект. - person John Sansom; 29.06.2013
comment
Использование SQL Management Studio смягчает многие подобные проблемы, за исключением того, что инструмент не принимает / не управляет путями UNC, поэтому восстановление базы данных по сети в конечном итоге потребует использования команды SQL и подобных решений. - person John K; 23.07.2014
comment
В моем случае, кроме того, мне нужно удалить базу данных (и потерять все данные из нее) и снова восстановить - person dellasavia; 23.11.2015
comment
Ссылка, показанная в ответе, перемещена сюда exploresql.com/2016/09/06/ - person Madhivanan; 16.10.2018

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

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

RESTORE DATABASE <database name> WITH RECOVERY
person Evan Anderson    schedule 28.07.2009
comment
У нас БД застряла при восстановлении на 2 часа. Мы запустили эту команду с другой машины против мастера, и она исправила нас. Спасибо! - person Pete; 14.06.2011
comment
+1, с ошибкой. Когда я запустил это, я получил сообщение об ошибке, в котором говорилось, что база данных уже полностью восстановлена. Но он все еще был в состоянии восстановления. Итак, я щелкнул его правой кнопкой мыши в Management Studio, нажал «Обновить», и все вернулось к норме. - person dario_ramos; 03.09.2012
comment
Я восстановил с помощью мастера Mng Studio, ввел новое имя базы данных, но по ошибке оставил имена файлов такими же, как в существующей базе данных. Я получил ошибку восстановления не удалось, но хвост журнала прошел успешно, и база данных, прикрепленная к этим файлам, застряла в состоянии восстановления. Похоже, эта команда восстановила базу данных до ее предыдущего состояния. - person Chris; 24.04.2014
comment
Это сработало. Я пытался восстановить резервную копию в сторонней базе данных, но моя основная база данных по какой-то причине перешла в состояние восстановления. Это фактически восстановило мою БД. Огромное спасибо! - person Aravindh; 10.06.2014
comment
Ты спас мне день. Багги MSSQL. Даже перезагрузка не помогла - person Sergey Berezovskiy; 14.11.2014
comment
Для меня он просто продолжает работать. - person Panzercrisis; 12.06.2015
comment
Некоторые настройки мастера восстановления SSMS по умолчанию оставляют исходную БД в состоянии восстановления, так что вы можете продолжить восстановление различных резервных копий или журналов, не опасаясь пользователей, и эта команда является правильным способом вернуть БД в нормальное состояние после того, как вы закончите. - person Tim Lehner; 08.08.2015
comment
Подтверждено, что работает на SQL 2008 std, работающем на сервере 2012. Спасибо. - person Patrick; 30.09.2015
comment
@Panzercrisis мой оставался как «Выполняется ...» даже после того, как я несколько раз обновил экран. В конце концов я попытался отключить его, и это сработало нормально, и вернуть его в рабочий режим сработало. Я подозреваю, что все, что мне нужно было сделать, это закрыть и открыть SQL Studio, чтобы принудительно выполнить обновление. - person Patrick; 30.09.2015
comment
Этот ответ буквально сэкономил мне часы. Спасибо - person E Shindler; 25.05.2016
comment
Это должен быть ответ! Спасибо! - person Eric; 22.07.2016
comment
Идеально! Спасибо. Я запомню этот трюк на долгие годы. - person ProfK; 25.08.2016
comment
Очень помог, приготовил мне угощение. - person Gruffputs; 24.01.2017
comment
OP четко заявляет, что опция WITH RECOVERY не удалась. - person Salman A; 27.04.2017
comment
У меня сработало выполнение этого запроса ... я думаю. Я выполнил запрос в SQL Server Management Studio (SSMS). Результат запроса показал успех. Однако база данных по-прежнему отображала статус «Восстановление ...». Я закрыл и перезапустил SSMS; тогда база данных снова была в порядке. - person Mike Finch; 20.09.2017
comment
У меня сработало, но сначала мне пришлось перезапустить SQL-сервер. - person Michal B.; 17.10.2017
comment
Спасибо - это очень помогло мне на важном производственном сервере. - person Manachi; 23.03.2018
comment
Эта команда исправила это для меня. Моя база данных застряла при восстановлении, потому что я восстановил ее под другим именем, чтобы сделать копию, и SQL пометил оригинал как восстанавливаемый. - person Paul McCarthy; 20.06.2019
comment
Идеально..!!! столкнулся с проблемами при восстановлении и решил с помощью приведенного выше утверждения. Спасибо!! - person Haseeb; 30.05.2020
comment
У меня это работает, но может ли кто-нибудь объяснить, что делает этот запрос? - person Wibisono Indrawan; 29.09.2020

Вот как это сделать:

  1. Остановить службу (MSSQLSERVER);
  2. Переименуйте или удалите файлы базы данных и журнала (C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) или там, где у вас есть файлы;
  3. Запустить службу (MSSQLSERVER);
  4. Удалить проблемную базу данных;
  5. Снова восстановите базу данных.
person Tipu Delacablu    schedule 07.05.2009
comment
Типу, спасибо за это. У меня была проблема, аналогичная исходному плакату, но она была вызвана тем, что на сервере не хватало места на диске во время восстановления, что привело к постоянному состоянию восстановления. - person Pauk; 22.05.2009
comment
Почему бы просто не удалить базу данных? Таким образом, вам не нужно останавливать службу. - person ErikE; 30.07.2012
comment
@ErikE Для меня SQL-сервер сказал, что он не может удалить базу данных в середине восстановления, даже если на самом деле это не восстановление .... - person Erik Philips; 15.04.2013
comment
@ErikPhilips В этом случае, я полагаю, кто-то вернулся к остановке службы. Интересно, происходит ли это каждый раз или только в определенных случаях проблемы с зависанием восстановления. - person ErikE; 15.04.2013
comment
В моем случае во время восстановления закончилось место на жестком диске. После удаления более чем достаточного количества файлов я остановил и перезапустил свою службу SQL, но восстановление БД зависло и так и не было завершено. (3 дня на восстановление 2гб, просто хотел убедиться). Это было единственное решение, которое, казалось, сработало в моем случае. - person Erik Philips; 15.04.2013
comment
В моем случае было достаточно удалить базу данных, которая зависала в состоянии Восстановление ... с помощью команды SQL drop database <dbname> в окне запроса. Затем я щелкнул правой кнопкой мыши Базы данных и выбрал Обновить, что удалило запись в Management Studio. Впоследствии я выполнил новое восстановление, которое работало нормально (обратите внимание, что перевод в автономный режим не работал, перезапуск службы SQL не работал, перезагрузка сервера также не работала). - person Matt; 23.06.2016
comment
Это было решение, которое исправило мои проблемы! Мне удалось попасть в это состояние, восстановив старую версию моей базы данных с другим именем базы данных (чтобы я мог поработать над сценариями обновления); восстановление в новую базу данных сработало, но каким-то образом имело побочный эффект - исходная база данных застряла в состоянии восстановления. - person Chris Bargh; 10.02.2017
comment
Я использовал небольшую вариацию этой процедуры: 1) копирование файлов MDF / LDF из папки данных во временную папку, 2) удаление базы данных через Management Studio NB: это приводит к удалению файлов MDF / LDF из папки данных < / i>, 3) скопируйте файлы MDF / LDF обратно из temp в папку Data, 4) в Mgmt Studio щелкните правой кнопкой мыши Базы данных и прикрепите файлы MDF / LDF, таким образом восстановив базу данных. - person Chris Bargh; 10.02.2017
comment
Я поддерживаю этот ответ. У меня работает SQL 2014. - person Andez; 08.09.2017
comment
Комментарий @Matt помог, сделал удаление базы данных в окне запроса. Пришлось выйти и снова войти в систему, чтобы удалить базу данных из списка баз данных в SSMSE. - person Jimson Kannanthara James; 18.07.2018
comment
@JimsonKannantharaJames - похоже, это помогло и другим людям, поэтому я повысил его до ответа. - person Matt; 18.07.2018
comment
Для меня восстановить базу данных не пришлось. Повторное подключение МДФ помогло мне. - person d.i.joe; 16.10.2019

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

RESTORE DATABASE <database name> WITH RECOVERY

Сообщения базы данных:

ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ успешно обработало 0 страниц за 18,530 секунд (0,000 МБ / с).

Через 18 секунд базу данных можно было снова использовать.

person Hans    schedule 11.01.2011
comment
Особенно полезно, если вы уже восстановили базу данных, но забыли опцию ВОССТАНОВЛЕНИЕ ... - person JBickford; 18.03.2011
comment
Это все, что мне нужно, чтобы заставить его выйти из состояния восстановления после восстановления резервной копии этой базы данных с другим именем БД. Огромное спасибо. - person Sean; 26.05.2015

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

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

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

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

person Demetris Leptos    schedule 05.09.2014
comment
Работает отлично - без необходимости разбирать и снова поднимать. 3 ДБ по 80+ Гб каждый требует времени! Спасибо! - person Christer; 24.01.2017
comment
Я почти сделал это в производственной среде. Сначала я попробовал на местном, попал в такую ​​же ситуацию и нашел ваш комментарий. Извлеченный урок: используйте сценарии и не доверяйте SSMS в важных ситуациях. - person Mariusz; 25.07.2017
comment
У меня возникла эта проблема при восстановлении резервной копии файла базы данных только для копирования в новую базу данных. Исходная база данных показала ошибку. Это решение сработало, и я получил ответ: RESTORE DATABASE успешно обработал 0 страниц за 0,263 секунды (0,000 МБ / с)., поэтому кажется, что SQL Server просто сбит с толку относительно состояния базы данных. - person R. Schreurs; 06.10.2017
comment
Сработало для меня, но только когда я удалил двойные кавычки - у меня был только [MY_DB_NAME] в качестве параметра. - person StackOverflowUser; 23.04.2018

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

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

Drop database *dbname*
person Community    schedule 26.06.2009

Параметр С ВОССТАНОВЛЕНИЕМ используется по умолчанию при выполнении команд 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:

введите описание изображения здесь

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

person Marko Krstic    schedule 17.01.2014

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

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

введите описание изображения здесь

person TrailJon    schedule 16.07.2014
comment
Если вы находитесь в этом состоянии, то лучше всего: 1. Щелкните базу данных правой кнопкой мыши, выберите Задачи- ›Восстановление-› Журналы транзакций 2. Найдите файл резервной копии, который использовался для резервного копирования хвостового журнала 3. Восстановить резервная копия Восстановление должно завершиться успешно и вернуть базу данных в оперативный режим. - person Ryan Gross; 16.02.2015

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

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

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

person Ian Boyd    schedule 11.02.2009
comment
Все команды SQL требуют, чтобы клиент оставался подключенным все время. - person mrdenny; 28.08.2009
comment
@mrdenny: я бы предположил, что изменения отменяются, когда клиент отключается. - person Ian Boyd; 28.08.2009
comment
У меня такая же проблема с запуском этой команды с драйвером PHP PDO от Microsoft. однако при работе с Microsoft SQL Server Management Studio он работает нормально. Интересно, как сделать так, чтобы мое приложение php было постоянно подключенным? - person channa ly; 29.01.2012
comment
Также здесь случалось, что БД зависала в режиме восстановления / однопользовательского режима после возможного разрыва соединения. Убил все остальные SPID из нового сеанса, но все еще завис. Удалось удалить базу данных как решение. - person crokusek; 03.08.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 базы данных: [db name] .mdf и [db name] _log.ldf

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

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

  2. Запустил мою студию управления MS SQL с обычным входом в систему.

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

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

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

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

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

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

person Ameen Abuhilal    schedule 03.10.2012
comment
У меня это тоже сработало. На шаге 10 я решил перезаписать существующие файлы. - person Divi G; 05.03.2019

У меня был . в моем имени базы данных, и запрос не работал из-за этого (неверный синтаксис рядом с '.'). Затем я понял, что мне нужна скобка для имени:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY
person Ashkan Sirous    schedule 28.07.2016

Щелкните правой кнопкой мыши базу данных и выберите Задачи - ›Восстановление -› Журналы транзакций. Если в файлах транзакций вы видите, что файл отмечен, значит, сервер SQL пытается восстановить из этого файла. Снимите флажок с файла и нажмите ОК. База данных вернулась .....

это решило проблему для меня, надеюсь, это кому-то поможет.

person Maverick HT    schedule 31.07.2020

В моем случае было достаточно удалить базу данных, которая зависала в состоянии «Восстановление ...» с помощью команды SQL.

 drop database <dbname> 

в окне запроса.

Затем я щелкнул правой кнопкой мыши Базы данных и выбрал Обновить, в результате чего запись в Management Studio была удалена. Впоследствии я сделал новое восстановление, которое работало нормально (обратите внимание, что перевод в автономный режим не работал, перезапуск службы SQL не работал, перезагрузка сервера также не работала).

person Matt    schedule 18.07.2018

У меня была эта проблема, когда я также получил ошибку TCP в журнале событий ...

Отбросьте БД с помощью sql или щелкните ее правой кнопкой мыши в диспетчере «удалить» и снова восстановите.

Я действительно начал делать это по умолчанию. Создайте сценарий для удаления БД, воссоздайте и затем восстановите.

person ZeusT    schedule 13.03.2010

По умолчанию для каждого RESTORE DATABASE установлено RECOVERY. Параметры "NORECOVERY" в основном сообщают SQL Server, что база данных ожидает дополнительных файлов восстановления (это может быть файл DIFF и файл LOG, а также может включать хвостовой журнал файл резервной копии, если возможно). Опции «ВОССТАНОВЛЕНИЕ» завершают все транзакции и позволяют базе данных быть готовой к выполнению транзакций.

So:

  1. если ваша база данных настроена с использованием модели восстановления ПРОСТОЙ, вы можете выполнить восстановление ПОЛНОЕ с параметром NORECOVERY только при наличии резервной копии DIFF. Резервное копирование LOG запрещено в базе данных модели восстановления SIMPLE.
  2. В противном случае, если ваша база данных настроена с использованием модели восстановления ПОЛНОЕ или С БОЛЬШИМ РЕГИСТРАТОРОМ, вы можете выполнить восстановление ПОЛНОЕ с последующим NORECOVERYпараметром, а затем выполнить DIFF, за которым следует NORECOVERY, и, наконец, выполните восстановление LOG с параметром RECOVERY.

Помните, ПОСЛЕДНИЙ ЗАПРОС ВОССТАНОВЛЕНИЯ ДОЛЖЕН ИМЕТЬ RECOVERY ВАРИАНТ. Это мог быть явный способ или нет. В терминологии T-SQL ситуация:

1.

 USE [master]
    GO
    RESTORE DATABASE Database_name 
    FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, 
    RECOVERY -- This option could be omitted.
    GO

Параметр С ЗАМЕНИТЬЮ следует использовать с осторожностью, так как это может привести к потере данных.

Или, если вы выполняете ПОЛНОЕ и DIFF резервное копирование, вы можете использовать это

   USE [master]
    GO
    RESTORE DATABASE Database_name
      FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
       NOUNLOAD,NORECOVERY
    GO
    RESTORE DATABASE Database_name
      FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
     NOUNLOAD, RECOVERY
    GO

 2. USE [master]
    GO
   -- Perform a Tail-Log backup, if possible. 
   BACKUP LOG Database_name
   GO
   -- Restoring a FULL backup
   RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
     NOUNLOAD,NORECOVERY
  GO 
  -- Restore the last DIFF backup
  RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1,
     NORECOVERY,NOUNLOAD
  GO
  -- Restore a Log backup
  RESTORE LOG Database_name
    FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2,
    RECOVERY, NOUNLOAD
  GO

Конечно, вы можете выполнить восстановление с параметром STATS = 10, который указывает SQL Server сообщать каждые 10% выполненных операций.

При желании вы можете наблюдать за процессом или восстанавливать данные в режиме реального времени. Следующим образом:

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

Надеюсь на эту помощь.

person BMDaemon    schedule 11.04.2017

Используйте следующую команду, чтобы решить эту проблему

RESTORE DATABASE [DatabaseName] WITH RECOVERY
person Sumant Singh    schedule 19.05.2020

Также может возникнуть проблема с удалением зависшей базы данных, если включен моментальный снимок. Для меня это сработало:

  1. Сначала я выполнил шаги Tipu Delacablu (прочтите несколько посты вверх)
  2. выполните команду: drop database [ваша база данных], которая выдаст вам ошибку, сообщающую вам имя базы данных моментальных снимков.
  3. выполните команду: drop database [snapshot database], а затем снова выполните команду на шаге 2.
person Community    schedule 28.08.2009

Вы пробовали запускать ТОЛЬКО ПРОВЕРКУ? Просто чтобы убедиться, что это звуковая резервная копия.

http://msdn.microsoft.com/en-us/library/ms188902.aspx

person Sam    schedule 06.02.2009

У меня есть случай MyDbName (Восстановление ...) из-за лицензионного лимита SQL Express.

В файле журнала я обнаружил следующее:

CREATE DATABASE или ALTER DATABASE не удалось, потому что итоговый совокупный размер базы данных превысит ваш лицензионный лимит в 10240 МБ для каждой базы данных.

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

person Dmitry Pavlov    schedule 02.09.2016
comment
Это была база данных TFS, и клиент TFS уже сказал мне: «База данных заполнена». - person cskwg; 21.11.2019

Возникла аналогичная проблема при восстановлении базы данных с помощью студии управления SQL-сервером, и она застряла в режиме восстановления. После нескольких часов отслеживания проблем у меня сработал следующий запрос. Следующий запрос восстанавливает базу данных из существующей резервной копии в предыдущее состояние. Я считаю, что загвоздка в том, чтобы файлы .mdf и .log располагались в одном каталоге.

RESTORE DATABASE aqua_lc_availability
FROM DISK = 'path to .bak file'
WITH RECOVERY
person Ujjwal    schedule 17.12.2019

  1. Давайте сначала проверим и запустим службу агента SQL.
  2. Используя следующий T-SQL:

    ВЫБЕРИТЕ имя файла ИЗ master.sys.sysaltfiles ГДЕ dbid = DB_ID ('db_name');

  3. Постоянное использование T-SQL:

    ВОССТАНОВИТЬ БАЗУ ДАННЫХ С ДИСКА = 'DB_path' С ПЕРЕЗАПУСКОМ, ЗАМЕНИТЬ;

Надеюсь на эту помощь!

person Trung Nguyen    schedule 14.05.2013

Все опции, основанные на С ВОССТАНОВЛЕНИЕМ, у меня не работали.

Что было сделано, так это полное восстановление из Management Studio.

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5
person earthling42    schedule 26.03.2015

У меня была такая же проблема ... хотя я не знаю, почему моя база данных столкнулась с этой проблемой, поскольку мой диск не был заполнен ... Как будто он был поврежден или что-то в этом роде. Я пробовал все вышеперечисленное, ни один из них не работал полностью, я особенно думал, что предложение остановить службу и удалить файлы mdf и ldf будет работать ... но он все еще завис при восстановлении?

В итоге я решил эту проблему, удалив файлы, как упоминалось выше, но вместо того, чтобы снова пытаться восстановить БД, я скопировал новые файлы .mdf и .ldf и прикрепил их с помощью мастера Front End Attachment. Облегчение, это сработало !!

Копирование новых файлов потребовалось НАВСЕГДА, так как я использую виртуальную машину ... поэтому копирование и вставка с использованием буфера обмена заняли около часа, поэтому я бы рекомендовал это только как последнюю попытку.

person Anthony Griggs    schedule 18.09.2015

Что исправило для меня, так это

  1. остановка экземпляра
  2. создание резервной копии файлов .mdf и .ldf в папке данных
  3. Перезапустите экземпляр
  4. удалить зависшую базу данных восстановление
  5. поместите файлы .mdf и .ldf обратно в папку данных
  6. Прикрепите экземпляр к файлам .mdf и .ldf.
person ChadJPetersen    schedule 31.10.2018

Если вы хотите восстановить базу данных SQL Server из файла резервной копии, вы можете использовать следующий сценарий:

RESTORE DATABASE [MyDatabase] -- which database to restore
FROM DISK = N'X:\MyDatabase.bak' -- location of the database backup
WITH 
    FILE = 1, -- restore from a backup file
    -- declare where the file groups should be located (can be more than two)
    MOVE N'MyDatabase_Data' TO N'D:\SSDPATH\MyDatabase.mdf',
    MOVE N'MyDatabase_Log' TO N'E:\HDDPATH\MyDatabase.ldf',
    -- Tape option; only relevant if you backup from magnetic tape
    NOUNLOAD,
    -- brings the database online after the database got restored
    -- use this option when you don't want to restore incremental backups
    -- use NORECOVERY when you want to restore differential and incremental backup files
    RECOVERY,
    -- replace existing database with the backup 
    -- deletes the existing database
    REPLACE, 
    -- print log message for every 1 percent of restore
    STATS = 1;
person MovGP0    schedule 19.11.2020

Это старая проблема, которая постоянно возникает в SQL Server, даже в последней версии 2019 года! Я не знаю, почему Microsoft оставила эту боль так надолго и позволила своему движку MSSQL продолжать вести себя таким образом. Тем не менее, я предлагаю другое возможное решение для тех, кто попробовал ВОССТАНОВИТЬ БАЗУ ДАННЫХ С ВОССТАНОВЛЕНИЕМ, но он все еще не работал.

Войдите на сам сервер и запустите программу SSMS по умолчанию на реальном сервере базы данных. Затем перейдите в базу данных восстановления и УДАЛИТЬ ее. Выполнено. Проблема ушла. Если вам нужно было сохранить его, скопируйте файл MDF, переименуйте его и прикрепите как новую базу данных. У меня работал на SQL Server 2008 R2.

person Fandango68    schedule 10.12.2020

person    schedule
comment
Пожалуйста, укажите на дополнительную информацию, которую дает этот ответ по сравнению с более старым, принятым и получившим большое количество голосов. Это поможет избежать впечатления, будто вы просто скопировали его в надежде заработать репутацию. Кроме того, здесь не ценятся ответы только на код (что является основным видимым различием), потому что они создают неправильное впечатление, что StackOverflow - это бесплатный сервис для написания кода, - person Yunnosch; 09.05.2019
comment
Я исправил форматирование, чтобы сделать более очевидным сходство со старым ответом. Но вы можете научиться делать это здесь, stackoverflow.com/editing-help, если в будущем попытаетесь давать более легко читаемые ответы. . - person Yunnosch; 09.05.2019