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. По този начин можете да изберете конкретни местоположения на файлове, опцията за презаписване и опцията С възстановяване.

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
Разпространявам актуализации на нашата база данни под формата на резервни копия, които заместват старите, но потребителите могат да я инсталират на произволно място на твърдия си диск (не е моя идея), което означава, че трябва да изпълня SP_HelpFile от стара база данни, преди да стартирам Възстановяване с Преместване, което не мога да направя, ако вече е блокирано при възстановяване. Има ли някакъв начин да се използва основната база данни, за да се получат нейните имена на файлове? В момента единственото ми решение е да изтрия и преинсталирам. - person Patrick; 21.09.2011
comment
Имам същия проблем, изпълнявайки тази команда с PHP PDO драйвер от Microsoft. но когато работите със студио за управление на сървър на Microsoft sql, работи добре. Някакви идеи за проблема? - person channa ly; 29.01.2012
comment
WITH REPLACE, RECOVERY, RESTART и същата грешка (Базата данни не може да бъде възстановена, защото регистрационният файл не е възстановен.). Предполагам, че изпуснах DB... [по-късно], което проработи, разбира се, но също така трябваше да изтрия регистрационния файл на контролната точка, който беше останал. - 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
Имахме DB, заседнал при възстановяване за 2 часа. Пуснахме тази команда от друга машина срещу master и тя веднага ни поправи. Благодаря! - person Pete; 14.06.2011
comment
+1, с нещо. Когато стартирах това, получих съобщение за грешка, че базата данни вече е напълно възстановена. Но все още показваше, че е в състояние на възстановяване. Така че щракнах с десния бутон върху него в Management Studio, натиснах Refresh и всичко се върна към нормалното. - person dario_ramos; 03.09.2012
comment
Възстанових с помощта на съветника Mng Studio, въведох ново име на база данни, но по погрешка оставих имената на файловете същите като на съществуваща база данни. Получих грешка при възстановяване неуспешно, но опашката на регистрационния файл е успешна и базата данни, прикачена към тези файлове, е заседнала в състояние на възстановяване. Тази команда изглежда е възстановила базата данни до нейното предишно състояние. - person Chris; 24.04.2014
comment
Това проработи. Опитвах се да възстановя резервно копие в странична база данни, но основната ми база данни премина в състояние на възстановяване по някаква причина. Това всъщност възстанови моята DB. Благодаря много! - 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, работещ на Server 2012. Благодаря ви. - person Patrick; 30.09.2015
comment
@Panzercrisis моята остана като „Running...“ дори след като опресних екрана няколко пъти. В крайна сметка се опитах да го направя офлайн, което сработи добре и връщането му отново на линия проработи. Подозирам, че всичко, което трябваше да направя, беше да затворя и отворя 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
В моя случай изчерпах HD пространството по време на възстановяване. След като изтрих повече от достатъчно файлове, спрях и рестартирах моята SQL услуга, но DB беше заседнал при възстановяване и никога не завърши. (3 дни за възстановяване на 2gb, просто исках да се уверя). Това беше единственото решение, което изглежда работеше в моя случай. - 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 помогна, изпусна базата данни в прозореца на заявката. Трябваше да излезете и да влезете отново, за да премахнете db от списъка с db в SSMSE. - person Jimson Kannanthara James; 18.07.2018
comment
@JimsonKannantharaJames - изглежда, че помогна и на други хора, затова повиших го до отговор.. - person Matt; 18.07.2018
comment
За мен не се наложи да възстановявам базата данни. Повторното закрепване на mdf свърши работа за мен. - person d.i.joe; 16.10.2019

Имах подобен инцидент със спиране на вторичен сървър за доставка на журнали. След командата за премахване на сървъра от доставката на регистрационни файлове и спирането на доставката на регистрационни файлове от основния сървър, базата данни на вторичния сървър се заби в състояние на възстановяване след командата

RESTORE DATABASE <database name> WITH RECOVERY

Съобщенията на базата данни:

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

Базата данни беше използваема отново след тези 18 секунди.

