Как восстановить базу данных из MDF в SQL Server 2005?

У меня есть файл MDF и файлы LDF для базы данных, созданной в MS SQL Server 2005. Когда я пытаюсь подключить файл MDF к другому SQL Server, я получаю следующее сообщение об ошибке.

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

Я хотел бы выполнить любой из следующих вариантов:

  • Прикрепите базу данных без потери данных (маловероятно, но я бы сэкономил некоторое время).
  • Прикрепите базу данных с потерей данных (все транзакции были потеряны).
  • Восстановить только схему (без данных) из файла MDF.

Какие SQL-команды я могу попытаться снова запустить мою базу данных?

Ответы

Ответ 1

Я нашел следующий документ в Expert Exchange.

patrikt: У вас будет потеря данных, но это можно сделать.

1. Detach database and move your mdf to save location.
2. Create new databse of same name, same files, same file location and same file size.
3. Stop SQL server.
4. Swap mdf file of just created DB to your save one.
5. Start SQL. DB will go suspect.
6. ALTER DATABASE yourdb SET EMERGENCY
7. ALTER DATABASE yourdb SET SINGLE_USER
8. DBCC CHECKDB (yourdb, REPAIR_ALLOW_DATA_LOSS)
9. ALTER DATABASE yourdb SET MULTI_USER
10. ALTER DATABASE yourdb SET ONLINE

Ответ 2

Вот подробности, которые охватывают части 2) и 3), в случае, если повторно созданный журнал не работает, что может произойти, если файл MDF поврежден.

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

В таких случаях вы можете попробовать ApexSQL Recover. Из того, что я знаю, это единственный инструмент, который может выполнять такую ​​работу, но довольно дорогостоящий.

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

Ответ 3

FROM сообщение на форумах SQL Server Присоединение MDF без LDF:

Если вы хотите подключить MDF без LDF, вы можете выполнить следующие шаги: Он протестирован и работает нормально

  • Создайте новую базу данных с тем же именем и теми же файлами MDF и LDF

  • Остановите сервер sql и переименуйте существующий MDF в новый и скопируйте исходный MDF в это место и удалите LDF файлы.

  • Запустите SQL Server

  • Теперь ваша база данных будет помечена как подозрительная. 5. Обновите базы данных для обновления до аварийного режима. Это не будет использовать файлы LOG при запуске

Sp_configure "allow updates", 1
go
Reconfigure with override
GO
Update sysdatabases set status = 32768 where name = "BadDbName"
go
Sp_configure "allow updates", 0
go
Reconfigure with override
GO
  1. Перезагрузите сервер sql. теперь база данных будет находиться в аварийном режиме

  2. Теперь выполните недокументированный DBCC для создания файла журнала

DBCC REBUILD_LOG (dbname, 'c:\dbname.ldf') - Недокументированный шаг создайте новый файл журнала.

(замените имя dbname и имя файла журнала на основе требования ur)

  1. Выполнить sp_resetstatus

  2. Перезагрузите SQL-сервер и посмотрите, что база данных находится в сети.

ОБНОВЛЕНИЕ: DBCC REBUILD_LOG не существует SQL2005 и выше. Это должно работать:

USE [master]
GO
CREATE DATABASE [Test] ON 
    (FILENAME = N'C:\MSSQL\Data\Test.mdf')
    FOR ATTACH_REBUILD_LOG
GO

Ответ 4

Вы пытались игнорировать ldf и просто прикрепить mdf:

sp_attach_single_file_db [@dbname =] 'dbname', [@physname =] 'физическое имя'

Я точно не знаю, что произойдет с вашими открытыми транзакциями (возможно, просто потеряно), но может вернуть ваши данные в онлайн.

-don

Ответ 6

Найден другой способ, который работает полностью:

  • Создайте новую базу данных с одинаковым именем по умолчанию в базе данных.
  • Остановить SQL-сервер.
  • Скопируйте старый файл mdf, чтобы перезаписать вновь созданный файл mdf и удалить новый ldf файл.
  • Запустите SQL Server, база данных будет находиться в аварийном режиме.
  • Отсоедините базу данных аварийного режима
  • Скопируйте исходный файл ldf в папку базы данных по умолчанию (где новый LDF файл создается и удаляется в соответствии с шагом 3 выше.
  • Прикрепить файл MDF базы данных.

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

Ответ 7

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

Но вместо этого я нашел это, что сработало, и поэтому я решил поделиться этим для всех остальных:

http://www.kodyaz.com/articles/sql-server-attach-database-mdf-file.aspx

Ответ 8

Надеюсь, это легко сделать,

  • Открыть SQL Server
  • Нажмите "Новый запрос"
  • Выполните следующий запрос

    sp_attach_single_file_db @dbname = 'dbname', @physname = 'C:\Database\dbname.MDF'

Где dbname вы хотите показать в Обозревателе объектов, где @physname - локальное расположение файла вашего файла mdf.

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

Протестировано на Sql Server 2000 и 2008. На Sql Server 2000 он не работает, но отлично работает в 2008 году.