MSSQL Ошибка 8978: Page is missing linkage to previous page
- Ошибка DBCC CHECKDB:
Msg 8978, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:77889). Page is missing linkage to previous page (1:77888). - Нарушение целостности связного списка листового уровня индекса.
- Запросы с обратной сортировкой
ORDER BY ... DESCпадают с системными ошибками. - Сбои динамических списков и журналов документов в интерфейсе 1С.
1. Проверка структуры указателей через DBCC PAGE
DBCC TRACEON (3604);
-- Просмотр полей m_prevPage и m_nextPage в заголовке
DBCC PAGE ('DatabaseName', 1, 77889, 0);
DBCC TRACEOFF (3604);2. Перестроение всех индексов таблицы
Перестроение кластерного индекса заново создает все листовые страницы и пересчитывает ссылки:
-- Перестроение с сортировкой в tempdb для снижения нагрузки на поврежденный файл данных
ALTER INDEX ALL ON dbo.[TargetTable] REBUILD WITH (SORT_IN_TEMPDB = ON, ONLINE = OFF);3. Восстановление страниц из резервной копии
RESTORE DATABASE [DatabaseName]
PAGE = '1:77888, 1:77889'
FROM DISK = 'C:\Backup\Full.bak'
WITH NORECOVERY;
RESTORE LOG [DatabaseName] FROM DISK = 'C:\Backup\Log.trn' WITH RECOVERY;4. Ремонт через REPAIR_ALLOW_DATA_LOSS (Крайняя мера)
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKTABLE ('dbo.TargetTable', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [DatabaseName] SET MULTI_USER; Частые вопросы (FAQ)
Почему возникает ошибка 8978?
При операции расщепления страницы (Page Split) ядро должно атомарно обновить указатели на трех страницах. Если в момент записи происходит сбой питания, падение контроллера или потеря I/O, один из указателей остается указывать в старое место.
Всегда ли REBUILD индекса устраняет ошибку 8978?
Для некластерных индексов — всегда. Для кластерных индексов — если повреждение затронуло только ссылки на промежуточных уровнях; если затерты сами данные строк, REBUILD может завершиться ошибкой, потребовав восстановления из бэкапа.
Можно ли выполнить REBUILD ONLINE при наличии ошибки 8978?
Нет, онлайн-перестроение индекса (ONLINE = ON) требует валидного исходного дерева для создания теневой копии и завершится сбоем. Используйте ONLINE = OFF.
Как предотвратить сбои расщепления страниц?
Установите адекватный Fill Factor (например, 85-90%) для интенсивно изменяемых таблиц и индексов с Guid-ключами (характерно для 1С), чтобы снизить частоту Page Splits.