person Hans    schedule 11.01.2011
comment
Особено полезно, когато вече сте възстановили базата данни, но сте забравили опцията RECOVERY... - person JBickford; 18.03.2011
comment
Това беше всичко, от което се нуждаех, за да го накарам да напусне състоянието на Възстановяване след възстановяване на резервно копие на тази база данни на различно име на DB. Благодаря много. - person Sean; 26.05.2015

Имах подобен проблем с възстановяването с помощта на SQL Management Studio. Опитах се да възстановя резервно копие на базата данни в нова с различно име. Първоначално това се провали и след коригирането на имената на файловете на новата база данни беше успешно извършено - във всеки случай проблемът, който описвам, се появи отново, дори ако разбрах това правилно от първия път. Така че след възстановяването оригиналната база данни остава с (Възстановява се...) до името си. Имайки предвид отговорите във форума по-горе (на Bhusan), опитах да стартирам в редактора на заявки отстрани следното:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

което коригира проблема. Отначало имах проблеми поради името на базата данни, което съдържаше специални знаци. Разреших това, като добавих двойни кавички наоколо - единичните кавички няма да работят, давайки грешка „Неправилен синтаксис близо до ...“.

Това беше минималното решение, което се опитах да разреша този проблем (заседнала база данни в състояние на възстановяване) и се надявам, че може да се приложи към повече случаи.

person Demetris Leptos    schedule 05.09.2014
comment
Работи перфектно - без да се налага да го разглобявате и да го повдигате отново. 3 Dbs от 80+ Gb всеки отнема известно време! Благодаря! - person Christer; 24.01.2017
comment
Почти го направих в производствена среда. Първо го пробвах локално, попаднах в същата ситуация и намерих вашия коментар. Научен урок: Използвайте скриптове и не се доверявайте на SSMS във важни ситуации. - person Mariusz; 25.07.2017
comment
Получих този проблем, когато възстановявах резервно копие на файл само за копиране на база данни в нова база данни. Оригиналната база данни показа грешката. Това решение проработи и отговорът, който получих, беше ВЪЗСТАНОВЯВАНЕТО НА БАЗАТА ДАННИ успешно обработи 0 страници за 0,263 секунди (0,000 MB/сек)., така че изглежда, че SQL Server просто е бил объркан относно състоянието на базата данни. - person R. Schreurs; 06.10.2017
comment
Работи за мен, но само когато премахнах двойните кавички -- просто имах [MY_DB_NAME] като параметър. - person StackOverflowUser; 23.04.2018

Добре, имам подобен проблем и точно както беше в случая с Pauk, той беше причинен от изчерпване на дисковото пространство на сървъра по време на възстановяване и така предизвика постоянно състояние на възстановяване. Как да прекратя това състояние, без да спирам услугите на SQL Server?

Намерих решение :)

Drop database *dbname*
person Community    schedule 26.06.2009

Опцията WITH 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:

въведете описание на изображението тук

Има и процес на виртуално възстановяване, но ще трябва да използвате решения на трети страни. Обикновено можете да използвате резервно копие на база данни като жива онлайн база данни. ApexSQL и Idera имат свои собствени решения. Преглед от SQL Hammer относно ApexSQL Restore. Виртуалното възстановяване е добро решение, ако имате работа с голям брой резервни копия. Процесът на възстановяване е много по-бърз и също може да спести много място на дисковото устройство. Можете да разгледате инфографика тук за малко сравнение.

person Marko Krstic    schedule 17.01.2014

Това може да е доста очевидно, но току-що ме препъна:

Ако правите резервно копие на последния журнал, този проблем може да бъде причинен и от отметката на тази опция в съветника за възстановяване на SSMS - „Оставете изходната база данни в състояние на възстановяване (С НЕВЪЗСТАНОВЯВАНЕ)“

въведете описание на изображението тук

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, работи добре. Чудя се как да направя моето php приложение свързано през цялото време? - person channa ly; 29.01.2012
comment
Случва се и тук, DB остана във възстановяване/единичен потребител след възможно прекъсване на връзката. Уби всички други 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. Щракнете с десния бутон върху базата данни на виновника и натиснете DELETE (за да изтриете базата данни изобщо).

  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 сървърът се опитва да възстанови от този файл. Премахнете отметката от файла и щракнете върху OK. Базата данни се завръща .....

