MSSQL Ошибка 8942: Table error Slot offset overlaps
- Ошибка DBCC CHECKDB:
Msg 8942, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:33445). Test (offset <= pPrevSlot->offset) failed. Slot 5, offset 0x0120 overlaps with previous slot. - Два разных слота в массиве указывают на перекрывающиеся диапазоны памяти строки.
- Сбой чтения данных и искажение значений колонок в строках таблицы.
- Исключения при выполнении регламентных процедур 1С:Предприятие.
1. Идентификация поврежденной таблицы и типа индекса
SELECT
s.name AS SchemaName,
o.name AS TableName,
i.name AS IndexName,
i.type_desc
FROM sys.indexes i
JOIN sys.objects o ON i.object_id = o.object_id
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE o.object_id = <Object_ID> AND i.index_id = <Index_ID>;2. Перестроение индекса (если Index ID > 1)
ALTER INDEX [IndexName] ON [SchemaName].[TableName] REBUILD;3. Восстановление страницы из бэкапа (Page Restore)
-- Безопасное восстановление страницы без простоя всей базы
RESTORE DATABASE [DatabaseName]
PAGE = '1:33445'
FROM DISK = 'C:\Backup\Full.bak'
WITH NORECOVERY;
RESTORE LOG [DatabaseName] FROM DISK = 'C:\Backup\Log1.trn' WITH RECOVERY;4. Попытка чтения неповрежденных строк через фильтрацию
-- Создание дубликата таблицы и копирование строк с условием по первичному ключу
SELECT * INTO dbo.Recovered_Table FROM dbo.Original_Table WHERE PrimaryKeyID < 1000;
INSERT INTO dbo.Recovered_Table SELECT * FROM dbo.Original_Table WHERE PrimaryKeyID > 2500;5. Аварийный ремонт DBCC CHECKDB
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB ('DatabaseName', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [DatabaseName] SET MULTI_USER; Частые вопросы (FAQ)
Что означает 'Slot offset overlaps' в ошибке 8942?
Это логическая коллизия в массиве слотов: начало одной строки по смещению находится внутри тела соседней строки. Это происходит при повреждении байтов массива слотов или заголовка строки.
Может ли DBCC CHECKDB с флагом REPAIR_REBUILD исправить ошибку 8942?
Нет. REPAIR_REBUILD исправляет только некластерные индексы. Если перекрытие слотов произошло в кластерном индексе или куче (Heap), восстановить страницу без потери данных можно только из резервной копии.
Как проверить, повреждены ли другие таблицы в базе?
Выполните полную проверку базы: DBCC CHECKDB ('DatabaseName') WITH NO_INFOMSGS, ALL_ERRORMSGS, EXTENDED_LOGICAL_CHECKS.
Почему нельзя оставлять ошибку 8942 без исправления?
Чтение поврежденной страницы приводит к чтению 'мусорных' данных (ghost data), искажению финансовых отчетов и потенциальному падению экземпляра SQL Server в Access Violation при сканировании.