Присоединение базы данных без файла журнала транзакций
Пересказ статьи Chad Callihan. Attach Database Without Transaction Log File
Что если вы перемещаете базу данных на новый сервер, отсоединяя (detach) и снова присоединяя файлы базы данных, и кто-то (конечно, не вы) потерял файл журнала? Что если требуется перевести старую базу данных в режим онлайн, но к вам пришел человек, у которого имеется только mdf файл? Можно все же присоединить базу данных в подобных случаях? Давайте это выясним.
Сейчас у нас имеются файлы mdf и ldf для базы данных ExampleDB.
Чтобы перейти к нашему тесту, давайте отсоединим базу данных в SSMS:
Теперь мы можем выбрать наш файл 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 использует для присоединения базы данных. Если выполнить скрипт, то мы получим ошибку того же типа, что и прежде:
SQL Server пытается помочь, добавляя этот файл журнала. Что если мы удалим эту строку, и просто попытаемся создать базу с одним mdf:
Сбой активации файла. Возможно, имя физического файла “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'у просто следовало бы сказать "Не найден" вместо сообщения "Будет создан новый пустой файл журнала". Процесс удаления строки файла журнала и присоединения также сработал. Я еще не уверен, что сообщение "Будет создан новый пустой файл журнала" является вводящим в заблуждение багом, и нет ли другого трюка, чтобы это сработало. Сообщите мне, если вы получили другой результат.
Чтобы перейти к нашему тесту, давайте отсоединим базу данных в 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'у просто следовало бы сказать "Не найден" вместо сообщения "Будет создан новый пустой файл журнала". Процесс удаления строки файла журнала и присоединения также сработал. Я еще не уверен, что сообщение "Будет создан новый пустой файл журнала" является вводящим в заблуждение багом, и нет ли другого трюка, чтобы это сработало. Сообщите мне, если вы получили другой результат.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой