MSSQL Ошибка 8976: Table error Page was not seen in the scan
- Отчет DBCC CHECKDB:
Msg 8976, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:11223). Page was not seen in the scan although its parent and previous refer to it. - Вместе с 8976 регистрируется парная ошибка
Msg 8978. - Разрыв двухсторонней цепочки страниц (Previous Page / Next Page) на листовом уровне B-дерева.
- Запросы, выполняющие сортировку и сканирование по диапазону ключей, зависают или возвращают неполный результат.
1. Определение затронутого индекса
SELECT
OBJECT_NAME(i.object_id) AS TableName,
i.name AS IndexName,
i.index_id,
i.type_desc
FROM sys.indexes i
WHERE i.object_id = <Object_ID> AND i.index_id = <Index_ID>;2. Решение для некластерных индексов (Index ID > 1)
Если ошибка локализована в некластерном индексе, полное перестроение полностью восстанавливает B-дерево:
ALTER INDEX [IndexName] ON dbo.[TableName] REBUILD WITH (ONLINE = OFF);3. Решение для кластерных индексов (Index ID = 1) и куч
Если поврежден кластерный индекс, попробуйте выполнить Page Restore из резервной копии:
RESTORE DATABASE [DatabaseName]
PAGE = '1:11223'
FROM DISK = 'C:\Backup\FullBackup.bak'
WITH NORECOVERY;
RESTORE LOG [DatabaseName] FROM DISK = 'C:\Backup\Log.trn' WITH RECOVERY;4. Аварийный ремонт связей дерева через CHECKDB
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB ('DatabaseName', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [DatabaseName] SET MULTI_USER; Частые вопросы (FAQ)
Что означает ошибка 8976?
В индексах B-Tree все страницы на листовом уровне связаны двунаправленным списком (указатели m_prevPage и m_nextPage). Ошибка 8976 означает, что родительская страница ссылается на страницу X, но при линейном сканировании уровня страница X не была найдена или выпала из IAM-карты.
Почему ошибка 8976 часто идет в паре с 8978?
Ошибка 8978 сообщает о потере обратной ссылки (missing linkage to previous page). Обе ошибки описывают один и тот же разрыв цепочки страниц с двух разных сторон обхода дерева.
Можно ли исправить ошибку 8976 простым перезапуском службы SQL?
Нет. Повреждение указателей страниц находится в постоянных структурах файлов данных на диске и требует явного перестроения индексов или наката бэкапа.
Каковы основные причины возникновения ошибки 8976?
Сбои в работе драйверов multipathing (MPIO), микропрограммы SAN-хранилища, некорректное расщепление страниц (Page Split) при параллельной записи под высокой нагрузкой.