SQL Server: база даних застрягла у стані "Відновлення"


564

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

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

3
У мене було саме таке питання, і всі рішення провалилися. Цікаво, що я ввійшов безпосередньо на SQL-сервер і видав DROP DATABASE dbкоманду через SSMS, і вона спрацювала (раніше я використовував SSMS з іншої машини для видачі команд). Я здогадуюсь, інші рішення також спрацювали б.
Салман

Відповіді:


437

Вам потрібно скористатися WITH RECOVERYопцією з RESTOREкомандою вашої бази даних , щоб вивести свою базу даних в Інтернеті як частину процесу відновлення.

Це, звичайно, лише в тому випадку, якщо ви не збираєтесь відновлювати резервні копії журналу транзакцій, тобто ви бажаєте лише відновити резервну копію бази даних, а потім матимете доступ до бази даних.

Ваша команда повинна виглядати так,

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

Можливо, ви отримаєте більше успіхів за допомогою майстра відновлення бази даних в SQL Server Management Studio. Таким чином ви можете вибрати конкретні місця розташування файлів, опцію перезаписати та опцію відновлення.


3
Мені ніколи не доводилося використовувати оператор відновлення, коли він робив те, що він робить. З ЗАМОВЛЕННЮ повинно вистачити.
Сем

8
Так, я використовував NORECOVERY, але процес відновлення висить. Використовуючи
функцію ВІДНОСНЕННЯ, ЗАМІНУЙТЕ

Це вирішило мою проблему. У нас був збій SAN в середині відновлення, і це було швидким і чистим рішенням.
Зареєстрований користувач

У мене була подібна проблема сьогодні з базою даних SQL Server 2005. У моєму випадку мені довелося додати пункт «RESTART» до пункту WITH, щоб вирішити проблему. Це давало мені повідомлення про помилку, вказуючи, що попередня операція не була успішною.
XpiritO

3
@FistOfFury Якщо попередня операція відновлення на тій самій базі даних знаходиться в призупиненому / сплячому стані, то так. Просто зупинення / скасування відновлення процесу повинно мати той же ефект.
Джон Сансон

692

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

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

RESTORE DATABASE <database name> WITH RECOVERY

4
У нас було відновлено БД протягом двох годин. Ми запустили цю команду з іншої машини проти господаря, і це нас виправило прямо. Дякую!
Піт

11
+1, з ґотчею. Коли я запустив це, я отримав повідомлення про помилку, в якому сказано, що база даних вже повністю відновлена. Але це все ще показало, що знаходиться у стані "у відновленні". Тож я клацнув правою кнопкою миші в студії управління, натиснув «Оновити», і вона повернулася до норми.
dario_ramos

2
Я відновився за допомогою майстра Mng Studio, ввів нове ім'я бази даних, але помилково залишив назви файлів такими ж, як у існуючої бази даних. У мене з’явилася помилка «відновити не вдалося, але хвіст журналу вдалий», і база даних, прикріплена до цих файлів, застрягла у відновлюваному стані. Здається, що ця команда відновила базу даних до її попереднього стану.
Кріс

3
Це спрацювало. Я намагався відновити резервну копію до бічної бази даних, але моя основна база даних чомусь перейшла у стан відновлення. Це фактично відновило мою БД. Дякую купу!
Аравінд

2
Деякі параметри майстра відновлення SSMS залишать вихідний БД у відновлюваному стані таким чином, що ви можете продовжувати відновлення різних резервних копій або журналів, не побоюючись користувачів, і ця команда є правильним способом повернути БД у нормальний стан, як тільки ви будете виконані.
Тім Ленер

102

Ось як це зробити:

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

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

8
Чому б просто не скинути базу даних? Таким чином, вам не доведеться припиняти послугу.
ErikE

8
@ErikE Для мене сервер SQL сказав, що він не може скинути базу даних в середині відновлення, хоча це не було дійсно відновлення ....
Erik Philips

@ErikPhilips У такому випадку я гадаю, що хтось повернувся до припинення послуги. Цікаво, чи трапляється це кожен раз або лише в певних випадках проблеми, що застрягла-відновила.
ErikE

5
У моєму випадку достатньо було залишити базу даних, яка висіла у стані "Відновлення ..." командою SQL, drop database <dbname>у вікно запиту. Потім я клацнув правою кнопкою миші на базі даних і вибрав « Оновити», який видалив запис у студії управління. Згодом я зробив нове відновлення, яке спрацювало чудово ( зауважте, що приведення його в офлайн не працювало, перезапуск служби SQL не працював, перезавантаження сервера також не працювало).
Метт

84

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

RESTORE DATABASE <database name> WITH RECOVERY

Повідомлення бази даних:

RESTORE DATABASE успішно обробив 0 сторінок за 18.530 секунд (0.000 МБ / сек).

Після цих 18 секунд база даних знову була використана.


6
Особливо корисно, коли ви вже відновили базу даних, але забули варіант RECOVERY ...
JBickford

2
Це все, що мені було потрібно, щоб він міг залишити стан "Відновлення" після відновлення резервної копії цієї бази даних на інше ім'я БД. Дякую купу.
Шон