това реши проблема за мен, надявам се това да помогне на някого.

person Maverick HT    schedule 31.07.2020

В моя случай беше достатъчно да премахна базата данни, която висеше в състояние „Възстановява се...“ с SQL командата

 drop database <dbname> 

в прозорец за заявка.

След това щракнах с десния бутон върху Бази данни и избрах Опресняване, което премахна записа в Management Studio. След това направих ново възстановяване, което работи добре (имайте предвид, че прехвърлянето му офлайн не проработи, рестартирането на SQL услугата не проработи, рестартирането на сървъра също не проработи).

person Matt    schedule 18.07.2018

Имах този проблем, когато получих TCP грешка в регистъра на събитията...

Пуснете DB с sql или щракнете с десния бутон върху него в мениджъра „изтриване“ и възстановете отново.

Всъщност започнах да правя това по подразбиране. Направете скрипт за премахване на DB, пресъздайте и след това възстановете.

person ZeusT    schedule 13.03.2010

По подразбиране всеки RESTORE DATABASE идва с настройка RECOVERY. Опциите „NORECOVERY“ основно казват на SQL Server, че базата данни чака още файлове за възстановяване (може да е DIFF файл и LOG файл и може да включва tail-log архивен файл, ако е възможно). Опциите „ВЪЗСТАНОВЯВАНЕ“ завършват всички транзакции и оставят базата данни готова за извършване на транзакции.

So:

  1. ако вашата база данни е настроена с SIMPLE модел за възстановяване, можете да извършите ПЪЛНО възстановяване само с опция NORECOVERY, когато имате DIFF резервно копие. Не се допуска резервно копие на LOG в базата данни на модела за възстановяване на SIMPLE.
  2. В противен случай, ако вашата база данни е настроена с ПЪЛЕН или ГРУПОВ РЕГИСТРИРАН модел на възстановяване, можете да извършите ПЪЛНО възстановяване, последвано от NORECOVERYoption, след което изпълнете 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

Опцията WITH REPLACE трябва да се използва с повишено внимание, тъй като може да доведе до загуба на данни

Или, ако извършите ПЪЛНО и РАЗЛИЧНО архивиране, можете да използвате това

   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. run command: drop database [вашата база данни], което ще ви даде грешка, казвайки ви името на базата данни за моментни снимки
  3. изпълнете команда: пуснете база данни [моментна снимка база данни] и след това изпълнете отново командата в стъпка 2.
person Community    schedule 28.08.2009

Опитахте ли да стартирате VERIFY ONLY? Само за да се уверя, че е резервно копие на звука.

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

person Sam    schedule 06.02.2009

Имам случай MyDbName (Възстановяване...) поради ограничението за лиценз на SQL Express.

В регистрационния файл намерих това:

CREATE DATABASE или ALTER DATABASE неуспешно, тъй като полученият кумулативен размер на база данни би надхвърлил лицензирания лимит от 10240 MB на база данни.

Така че, ако се опитвате да възстановите по-голяма база данни, трябва да превключите вашия 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 Agent Service.
  2. Използване на следния T-SQL:

    ИЗБЕРЕТЕ име на файл ОТ master.sys.sysaltfiles WHERE dbid = DB_ID('db_name');

  3. Използване на T-SQL непрекъснато:

    ВЪЗСТАНОВЯВАНЕ НА БАЗА ДАННИ ОТ ДИСК = 'DB_path' С РЕСТАРТ, ЗАМЕНА;

Надявам се това да помогне!

person Trung Nguyen    schedule 14.05.2013

Всички опции, базирани на WITH RECOVERY, не работеха за мен.

Това, което направих, беше да направя пълното възстановяване от 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 файловете ще проработи... но въпреки това замръзна при възстановяване?

В крайна сметка разреших това, като изтрих файловете, както беше споменато, но вместо да се опитам да възстановя DB отново, копирах нови .mdf и .ldf файлове и ги прикачих с помощта на съветника за прикачен файл от предния край. Облекчение, проработи!!

Отне ЗАВИНАГИ да копирам новите файлове, тъй като използвам виртуална машина... така че копирането и поставянето с помощта на клипборда отне около час, така че бих препоръчал това само като последен опит.

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