Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL 8978 1С:Предприятие и СУБД

MSSQL Ошибка 8978: Page is missing linkage to previous page

Обновлено: 25.08.2026 · Официальная документация ↗
  • Ошибка 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;
💡 Практика специалистов: Для таблиц 1С с первичными ключами типа UNIQUEIDENTIFIER (ссылки _IDRRef) всегда поддерживайте регламент дефрагментации и перестроения индексов с FILLFACTOR = 85 для минимизации риска появления ошибок 8976/8978.

Частые вопросы (FAQ)

Почему возникает ошибка 8978?

При операции расщепления страницы (Page Split) ядро должно атомарно обновить указатели на трех страницах. Если в момент записи происходит сбой питания, падение контроллера или потеря I/O, один из указателей остается указывать в старое место.

Всегда ли REBUILD индекса устраняет ошибку 8978?

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

Можно ли выполнить REBUILD ONLINE при наличии ошибки 8978?

Нет, онлайн-перестроение индекса (ONLINE = ON) требует валидного исходного дерева для создания теневой копии и завершится сбоем. Используйте ONLINE = OFF.

Как предотвратить сбои расщепления страниц?

Установите адекватный Fill Factor (например, 85-90%) для интенсивно изменяемых таблиц и индексов с Guid-ключами (характерно для 1С), чтобы снизить частоту Page Splits.

Полезные материалы
Рекомендуем