81

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

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

які виправили це питання. Спочатку у мене виникли проблеми через назву бази даних, яка містила спеціальні символи. Я вирішив це, додавши подвійні лапки - окремі цитати не працюватимуть, створюючи помилку "Неправильний синтаксис біля ...".

Це було мінімальне рішення, яке я намагався вирішити цю проблему (застрягла база даних у відновленні стану), і я сподіваюся, що вона може бути застосована до більшої кількості випадків.


2
Працював ідеально - не потрібно зривати його і знову піднімати. 3 Dbs 80+ Gb кожен займає деякий час! Дякую!
Крістер

1
Я майже зробив це на виробничих умовах. Я спробував це на місцевому спочатку, опинився в цій самій ситуації і знайшов ваш коментар. Урок: Використовуйте сценарії та не довіряйте SSMS у важливих ситуаціях.
Маріуш

1
Цю проблему я отримав, коли відновлював резервну копію файлу лише для копіювання бази даних до нової бази даних. Оригінальна база даних показала помилку. Це рішення спрацювало, і я отримав відповідь: "ВІДКРИТИ ДАТАБАЗУ успішно обробити 0 сторінок за 0,263 секунди (0,000 МБ / сек)." , тому здається, що SQL Server був просто заплутаний у стані бази даних.
Р. Шреурс

1
Працював для мене, але лише тоді, коли я видалив подвійні лапки - у мене просто був параметр [MY_DB_NAME].
StackOverflowUser

34

Гаразд, у мене є аналогічна проблема, і саме так, як це було у випадку з Павком, вона була викликана тим, що сервер вичерпав дисковий простір під час відновлення і таким чином спричинив постійне відновлення. Як закінчити цей стан без зупинки сервісів SQL Server?

Я знайшов рішення :)

Drop database *dbname*

29

З використанням опції RECOVERY за замовчуванням використовується команда RESTORE DATABASE / RESTORE LOG. Якщо ви застрягли в процесі "відновлення", ви можете повернути базу даних в стан онлайн, виконавши:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Якщо для відновлення декількох файлів потрібні команди CLI, потрібно, відповідно, з NORECOVERY та 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 . Віртуальне відновлення є хорошим рішенням, якщо ви маєте справу з великою кількістю резервних копій. Процес відновлення відбувається набагато швидше, а також може заощадити багато місця на диску. Тут можна поглянути на інфографіку для порівняння.


23

Це може бути досить очевидним, але це мене збудило просто зараз:

Якщо ви робите резервну копію журналу хвоста, ця проблема також може бути викликана тим, що цей параметр перевіриться в майстрі відновлення SSMS - "Залиште вихідну базу даних у відновлюваному стані (З НОРЕКОВЕРІЇ)"

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


7
Якщо ви перебуваєте в такому стані, то найкраще зробити: 1. Клацніть правою кнопкою миші базу даних, перейдіть до Завдання-> Відновити-> Журнали транзакцій 2. Знайдіть файл резервного копіювання, який використовувався для резервного копіювання журналу Tail 3. Відновлення. резервне копіювання Відновлення має успішно повернути базу даних в Інтернет.
Райан Гросс

16

Я зрозумів, чому.

Якщо клієнт, який видав RESTORE DATABASE команду, відключається під час відновлення, відновлення буде застрягнутим.

Дивно, що сервер, коли йому сказано відновити базу даних підключенням клієнта, не завершить відновлення, якщо клієнт не залишатиметься підключеним весь час.


10
Усі команди SQL вимагають, щоб клієнт залишався підключеним весь час.
mrdenny

2
@mrdenny: Я би припустив, що зміни скасовуються, коли клієнт відключається.
Ян Бойд

У мене така ж проблема із запуском цієї команди з драйвером PHO PDO від Microsoft. однак при роботі зі студією управління сервером microsoft sql це працює чудово. Цікаво, як зробити так, щоб моя програма php підключалася весь час?
Channa ly

Тут також сталося, що БД застряг у відновленні / однокористувачі після можливого розриву з'єднання. Вбивство всіх інших SPID з нового сеансу, але все ще застрягло. Вдалося скинути базу даних як рішення.
crokusek

10

