При работе с базами данных 1С:Предприятие на Microsoft SQL Server администраторы могут столкнуться с цепочкой критических ошибок: «Превышено время ожидания кратковременной блокировки буфера для страницы» (код ошибки 845), «логическая ошибка ввода-вывода, связанная с согласованностью: неправильная контрольная сумма» (ошибка 824) и аварийным падением процессов СУБД с отсылкой к файлу qxcntxt.cpp. Подобные симптомы свидетельствуют о физическом или логическом повреждении базы данных, а также о скрытых проблемах аппаратного обеспечения.
Разберем подробно причины возникновения таких сбоев и пошаговый план восстановления работоспособности информационной базы 1С.
Выясним причину, почему СУБД выдает взаимосвязанные сообщения об ошибках:
tempdb.Для начала определим, какая именно таблица или индекс базы данных пострадали. В тексте ошибки SQL Server выводит координаты поврежденной страницы (например, 1:505206, где 1 — номер файла, а 505206 — номер страницы).
Проанализируем системную таблицу поврежденных страниц и выясним имя объекта с помощью запросов в SQL Server Management Studio (SSMS):
SELECT * FROM msdb.dbo.suspect_pages;
Чтобы получить идентификатор объекта, выполним команду проверки заголовка страницы:
DBCC PAGE (ИмяБД, 1, 505206, 0) WITH TABLERESULTS;
В полученном результате найдем строку Metadata: ObjectId. Зная номер объекта, определим имя таблицы или индекса 1С:
SELECT OBJECT_NAME(НомерОбъекта);
Рассмотрим различные сценарии устранения повреждений в зависимости от типа поврежденного объекта и доступных резервных копий.
Сценарий А. Поврежден некластерный индекс
Если поврежденная страница относится к вторичному индексу, а не к самой таблице с данными (Clustered Index / Heap), восстановить базу можно без потери информации простым перестроением индекса:
ALTER INDEX ИмяИндекса ON ИмяТаблицы REBUILD;
Сценарий Б. Восстановление отдельной страницы из бэкапа
Если база данных использует полную модель восстановления (Full Recovery Model) и ведется регулярное архивирование журнала транзакций, можно восстановить только битую страницу без отката всей базы:
RESTORE DATABASE ИмяБД PAGE = '1:505206'
FROM DISK = 'C:\Backup\Full.bak'
WITH NORECOVERY;
-- Далее последовательно накатываются все последующие резервные копии журналов транзакций
Сценарий В. Аварийное исправление через DBCC CHECKDB
Если резервной копии нет, а быстрое исправление REPAIR_FAST выдает критическую ошибку, применим аварийный режим с возможной потерей поврежденных строк:
ALTER DATABASE ИмяБД SET EMERGENCY;
ALTER DATABASE ИмяБД SET SINGLE_USER;
DBCC CHECKDB (ИмяБД, REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE ИмяБД SET MULTI_USER;
Важно: Режим REPAIR_ALLOW_DATA_LOSS физически удаляет нечитаемые страницы, что может привести к потере части записей или нарушению ссылочной целостности в 1С.
Если сбой произошел в периферийном узле РБД, наиболее надежным и быстрым решением является пересоздание узла:
Если резервные копии повреждаются при копировании по локальной сети или на диске внезапно появляются битые файлы, обязательно выполним диагностику оборудования:
TCP Checksum Offload, Large Send Offload), так как некорректная работа драйверов сетевой карты может повреждать файлы при передаче по сети.