Skip to content

Присоединение базы данных без файла журнала транзакций

Пересказ статьи Chad Callihan. Attach Database Without Transaction Log File


Что если вы перемещаете базу данных на новый сервер, отсоединяя (detach) и снова присоединяя файлы базы данных, и кто-то (конечно, не вы) потерял файл журнала? Что если требуется перевести старую базу данных в режим онлайн, но к вам пришел человек, у которого имеется только mdf файл? Можно все же присоединить базу данных в подобных случаях? Давайте это выясним.

Сейчас у нас имеются файлы mdf и ldf для базы данных ExampleDB.



Чтобы перейти к нашему тесту, давайте отсоединим базу данных в SSMS:

USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'ExampleDB'
GO

Теперь мы можем выбрать наш файл ExampleDB_log.ldf в проводнике Windows и удалить его. Останется только mdf.



Давайте вернемся в SSMS, выполним щелчок правой кнопкой на папке Databases в браузере объектов и выберем “Attach…”:



Щелкнем кнопку Add в районе середины окна и выберем наш файл ExampleDB.mdf:



Присоединить здесь


Тут становится интересно. В нижней половине окна мы можем увидеть добавление файла ExampleDB_log.ldf. Можно отрегулировать ширину столбца, чтобы увидеть сообщение:



Звучит просто. Давайте нажмем ОК и посмотрим, сделает ли SQL Server то, что обещает:



Нет. Щелкнем ОК, чтобы вернуться к окну присоединения. Прокрутим вправо ниже “Databases to attach” и щелкнем Message, чтобы увидеть подробную информацию:



Щелкнем еще раз ОК, чтобы вернуться к окну Attach. Давайте заглянем под капот. Чтобы выяснить, что пытается выполнить SQL Server, щелкнем “Script” и выберем Script Action to New Query Window (вывести действие скрипта в новое окно запроса):



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

USE [master]
GO
CREATE DATABASE [ExampleDB] ON
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB_log.ldf' )
FOR ATTACH
GO
Msg 5120, Level 16, State 101, Line 3
Невозможно открыть физический файл “C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB_log.ldf”. Ошибка операционной системы 2: “2 (Система не может найти указанный файл.)”.
Msg 1802, Level 16, State 7, Line 3
Операция CREATE DATABASE не удалась. Некоторые файлы с перечисленными именами не были созданы. Проверьте связанные ошибки.

SQL Server пытается помочь, добавляя этот файл журнала. Что если мы удалим эту строку, и просто попытаемся создать базу с одним mdf:

USE [master]
GO
CREATE DATABASE [ExampleDB] ON
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB.mdf' )
FOR ATTACH
GO

Сбой активации файла. Возможно, имя физического файла “C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB_log.ldf” указано неверно.
Был создан новый файл журнала “C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ExampleDB_log.ldf”.

База данных присоединена успешно, и мы снова в деле. Вместо изменения скрипта мы могли также выполнить это с помощью GUI, удалив ldf ниже деталей базы данных и щелкнув ОК:



Вводящее в заблуждение сообщение?


SQL Server'у просто следовало бы сказать "Не найден" вместо сообщения "Будет создан новый пустой файл журнала". Процесс удаления строки файла журнала и присоединения также сработал. Я еще не уверен, что сообщение "Будет создан новый пустой файл журнала" является вводящим в заблуждение багом, и нет ли другого трюка, чтобы это сработало. Сообщите мне, если вы получили другой результат.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

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