Sql база в процессе восстановления как вылечить

Sql база в процессе восстановления как вылечить thumbnail

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

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 FilesMicrosoft SQL ServerMSSQL.1MSSQLDATAMyDatabase.mdf
MyDatabase_log C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATAMyDatabase_log.LDF

20 ответов

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

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

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

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

вы можете иметь больше успеха с помощью мастера восстановления базы данных в SQL Server Студия Управления. Таким образом, можно выбрать определенные расположения файлов, параметр перезаписи и параметр с восстановлением. Иногда процесс восстановления застревает только из-за размера файла базы данных. смотрите здесь: https://madhivanan.wordpress.com/2016/09/06/issue-in-recovering-a-database-that-is-in-the-restoring-state-reference/

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

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

RESTORE DATABASE <database name> WITH RECOVERY

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

  1. остановить службу (MSSQLSERVER);
  2. переименовать или удалить файлы базы данных и журналов (C:Program файлыMicrosoft SQL ServerMSSQL.1MSSQLданные…) или где у вас есть файлы;
  3. запустить службу (MSSQLSERVER);
  4. удалить базу данных с проблемы;
  5. восстановить базу данных.

удачи!

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

RESTORE DATABASE <database name> WITH RECOVERY

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

восстановление базы данных успешно обработано 0 страниц за 18.530 секунд
(0.000 MB / sec).

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

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

RESTORE DATABASE “[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]”

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

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

56

автор: Demetris Leptos

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

Я нашел решение 🙂

Drop database *dbname*

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

RESTORE DATABASE YourDB WITH RECOVERY
GO

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

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. Виртуальный восстанавливая хорошее решение, если вы имеете дело с большим количеством резервных копий. Процесс восстановления намного быстрее, а также может сэкономить много места на диске. Вы можете взгляните на инфографики здесь для некоторого сравнения.

Читайте также:  Как вылечить сотрясение мозга у кошки

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

Если вы берете резервную копию хвостового журнала, эта проблема также может быть вызвана тем, что эта опция включена в Мастере восстановления SSMS – ” оставить исходную базу данных в состоянии восстановления (с NORECOVERY)”

enter image description here

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

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

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

Это сработало:

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

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

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

  1. остановить все связанные службы SQL из windows сервисы.

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

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

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

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

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

  3. Правой Кнопкой Мыши на базе данных виновника и нажмите Удалить (чтобы удалить базу данных на всех).

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

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

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

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

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

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

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

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

падение БД с sql или щелкните правой кнопкой мыши на нем в диспетчере ” удалить”
И восстановить снова.

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

по умолчанию every RESTORE DATABASE входит RECOVERY настройка.
Параметры “NORECOVERY” в основном сообщают SQL Server, что база данных ожидает больше файлов восстановления (может быть DIFF файл и LOG файл и, может включать файл резервной копии хвостового журнала, если это возможно).
Параметры “восстановление”, завершить все транзакции и пусть база данных готова к выполнению транзакций.

так:

  1. если ваша база данных настроена простой модель восстановления, вы можете выполнять только полное восстановить с помощью NORECOVERY вариант, когда у вас есть DIFF резервное копирование. Нет!–12–>LOG резервное копирование разрешается в простой модель восстановления базы данных.
  2. в противном случае, если база данных настроена с полное или МАССОВАЯ РЕГИСТРАЦИЯ модель восстановления, вы можете выполнять полное восстановление с последующим NORECOVERYопция, затем выполните DIFF следовал по NORECOVERY и, наконец, выполнить LOG восстановить с помощью .

помните, что ПОСЛЕДНИЙ ЗАПРОС ВОССТАНОВЛЕНИЯ ДОЛЖЕН ИМЕТЬ 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

  1. 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

конечно, вы можете выполнить восстановление с параметром статистика = 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

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

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

  1. сначала я следовал Типу Delacablu шаги (прочитайте несколько сообщений вверх)
  2. выполнить команду: drop database [ваша база данных], которая даст вам ошибку, сообщающую вам имя базы данных моментальных снимков
  3. run command: drop database [база данных моментальных снимков], а затем снова запустите команду на Шаге 2.
Читайте также:  Как вылечить рожу у ребенка

в моем случае этого было достаточно, чтобы удалить базу данных, который висел в состоянии “восстановление…” С помощью команды SQL

drop database <dbname>

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

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

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

    выберите имя файла
    от мастера.системный.sysaltfiles
    Где dbid = функции db_id(‘имя_базы_данных’);

  3. использование T-SQL непрерывно:

    восстановить базу данных с диска = ‘DB_path’
    С
    ПЕРЕЗАПУСТИТЬ, ЗАМЕНИТЬ;

надеюсь, что это поможет!

все опции на основе восстановления не работали для меня.

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

