MSSQL Ошибка 8909: PageId in the page header does not match
- Проверка целостности сообщает:
Msg 8909, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:12345). The PageId in the page header does not match the physical block address. - Сбой чтения данных при обращении к таблице 1С:
Ошибка СУБД: Ошибка ввода-вывода или повреждение страницы. - В журнале
dmesg/ Windows Event Log фиксируются ошибки дискового контроллера (Disk Event ID 7, 11, 55, bad blocks). - База данных переходит в статус
SUSPECTилиRECOVERY PENDING.
1. Полная диагностика базы через DBCC CHECKDB
-- Запуск полной проверки целостности с детализацией
DBCC CHECKDB ('DatabaseName') WITH NO_INFOMSGS, ALL_ERRORMSGS;2. Изоляция поврежденного объекта
-- Определение имени таблицы и индекса по Object ID и Index ID
SELECT
OBJECT_NAME(object_id) AS TableName,
name AS IndexName,
type_desc
FROM sys.indexes
WHERE object_id = <Object_ID_из_ошибки> AND index_id = <Index_ID_из_ошибки>;3. Вариант А: Восстановление поврежденной страницы из бэкапа (Page Restore)
Самый безопасный способ без потери данных (при наличии полной резервной копии и цепочки логов):
-- Восстановление конкретной страницы (File = 1, Page = 12345)
RESTORE DATABASE [DatabaseName]
PAGE = '1:12345'
FROM DISK = 'C:\Backup\FullBackup.bak'
WITH NORECOVERY;
-- Накатывание лога транзакций
RESTORE LOG [DatabaseName]
FROM DISK = 'C:\Backup\LogBackup.trn'
WITH RECOVERY;4. Вариант Б: Перестроение некластерного индекса
Если Index ID > 1 (некластерный индекс), исправление выполняется без риска потери данных:
ALTER INDEX [IndexName] ON dbo.[TableName] REBUILD;5. Вариант В: Аварийный ремонт (Repair Allow Data Loss)
-- Использовать только если нет резервных копий!
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB ('DatabaseName', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [DatabaseName] SET MULTI_USER; Частые вопросы (FAQ)
Что вызывает ошибку 8909 в SQL Server?
Ошибка 8909 означает, что страница была прочитана с диска, но в ее внутреннем заголовке m_pageId записан другой номер страницы. Это однозначный признак аппаратного сбоя: запись сектора не по тому смещению контроллером SAN/RAID, сбой кэша контроллера диска или фантомная запись (misdirected write).
Помогает ли REPAIR_REBUILD при ошибке 8909?
Нет. Если повреждена страница данных (Index ID 0 или 1), REPAIR_REBUILD не может гарантировать исправление. Потребуется либо PAGE RESTORE из бэкапа, либо REPAIR_ALLOW_DATA_LOSS (с удалением битой страницы).
Как защитить базу от повторения ошибки 8909?
Убедитесь, что для базы включен параметр PAGE_VERIFY CHECKSUM: ALTER DATABASE [DB] SET PAGE_VERIFY CHECKSUM; и проверьте состояние SMART дисков и кэша RAID-контроллера (BBU).
Как работает PAGE RESTORE в режиме онлайн?
В редакции SQL Server Enterprise восстановление страниц (Page Restore) выполняется онлайн: база данных остается доступной для пользователей, блокируется только восстанавливаемая страница.