MSSQL Ошибка 8939: Table error Test failed. Values are X and Y
- Журнал проверки DBCC CHECKDB содержит:
Msg 8939, Level 16, State 1: Table error: Object ID ..., index ID ..., page ID (1:98765). Test (IS_OFF (BUF_DIRTY, bp->bstat)) failed. Values are 2097152 and 0. - Внутренние инварианты структуры страницы (slot count, free space offset, torn bits) нарушены.
- Падение процессов резервного копирования (
BACKUP DATABASE ... WITH CHECKSUMзавершается с ошибкой). - Невозможно прочитать строки из регистра сведений или документов 1С.
1. Расшифровка теста, вызвавшего ошибку 8939
Текст в скобках теста указывает на поврежденную внутреннюю структуру:
m_freeData <= m_slotOffset: поврежден массив смещения слотов строк;IS_OFF (BUF_DIRTY): несоответствие битов модификации в буферном пуле;m_type == DATA_PAGE: неверный тип страницы в заголовке.
2. Проверка уровня повреждения (Clustered vs Non-Clustered)
SELECT
o.name AS TableName,
i.name AS IndexName,
i.index_id
FROM sys.indexes i
JOIN sys.objects o ON i.object_id = o.object_id
WHERE o.object_id = <Object_ID_из_ошибки> AND i.index_id = <Index_ID_из_ошибки>;3. Ремонт при повреждении некластерного индекса
-- Пересоздание индекса полностью устраняет ошибку без потери данных
ALTER INDEX [IndexName] ON dbo.[TableName] REBUILD WITH (ONLINE = OFF);4. Восстановление страницы из бэкапа (Page Restore)
RESTORE DATABASE [DatabaseName]
PAGE = '1:98765'
FROM DISK = 'C:\Backup\FullBackup.bak'
WITH NORECOVERY;
RESTORE LOG [DatabaseName]
FROM DISK = 'C:\Backup\LogBackup.trn'
WITH RECOVERY;5. Проверка дисковой подсистемы с помощью SQLIOSim
Для исключения сбоев контроллера или RAM запустите стресс-тестирование утилитой sqliosim.exe.
Частые вопросы (FAQ)
Что означает ошибка 8939?
DBCC CHECKDB выполняет десятки внутренних проверок логической консистентности каждой страницы (валидация заголовка, указателей слотов, свободной памяти). Ошибка 8939 означает, что одна из математических проверок структуры заголовка не сошлась.
Почему BACKUP DATABASE падает при наличии ошибки 8939?
Если бэкап запускается с параметром CHECKSUM, SQL Server валидирует контрольные суммы страниц при чтении. При обнаружении битой страницы создание бэкапа прерывается для предотвращения записи невалидного архива.
Можно ли выполнить бэкап базы с ошибкой 8939?
Да, можно выполнить BACKUP DATABASE ... WITH NO_CHECKSUM, CONTINUE_AFTER_ERROR, однако в таком бэкапе останутся битые страницы.
Является ли ошибка 8939 признаком сбоя оперативной памяти (ECC RAM)?
Да, если повреждение обнаружено в операциях над памятью буферного пула (BUF_DIRTY), причиной может быть сбой планок RAM или дефект контроллера памяти процессора.