USE [master]
RESTORE DATABASE Sales_SSD
FROM DISK = N’D:databaseBackups02Daily_Sales_20150309_0941.bak’
WITH FILE = 1,
MOVE N’Sales_Data’ TO N’C:DataSSDSales.mdf’,
MOVE N’Sales_Log’ TO N’C:DataSSDSales_1.ldf’,
NOUNLOAD, REPLACE, STATS = 5

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

в конечном итоге я решил это, удалив файлы, как упоминалось, но вместо того, чтобы пытаться восстановить БД снова, я скопировал свежий.MDF и. ldf-файлы и прикрепленные к ним с помощью мастера вложений переднего плана. Облегчение, сработало!!

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

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

в файле журнала, я нашел это:

создать базу данных или изменить базу данных не удалось, потому что в результате
общий размер базы данных превысьте лицензионный лимит 10240 МБ
по базе данных.

Итак, если вы пытаетесь восстановить большую базу данных,вам нужно переключить SQL Express server to Developer edition например.

Источник

Slider_spb
Member

Откуда:
Сообщений: 802

SQL Server 2005
После перезагрузки службы SQL несколько баз более суток висят в статусе “В процессе восстановления”. Модель восстановления у них был простая, так что из лога там нечего восстанавливать. Размер одной 10 мб, так что в смысле количества данных там тоже не особо чего восстанавливать. В чем тогда дело? С ними можно что-нибудь сделать? Если да, то как? На любые попытки действий выдаются разные ошибки в смысле что БД занята или недоступна.

Glory
Member

Откуда:
Сообщений: 104760

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

Это вы прямо в логе запуска сервера увидели ?

Slider_spb
Member

Откуда:
Сообщений: 802

Я помню какая у них модель восстановления стояла.

Glory
Member

Откуда:
Сообщений: 104760

Slider_spb
Я помню какая у них модель восстановления стояла.

Ага, а сервер вам прямо в мозг транслировал процесс восстановления ?

Slider_spb
Member

Откуда:
Сообщений: 802

В логах сервера куча странных сообщений типа
Process 28:0:0 (0x10b4) Worker 0x00000000045C21C0 appears to be non-yielding on Scheduler 2. Thread creation time: 12992448823438. Approx Thread CPU Used: kernel 2218 ms, user 166453 ms. Process Utilization 0%. System Idle 88%. Interval: 260539403 ms.
больше никаких критичных ошибок не нашел

Glory
Member

Откуда:
Сообщений: 104760

Slider_spb
В логах сервера куча странных сообщений типа
Process 28:0:0 (0x10b4) Worker 0x00000000045C21C0 appears to be non-yielding on Scheduler 2. Thread creation time: 12992448823438. Approx Thread CPU Used: kernel 2218 ms, user 166453 ms. Process Utilization 0%. System Idle 88%. Interval: 260539403 ms.
больше никаких критичных ошибок не нашел

Искать надо прогресс запуска базы
Выглядит он так
Recovery of database ‘DWH’ (7) is 0% complete (approximately 20 more seconds) (Phase 2 of 3).
Recovery of database ‘DWH’ (7) is 15% complete (approximately 17 more seconds) (Phase 2 of 3).
Recovery of database ‘DWH’ (7) is 80% complete (approximately 2 more seconds) (Phase 2 of 3).
627 transactions rolled forward in database ‘DWH’ (7).
Recovery of database ‘DWH’ (7) is 100% complete (approximately 0 more seconds) (Phase 2 of 3).
0 transactions rolled back in database ‘DWH’ (7).
Recovery is checkpointing database ‘DWH’ (7)

Slider_spb
Member

Откуда:
Сообщений: 802

Единственное сообщение в логе, которое удалось найти и связано с базой которая висит в процессе восстановления выглядит так: “Starting up database ‘TEMPLATEDB’.”

Slider_spb
Member

Откуда:
Сообщений: 802

после строки идёт дамп памяти который содержит
* ALTER DATABASE [TEMPLATEDB] SET READ_WRITE WITH NO_WAIT
и закачивается ошибкой
DoMiniDump () encountered error (0x800703E6) – Неверная попытка доступа к адресу памяти.

Читайте также:  Рецепты как вылечить зубы

Slider_spb
Member

Откуда:
Сообщений: 802

Так можно с базой что-нибудь сделать? Её ни отключить, ни удалить не получается…

Glory
Member

Откуда:
Сообщений: 104760

Перезапустить сервер ?

Slider_spb
Member

Откуда:
Сообщений: 802

Ну если другого выхода нет, попробую…

Slider_spb
Member

Откуда:
Сообщений: 802

Перезапустил, некоторое базы восстановились, другие повисли в процессе восстановления, в логах аналогичные ошибки памяти, похоже серваку хана, скорее всего проблемы с памятью, приступаю к процесу спасения оставшихся БД…
Всем спасибо…

