вторник, 6 декабря 2011 г.

Как подключить базу данных без файла лога транзакций

На днях удивила ситуация, что системный администратор одной из компаний не смог подключить базу данных к Microsoft SQL Server. Некоторая сложность заключалась в том, что после серьезного системного сбоя был утерян файл журнала транзакций (*.ldf) и в наличии был лишь файл данных (*.mdf). Попытка подключить базу с помощью GUI в Management Studio, разумеется, не увенчалась успехом. Ошибка, возникающая при этом выглядит так:

Attach database failed for Server 'имя-сервера'

Unable to open the physical file "*:\*********\*******_log.ldf". Operating system error 2: "2(Не удается найти указанный файл.)". (Microsoft SQL Server, Error: 5120)

Конечно же ситуация неприятная. Если такой случай возникает, то самое время восстанавливаться из архивной копии (не спроста же вы потеряли файл транзакций).

Если ситуация еще больше усложняется тем, что у нас нету последней архивной копии и нужно попытаться заставить работать “поврежденную” базу данных, то можно воспользоваться хранимой процедурой:

sp_attach_single_file_db

Команда будет выглядеть примерно так:

USE master;
GO
EXEC sp_attach_single_file_db @dbname = '<Имя базы данных>', @physname = N'<Путь_к_файлу_данных_mdf>';
GO

После выполнения этой команды в окне Messages мы увидим примерно следующее:

File activation failure. The physical file name "<Путь к файлу лога транзакций *.ldf>" may be incorrect.
New log file 'Имя нового файла лога транзакций *.ldf' was created.

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

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

2 комментария:

Анонимный комментирует...

А вот теперь попробуйте Ваш сценарий при такой ошибке: "A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - С обоих концов канала отсутствуют процессы.)"
Я не буду сильно удивлен :-((

Evgeny Vekovshinin комментирует...

Данная ошибка не имеет никакого отношения к описанной в посте проблеме - это, как говорится, уже совсем другая история