При администрировании информационных баз 1С:Предприятие на базе СУБД Microsoft SQL Server одна из самых частых проблем, с которой сталкиваются системные администраторы — это лавинообразный рост файла журнала транзакций (с расширением .ldf). Ситуация, когда сам файл базы данных 1С весит 5–10 гигабайт, а лог транзакций разрастается до 40–100 гигабайт и полностью забивает дисковое пространство, является классической.
В этой статье мы подробно разберем, почему раздувается лог транзакций, как устроена работа СУБД с журналом в различных моделях восстановления, как правильно настроить автоматическое резервное копирование и как безопасно уменьшить размер переполненного файла без ущерба для производительности системы 1С.
Журнал транзакций — это обязательный компонент любой базы данных SQL Server. В него записываются абсолютно все изменения, происходящие в базе: добавление новых документов, проведение накладных, изменение элементов справочников, удаление записей и даже внутренние технические операции СУБД (например, переиндексация таблиц).
Журнал выполняет две важнейшие функции: обеспечивает целостность данных (транзакционность ACID) и позволяет восстановить базу на определенный момент времени в случае сбоя оборудования или логической ошибки пользователя. Однако скорость заполнения и логика очистки этого файла напрямую зависят от выбранной модели восстановления (Recovery Model) базы данных. Рассмотрим две основные модели, применяемые в связке с 1С.
Выбор модели восстановления определяет, насколько защищены ваши данные от потерь и как часто вам придется обслуживать файлы СУБД.
1. Простая модель восстановления (Simple Recovery Model)
В этой модели транзакции записываются в журнал только на время их активного выполнения. Как только транзакция завершается (фиксируется в базе данных), занимаемое ею место в файле .ldf помечается как свободное и может быть повторно использовано новыми транзакциями. Лог транзакций в простой модели не растет бесконечно, он циклически перезаписывается.
2. Полная модель восстановления (Full Recovery Model)
В полной модели все транзакции сохраняются в журнале и никогда не удаляются автоматически. SQL Server хранит всю историю изменений до тех пор, пока вы принудительно не сделаете специальный бэкап журнала транзакций (Transaction Log Backup). Только после успешного создания бэкапа лога СУБД очищает («усекает») виртуальное пространство внутри файла .ldf, делая его доступным для новых записей.
Проанализируем ситуацию: если в базе данных 1С ежедневно работают хотя бы 5–10 активных пользователей, использование простой модели (Simple) несет в себе огромные риски. Потеря целого рабочего дня из-за сбоя жесткого диска или ошибки СУБД может обернуться серьезными финансовыми и временными затратами на ручное восстановление учета. Поэтому для рабочих (продуктивных) баз данных настоятельно рекомендуется использовать исключительно полную модель восстановления (Full) с грамотно настроенным расписанием резервного копирования.
Основная ошибка начинающих администраторов 1С заключается в том, что они настраивают ежедневный полный бэкап базы данных, но полностью игнорируют бэкап логов транзакций, оставляя базу в полной модели восстановления. В этом случае лог никогда не очищается. Чтобы разорвать этот замкнутый круг, необходимо внедрить следующую проверенную схему: Для автоматизации этого процесса можно использовать готовые скрипты для резервного копирования и сжатия баз данных MS SQL.
Рассмотрим подробнее, почему частый бэкап логов — это выгодно:
Если лог транзакций уже разросся до критических размеров (например, 40 ГБ при базе 5 ГБ), настройка ежечасных бэкапов сама по себе не уменьшит физический размер файла .ldf на диске. Она лишь остановит его дальнейший рост. Чтобы вернуть неиспользуемое свободное место операционной системе, необходимо выполнить процедуру сжатия (Shrink).
Разберем по шагам самый простой и безопасный алгоритм сжатия лога, который можно выполнить в среде SQL Server Management Studio (SSMS):
Важное предостережение: Никогда не делайте регулярный автоматический шринк файлов данных базы (файлов .mdf) с помощью планов обслуживания или регламентных заданий! Процедура DBCC SHRINKDATABASE или DBCC SHRINKFILE для файлов данных хаотично перемещает страницы в начало файла, полностью разрушая индексы таблиц. Это приводит к мгновенной 100%-ной фрагментации индексов, из-за чего производительность 1С упадет в несколько раз. Шринк лога транзакций (файла .ldf) делать можно, так как он не содержит индексов, но шринк файлов данных — это крайняя мера, которую стоит избегать.
Мало кто знает, что внутри файла .ldf делится на мелкие логические сегменты — виртуальные файлы логов (Virtual Log Files, VLF). Если файл лога растет автоматически мелкими порциями (например, по умолчанию на 10% или по 1 МБ), в нем образуются тысячи мелких VLF. Это явление называется внутренней фрагментацией журнала транзакций.
Большое количество VLF (более 1000) приводит к серьезным техническим проблемам:
Выясним, как правильно решить эту проблему раз и навсегда:
Если вы используете бесплатную редакцию MS SQL Server Express (например, 2008 R2 Express), то наверняка столкнулись с проблемой отсутствия встроенного планировщика задач (SQL Server Agent) и мастеров создания планов обслуживания (Maintenance Plans). Автоматизировать бэкапы силами самой СУБД в этой редакции невозможно, но решение есть.
Для настройки автоматического обслуживания баз 1С на SQL Express мы рекомендуем использовать следующую связку инструментов:
master. Эти процедуры умеют делать резервное копирование (включая бэкапы логов с автоматической очисткой устаревших архивов), проверять целостность баз данных и выполнять оптимизацию индексов..bat или .cmd, внутри которого прописывается вызов консольной утилиты sqlcmd с параметрами подключения и запуска нужной процедуры.Проанализируем пример готовой команды для резервного копирования журналов транзакций всех пользовательских баз данных с помощью скрипта Олы Халленгрена:
sqlcmd -E -S localhost\SQLEXPRESS -Q "EXECUTE [master].[dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = 'D:\Backup', @BackupType = 'LOG', @CleanupTime = 168"
В данном примере параметр @BackupType = 'LOG' указывает на бэкап журналов транзакций, а параметр @CleanupTime = 168 автоматически удаляет файлы резервных копий логов, созданные более 168 часов (7 дней) назад, предотвращая переполнение диска бэкапами.
Этот батник добавляется в Планировщик задач Windows с триггером запуска "Каждый час ежедневно". Аналогично настраивается запуск ночного полного бэкапа базы данных (параметр @BackupType = 'FULL').
Поскольку мы рассматриваем администрирование баз данных на редакции Express, необходимо помнить о жестких рамках и лимитах, которые накладывает корпорация Microsoft на бесплатные версии:
.ldf в этот лимит не входит). Если ваша база данных 1С вырастет до 10 ГБ, СУБД заблокирует любую запись данных. Для обхода этого лимита придется либо переходить на платную редакцию Standard, либо переносить часть истории в архивные базы, либо использовать свертку базы 1С..bak и .trn в архивы 7-Zip или ZIP сразу после их создания.В процессе обсуждения обслуживания СУБД часто поднимается вопрос о регулярной переиндексации (Rebuild) и обновлении статистик. Это важнейшие операции, без которых базы данных 1С начинают работать крайне медленно. Однако здесь кроется еще одна причина внезапного взрывного роста журнала транзакций.
Любая операция перестройки индексов (ALTER INDEX REBUILD) является полностью протоколируемой в полной модели восстановления. Когда SQL Server перестраивает индекс таблицы размером 5 ГБ, он записывает все эти изменения в журнал транзакций. В итоге лог транзакций мгновенно увеличивается на те самые 5 ГБ. Для снижения нагрузки на лог подойдёт скрипт адаптивного обновления индексов MS SQL.
Выясним, как правильно совместить эти процессы:
.ldf, которое заняла процедура реиндексации, и не даст файлу раздуться еще сильнее при последующей работе пользователей.ALTER INDEX REORGANIZE) вместо тяжелой перестройки (Rebuild), если фрагментация составляет менее 30%. Реорганизация индексов создает значительно меньшую нагрузку на журнал транзакций.Мы подробно разобрали основные аспекты работы с журналом транзакций в MS SQL Server при интеграции с решениями 1С:Предприятие. Сформулируем финальные практические рекомендации для создания надежной и быстрой системы:
sqlcmd.