RedMercury

Guest

А так.
restore database (Name database) with (no)recovery – должно отпустить

RedMercury

Guest

NameDataBase – та которая “В процессе восстановления”

Источник

Рассмотрим несколько вариантов восстановления БД, в зависимости от того, насколько повреждены файлы БД зависит успешность того или иного метода. Все описанные способы были лично мной проверены на практике и все случаи восстановления, за исключением одного, были успешны. Используйте данное руководство на свой страх и риск, за совершенные вами действия ответственность несете, вы сами.

Итак, во-первых останавливаем службу SQL Server и копируем файлы базы данных (*.mdf и *.ldf) в другую папку, чтобы можно было восстановить их в случае неудачи.

Если у вас есть свежий актуальный бэкап, то дальше можете не читать, а просто восстановите БД из него, тем самым сэкономите драгоценное время, далее я приведу алгоритмы восстановления для разных версий SQL Server. Надеюсь вам это поможет, как в свое время помогло и мне.

Для всех версий SQL Server подойдет следующий вариант: делаем Detach database (отсоединить базу данных), удаляем журнал транзакций (файл с расширением ldf) и делаем Attach database(присоединить базу данных). В мастере выбираем наш mdf файл и жмем ОК.

Если mdf файл не поврежден, то он успешно присоединится и мы увидим нашу базу в диспетчере объектов целую и невредимую.

Радуемся успешному восстановлению. (Этот вариант сработает только если mdf файл не поврежден, поэтому срабатывает не всегда). Если не получилось, то создаем новую базу данных с таким же именем, останавливаем сервер. Подменяем файл mdf файлом от нашей базы, стартуем службу SQL Server и открываем Query analyzer(SQL 2000) или Management studio(SQL 2005/2008) в зависимости от нашей версии сервера.

Пишем следующее:

USE master
GO
sp_configure ‘allow updates’, 1
reconfigure WITH override
GO

Если у вас SQL 2000, то далее пишем:

UPDATE sysdatabases SET STATUS= 32768 WHERE name = ‘db_name’
GO

Если SQL 2005 или 2008, то пишем:

ALTER DATABASE db_name SET EMERGENCY, SINGLE_USER
GO

где вместо db_name пишем имя своей БД

Жмем F5. После этого наша БД должна быть видна в статусе EMERGENCY.

В особо тяжелых случаях возникают проблемы с переходом в EMERGENCY, возможны даже проблемы с detach, в таких случаях поврежденная база удаляется, а далее происходит хитрая подмена файлов данных. Для начала создадим новую базу, имена файлов mdf и ldf должны совпадать с именами файлов поврежденной базы. Новую базу переводим в режим EMERGENCY, останавливаем службу MSSQL и подменяем файлы поврежденными. Таким образом мы получим рабочий инстанс в статусе EMERGENCY с поврежденными файлами.

Отлично, приступаем к восстановлению.

Выполним следующие SQL команды.

Для SQL 2000:

DBCC REBUILD_LOG(‘db_name’, ‘Полный путь к новому файлу ldf’)
GO

Жмем F5, если все нормально, сервер скажет: Warning: The log for database ‘db_name’ has been rebuilt.

Стираем и пишем:

USE master
GO
sp_dboption ‘db_name’, ‘single user’, ‘true’
GO
USE db_name
GO
DBCC CHECKDB(‘db_name’, REPAIR_REBUILD)
GO

Если база не хочет в single mode можно попробовать такую команду

USE db_name
ALTER database db_name set SINGLE_USER with rollback immediate
GO

если DBCC не хочет выполняться, то вместо REPAIR_REBUILD нужно подставить REPAIR_ALLOW_DATA_LOSS

Жмем F5, ждем некоторое время. Сервер вернет кучу сообщений. Если там будут содержаться ошибки, то лучше еще раз выполнить DBCC CHECKDB с параметром REPAIR_REBUILD, пока все ошибки не будут устранены.

Для SQL 2005/2008 действия несколько иные:

DBCC CHECKDB(‘db_name’, REPAIR_ALLOW_DATA_LOSS)
GO

Тут без вариантов. В SQL 2005 и выше нет инструкции REBUILD_LOG, вместо этого выполняется CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS.

После того как сервер закончит выполнять запрос и вернет результат, меняем REPAIR_ALLOW_DATA_LOSS на REPAIR_REBUILD и выполняем запрос еще раз, это должно убрать оставшиеся ошибки в бд.

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

Пишем:

Для SQL 2000:

USE master
GO
sp_dboption ‘db_name’, ‘single user’, ‘false’
GO

Для SQL 2005/2008:

ALTER DATABASE db_name SET ONLINE, MULTI_USER
GO

Все. База онлайн и готова к работе. Радуемся и не забываем делать бэкапы.

Источник