ця спрацювала:

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 Management зі звичайним входом.

  3. Клацніть правою кнопкою миші на базі винуватців і натисніть DELETE (щоб видалити базу даних взагалі).

  4. Усі файли LDF та MDF, пов'язані з цією базою даних, перейшли з папки DATA (згадано на кроці 2).

  5. Створено нову базу даних з такою ж назвою (те саме ім’я тієї, яку я видалив на кроці 6 - база даних винуватців).

  6. Потім [ім'я бази даних] -> клацніть правою кнопкою миші -> завдання -> Зайняти офлайн.

  7. Потім я скопіював обидва файли (з кроку 3) назад у папку DATA (крок 2).

  8. [ім'я бази даних] -> клацання правою кнопкою миші -> завдання -> Підключення до Інтернету.


Це працювало і для мене. На кроці 10 я вирішив перезаписати існуючі файли.
Divi perdomo

8

Я маю . в моєму імені бази даних, і запит не працював через це (кажучи Неправильний синтаксис біля '.') Потім я зрозумів, що мені потрібна дужка для цього імені:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

5

У моєму випадку було достатньо скинути базу даних, яка висіла у стані "Відновлення ..." за допомогою команди SQL

 drop database <dbname> 

у вікні запиту.

Потім я клацнув правою кнопкою миші на базі даних і вибрав « Оновити», який видалив запис у студії управління. Згодом я зробив нове відновлення, яке спрацювало чудово (зауважте, що приведення його в режим офлайн не працювало, перезапуск служби SQL не працював, перезавантаження сервера також не працювало).


3

У мене була ця проблема, коли я також отримав помилку TCP в журналі подій ...

Відкиньте БД за допомогою sql або клацніть правою кнопкою миші на ньому в менеджері "delete" та відновіть знову.

Я фактично почав це робити за замовчуванням. Сценарій падіння БД, відновлення та відновлення.


3

За замовчуванням кожен RESTORE DATABASEпостачається з RECOVERYналаштуванням. Параметри "NORECOVERY", в основному, повідомляють SQL Server, що база даних чекає більше файлів відновлення (це може бути DIFF- файл та LOG файл і, якщо можливо, може містити файл резервного копіювання хвостового журналу). Параметри "ВІДНОВЛЕННЯ", закінчіть усі транзакції та дозвольте базі даних готові здійснювати транзакції.

Тому:

  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

З ЗАМОВЛЕННЯМ слід використовувати обережно, оскільки це може призвести до втрати даних

Або, якщо ви виконуєте резервну копію FULL та 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

Сподіваюся, що це допоможе.


2

Також може виникнути проблема з видаленням застряглої бази даних, якщо знімок включений. Для мене це спрацювало:

  1. Спочатку я пішов за Тіпу Делакаблу кроків (прочитав кілька публікацій)
  2. запустити команду: drop database [ваша база даних], яка дасть вам помилку в повідомленні імені бази даних знімків
  3. запустити команду: скинути базу даних [база даних знімків], а потім знову виконати команду на кроці 2.


1

У мене випадок MyDbName (відновлення ...) через ліцензований ліміт SQL Express.

У файлі журналу я знайшов таке:

Створити DATABASE або ALTER DATABASE не вдалося, оскільки отриманий сукупний розмір бази даних перевищить ліцензований ліміт 10240 МБ на базу даних.

Отже, якщо ви намагаєтесь відновити більшу базу даних, вам потрібно переключити свій сервер SQL Express, наприклад, на версію для розробників .


Це була база даних TFS, і клієнт TFS вже сказав мені: База даних повна.
cskwg

1

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

RESTORE DATABASE aqua_lc_availability
FROM DISK = 'path to .bak file'
WITH RECOVERY

0
  1. Дозвольте спочатку перевірити та запустити службу агента SQL.
  2. Використовуючи наступний T-SQL:

    ВИБІРТЕ ім'я файлу ВІД master.sys.sysaltfiles WHERE dbid = DB_ID ('db_name');

  3. Використання T-SQL безперервно:

    RESTORE DATABASE FROM DISK = 'DB_path' З RESTART, ЗАМІНА;

Сподіваюся, що це допоможе!


0

Всі варіанти на базі ВІДНОСНЕННЯ не працювали для мене.

Що потрібно зробити, щоб зробити повне відновлення з 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

0

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

Я вирішив це шляхом видалення файлів, як згадувалося, але замість спроби відновити БД я скопіював свіжі файли .mdf та .ldf і додав їх за допомогою майстра Front End Attachment. Полегшення, спрацювало !!

Копіювати нові файли потрібно, коли я використовую віртуальну машину ... ЗАБЕЗПЕЧЕННЯ, тому копіювання та вставлення з буфера обміну зайняло як годину, тому я рекомендував би це лише як останню спробу.


0

Що це зафіксувало для мене

  1. зупиняючи екземпляр
  2. створення резервної копії файлів .mdf та .ldf у папці даних
  3. Перезавантажте примірник
  4. видалити базу даних, що застрягла відновлення
  5. поверніть файли .mdf та.ldf назад у папку даних
  6. Приєднайте примірник до файлів .mdf та .ldf

0
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY

Будь ласка, вкажіть додаткове розуміння, яке надає ця відповідь у порівнянні зі старою, прийнятою та висококваліфікованою відповіддю. Це допомогло б уникнути враження, що щойно скопіювавши його в надії здобути репутацію. Також відповіді, що стосуються лише коду (що є основною видимою різницею), тут не оцінюються, оскільки вони створюють неправильне враження, що StackOverflow - це безкоштовна послуга написання коду,
Yunnosch,

Я виправив форматування, лише щоб зробити подібність до старій відповіді більш очевидною. Але ви можете навчитися робити це тут stackoverflow.com/editing-help у випадку, якщо ви спробуєте зробити більш легко читаються відповіді в майбутньому.
Yunnosch

0

Використовуйте наступну команду для вирішення цієї проблеми

RESTORE DATABASE [DatabaseName] WITH RECOVERY
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.