При выполнении ночных регламентных процедур в Microsoft SQL Server администраторы 1С нередко сталкиваются с ситуацией, когда план обслуживания выполняется аномально долго, зависает на этапе сбора статистики по определенным таблицам или прерывается принудительной перезагрузкой операционной системы. В журналах SQL Server при этом можно обнаружить дампы процессов на командах вида UPDATE STATISTICS [dbo].[_AccumRgChngRXXXX] WITH FULLSCAN, а после перезапуска пользователи сталкиваются с зависанием проведения документов и исчезновением незафиксированных данных.
Разберем по шагам, что представляют собой эти таблицы, почему регламентное задание дает сбой и как оптимизировать обслуживание баз данных 1С.
Префикс _AccumRgChngR (Accumulation Register Changes) принадлежит служебным таблицам 1С:Предприятия, которые отвечают за регистрацию изменений регистров накопления для планов обмена (механизмы РИБ или универсального обмена данными). Число в конце имени (например, 7374) — это внутренний идентификатор объекта метаданных в конкретной базе данных.
Для сопоставления имени физической таблицы в СУБД с объектом конфигурации воспользуемся встроенной функцией платформы ПолучитьСтруктуруХраненияБазыДанных(). Выполним программный поиск нужной таблицы:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из СтруктураБД Цикл
Если Стр.ИмяТаблицыХранения = "_AccumRgChngR7374" Тогда
Сообщить("Имя метаданных: " + Стр.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
Проанализируем основные факторы, которые приводят к многочасовой работе регламентных задач и сбоям:
UPDATE STATISTICS ... WITH FULLSCAN на гигантской таблице требует огромных ресурсов ввода-вывода и оперативной памяти, что приводит к многочасовому зависанию.FULLSCAN) процесс натыкается на поврежденный сектор, генерируя аварийный дамп.Рассмотрим механизм проведения документов: при записи движений по регистру накопления платформа 1С обязана параллельно внести запись о модификации в соответствующую таблицу _AccumRgChngR для каждого зарегистрированного узла плана обмена. Если эта служебная таблица заблокирована долгим сбором статистики или перегружена, транзакция проведения зависает на блокировках.
Если в этот момент происходит перезагрузка операционной системы или службы SQL Server, запускается процедура Recovery (восстановление базы данных). В процессе восстановления СУБД выполняет две фазы:
Документ, который пользователь начал проводить непосредственно перед перезагрузкой или во время сбойного состояния, не успел зафиксировать транзакцию. При восстановлении СУБД вернула базу к целостному состоянию, поэтому незавершенный документ закономерно «пропал» из информационной базы.
Разберем комплекс мер, необходимых для стабилизации работы сервера.
Для исключения повреждения дисковой подсистемы и структуры страниц данных выполним диагностику базы в среде SQL Server:
DBCC CHECKDB ('ИмяВашейБазыДанных') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Если команда обнаружит ошибки повреждения индексов, выполняем их перестроение (REBUILD), а при логическом повреждении страниц данных — восстановление из последней рабочей резервной копии.
Выясним состояние узлов планов обмена:
// Очистка регистрации изменений по конкретному регистру накопления
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Метаданные.РегистрыНакопления.ИмяРегистра);
Откажемся от сплошного сканирования всей базы методом FULLSCAN в пользу интеллектуального обслуживания:
sys.dm_db_stats_properties).SAMPLE ... PERCENT) вместо 100% сканирования.