MSSQL Ошибка 8941: Table error Slot offset is bad
- Журнал проверки целостности сообщает:
Msg 8941, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:45678). Test (offset >= pRecs && offset <= dEnd) failed. Slot 12, offset 0x1f40 is bad. - Массив смещений строк в конце страницы указывает на область вне диапазона полезной нагрузки.
- Запросы, выполняющие Index Scan или Table Scan, аварийно завершаются.
- 1С:Предприятие выдает ошибку при обращении к определенному объекту метаданных.
1. Понимание физической структуры слотов страницы
В конце каждой 8KB страницы SQL Server находится массив смещений (Slot Array), растущий справа налево, где каждый 2-байтный слот указывает на смещение начала строки. Ошибка 8941 означает, что значение указателя слота вышло за пределы заголовка страницы (96 байт) или указывает в область свободного пространства.
2. Анализ массива слотов через DBCC PAGE
DBCC TRACEON (3604);
-- Вывод информации о слотах страницы
DBCC PAGE ('DatabaseName', 1, 45678, 2);
DBCC TRACEOFF (3604);3. Исправление при повреждении индекса
-- Если поврежден некластерный индекс:
ALTER INDEX ALL ON dbo.[AffectedTable] REBUILD;4. Восстановление поврежденной страницы из бэкапа
RESTORE DATABASE [DatabaseName]
PAGE = '1:45678'
FROM DISK = 'C:\Backup\Full.bak'
WITH NORECOVERY;
RESTORE LOG [DatabaseName] FROM DISK = 'C:\Backup\Log1.trn' WITH RECOVERY;5. Аварийное исправление при отсутствии бэкапа
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- REPAIR_ALLOW_DATA_LOSS удалит страницу со сломанным слотом
DBCC CHECKDB ('DatabaseName', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [DatabaseName] SET MULTI_USER; Частые вопросы (FAQ)
Почему возникает ошибка 'Slot offset is bad'?
Смещение слота повреждается в результате битовых сбоев (bit-rot), сбоев кэша контроллера накопителя при сбросе 'грязных' страниц на диск или физической деградации ячеек SSD.
Сколько строк теряется при ремонте страницы с ошибкой 8941?
При выполнении REPAIR_ALLOW_DATA_LOSS удаляется вся страница (8 КБ), содержащая обычно от десятков до сотен строк в зависимости от ширины строки таблицы.
Можно ли скопировать уцелевшие строки со страницы со сломанным слотом?
С помощью DBCC PAGE в режиме 3 можно увидеть шестнадцатеричный дамп уцелевших строк и восстановить их вручную через скрипты парсинга Hex-дампа.
Как избежать повреждения слотов в будущем?
Включите CHECKSUM для всех баз, регулярно выполняйте DBCC CHECKDB с параметром PHYSICAL_ONLY и настройте резервное копирование журналов транзакций (каждые 10-15 минут).