При администрировании систем на базе 1С:Предприятие, работающих под управлением Microsoft SQL Server, администраторы часто сталкиваются с ситуацией, когда физический размер базы данных на диске увеличивается неравномерно. Например, в один день база может «вырасти» на 500 Мб или 1 Гб, а в последующие дни, несмотря на активную работу пользователей, её размер остается неизменным. В этой статье мы подробно разберем, почему так происходит, как работают механизмы выделения пространства в SQL Server и какие инструменты помогут нам видеть реальную картину заполненности базы.
Первое, что нам необходимо понять: SQL Server не увеличивает физический файл базы данных (.mdf) или лога транзакций (.ldf) на каждый байт записанной информации. Для оптимизации производительности сервер выделяет место «порциями». Этот процесс называется Autogrowth (автоувеличение).
Рассмотрим ситуацию, описанную в обсуждении: в настройках базы установлен шаг увеличения 500 Мб. Проанализируем, что происходит внутри системы:
Management Studio резко увеличивается на 500 Мб, хотя данных могло добавиться всего на 1 Кб больше лимита.Посмотрим, где именно в Microsoft SQL Server Management Studio (SSMS) можно проверить эти настройки. Нажмем правой кнопкой мыши на базу данных, выберем «Свойства» и перейдем на вкладку «Файлы». В колонке «Авторасширение / Ограничение размера» мы увидим параметры роста для каждого файла. Именно здесь задается тот самый шаг, который определяет «скачки» размера.
Часто возникает вопрос: не лучше ли установить рост базы в процентах, например, 10%? Давайте проанализируем последствия. Если ваша база весит 100 Гб, то при росте в 10% сервер попытается разово выделить 10 Гб дискового пространства. Выделение такого объема — это тяжелая операция, которая может привести к:
Поэтому мы рекомендуем использовать фиксированный шаг (например, от 100 до 512 Мб в зависимости от интенсивности работы), как это и было сделано в примере из обсуждения. Это позволяет серверу предсказуемо и быстро расширять пространство.
Если мы хотим мониторить не просто размер файла на диске, а то, сколько места в нем реально занято данными 1С, нам нужно использовать встроенные отчеты SSMS. Рассмотрим, как это сделать:
В открывшемся окне мы увидим наглядную круговую диаграмму. Она покажет нам два критически важных параметра:
Зачастую основной причиной резкого роста является не файл данных, а файл лога транзакций. Проанализируем модель восстановления вашей базы. Если установлена модель Full (Полная), то лог транзакций будет расти до тех пор, пока вы не сделаете бэкап лога (не путать с полным бэкапом базы). В 1С при выполнении тяжелых операций, таких как переиндексация или загрузка больших объемов данных через DataExchange, лог может вырасти на десятки гигабайт за считанные минуты.
Если вам не требуется восстановление «на определенный момент времени», рассмотрите возможность переключения базы в модель Simple (Простая). В этом режиме SQL Server будет автоматически очищать и переиспользовать пространство внутри .ldf файла.
Чтобы минимизировать задержки в работе 1С при автоувеличении базы (тех самых скачках на 500 Мб), крайне важно включить Instant File Initialization (мгновенную инициализацию файлов).
Выясним, как это работает: по умолчанию SQL Server при расширении файла заполняет новое место нулями, чтобы очистить его от старых данных на диске. Это занимает время. При включенной мгновенной инициализации место выделяется мгновенно.
Для активации этой возможности необходимо:
Для автоматизации контроля мы можем использовать системные представления. Рассмотрим пример скрипта, который выводит информацию о свободном месте во всех файлах текущей базы:
SELECT
name AS FileName,
size/128.0 AS CurrentSize_MB,
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS FreeSpace_MB,
CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS UsedSpace_MB,
(CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0) / (size/128.0) * 100 AS PercentUsed
FROM sys.database_files;
Этот запрос позволяет получить точные цифры без использования графического интерфейса. Мы можем настроить регламентное задание в 1С или SQL Agent, которое будет записывать эти данные в отдельную таблицу для построения графиков роста.
Важно помнить специфику работы СУБД: если вы удалите из 1С крупный документ или очистите регистр сведений, физический размер файла .mdf на диске не уменьшится. SQL Server просто пометит освободившиеся страницы как свободные для записи новых данных. Это нормальное поведение. Попытки постоянного использования команды SHRINKDATABASE (сжатие базы) крайне вредны, так как они вызывают жуткую фрагментацию индексов и падение производительности. К операции сжатия стоит прибегать только в исключительных случаях, например, после удаления половины данных из базы навсегда.
Таким образом, контроль роста базы заключается не в наблюдении за размером файлов в проводнике, а в правильной настройке шага автоувеличения, мониторинге свободного места внутри файлов и своевременном обслуживании логов транзакций.