MSSQL Ошибка 5171: File is not a primary database file — Решение
- Сообщение:
Msg 5171, Level 16, State 1: 'D:\Data\Base1C.mdf' is not a primary database file. - База данных не монтируется при выполнении команды
ATTACHили старте службы. - Повреждение нулевой страницы файла данных (Page 0 — File Header Page).
- Попытка примонтировать вторичный файл данных
.ndfили лог.ldfв качестве основного файла.mdf.
1. Проверка порядка и типов файлов при монтировании
Убедитесь, что первым файлом в списке монтирования указан именно первичный файл данных (.mdf), а не вторичные файлы (.ndf) или журнал транзакций (.ldf):
CREATE DATABASE [Base1C] ON
( FILENAME = N'D:\Data\Base1C.mdf' ), -- PRIMARY FILE
( FILENAME = N'D:\Data\Base1C_1.ndf' ), -- SECONDARY FILE
( FILENAME = N'D:\Log\Base1C_log.ldf' ) -- LOG FILE
FOR ATTACH;
GO2. Анализ состояния нулевой страницы заголовка (Page 0)
Если порядок верен, но SQL Server выдает 5171, значит поврежден заголовок файла (первые 8 КБ). Проверьте заголовок с помощью DBCC PAGE:
DBCC TRACEON (3604);
-- Дамп страницы 0 файла 1
DBCC PAGE ('Base1C', 1, 0, 3);
GO3. Восстановление из бэкапа
При физическом повреждении нулевой страницы штатное восстановление через sp_attach_db невозможно. Разверните последний валидный бэкап:
RESTORE DATABASE [Base1C]
FROM DISK = N'D:\Backup\Base1C_Full.bak'
WITH NORECOVERY;
RESTORE LOG [Base1C]
FROM DISK = N'D:\Backup\Base1C_Log.trn'
WITH RECOVERY;
GO4. Аварийное извлечение через создание фиктивной базы (Hack Attach)
Если бэкапов нет, создайте новую чистую базу с точно такой же структурой файлов, остановите SQL Server, подмените MDF-файл и переведите сервер в режим EMERGENCY для запуска DBCC CHECKDB.
Частые вопросы (FAQ)
Почему повреждается именно нулевая страница файла данных?
Нулевая страница (File Header) перезаписывается при операциях расширения файла, контрольных точках и смене параметров. При внезапном сбое питания дисковый контроллер может повредить именно этот сектор.
Можно ли исправить ошибку 5171 через DBCC CHECKDB?
Нет, если база не монтируется (ATTACH fails), DBCC CHECKDB запустить невозможно, так как движок СУБД не может определить внутреннюю топологию и структуру страниц файла.
Чем отличается файл .mdf от .ndf?
MDF содержит системные каталоги, метаданные и загрузочные структуры базы. NDF — это дополнительные файлы вторичных файловых групп, не содержащие первичного загрузочного заголовка базы.
Поможет ли утилита chkdsk при ошибке 5171?
Chkdsk может восстановить целостность файловой системы NTFS, но если содержимое страницы внутри файла затерто нулями, логическую структуру заголовка SQL Server это не восстановит.