Как восстановить базу данных из MDF в SQL Server 2005? - PullRequest
15 голосов
/ 21 апреля 2009

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

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.

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

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

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

Ответы [ 8 ]

21 голосов
/ 21 апреля 2009

Я нашел следующий документ на Experts 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 <code>yourdb</code> SET EMERGENCY
7. ALTER DATABASE <code>yourdb</code> SET SINGLE_USER
8. DBCC CHECKDB (<code>yourdb</code>, REPAIR_ALLOW_DATA_LOSS)
9. ALTER DATABASE <code>yourdb</code> SET MULTI_USER
10. ALTER DATABASE <code>yourdb</code> SET ONLINE
11 голосов
/ 28 мая 2013

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

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

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

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

9 голосов
/ 21 апреля 2009

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

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

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

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

  3. Запустить SQL Server

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

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') - недокументированный шаг к создать новый файл журнала.

(замените имя базы данных и имя файла журнала в зависимости от ваших требований)

  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
5 голосов
/ 22 апреля 2009

Вы пытались игнорировать файл PDF и просто приложить файл mdf:

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

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

-don

2 голосов
/ 21 апреля 2009
1 голос
/ 16 января 2012

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

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

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

1 голос
/ 13 сентября 2010

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

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

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

0 голосов
/ 21 ноября 2013

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

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

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

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

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

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

...