Почему база данных SQL Server растет скачкообразно и как правильно мониторить объем данных 1С?

Системный администратор IT и автоматизация бизнеса
← На главную

При администрировании систем на базе 1С:Предприятие, работающих под управлением Microsoft SQL Server, администраторы часто сталкиваются с ситуацией, когда физический размер базы данных на диске увеличивается неравномерно. Например, в один день база может «вырасти» на 500 Мб или 1 Гб, а в последующие дни, несмотря на активную работу пользователей, её размер остается неизменным. В этой статье мы подробно разберем, почему так происходит, как работают механизмы выделения пространства в SQL Server и какие инструменты помогут нам видеть реальную картину заполненности базы.

Разбираемся в механизме автоувеличения (Autogrowth)

Первое, что нам необходимо понять: SQL Server не увеличивает физический файл базы данных (.mdf) или лога транзакций (.ldf) на каждый байт записанной информации. Для оптимизации производительности сервер выделяет место «порциями». Этот процесс называется Autogrowth (автоувеличение).

Рассмотрим ситуацию, описанную в обсуждении: в настройках базы установлен шаг увеличения 500 Мб. Проанализируем, что происходит внутри системы:

  1. Когда пользователи вводят данные, SQL Server заполняет уже зарезервированное, но еще пустое пространство внутри файла (так называемый White Space).
  2. Как только это свободное место заканчивается, SQL Server запрашивает у операционной системы расширение файла ровно на ту величину, которая указана в настройках (в нашем случае — 500 Мб).
  3. В этот момент размер файла в проводнике Windows и в Management Studio резко увеличивается на 500 Мб, хотя данных могло добавиться всего на 1 Кб больше лимита.
  4. Следующие несколько дней данные будут заполнять этот новый «запас», и физический размер файла меняться не будет.

Посмотрим, где именно в Microsoft SQL Server Management Studio (SSMS) можно проверить эти настройки. Нажмем правой кнопкой мыши на базу данных, выберем «Свойства» и перейдем на вкладку «Файлы». В колонке «Авторасширение / Ограничение размера» мы увидим параметры роста для каждого файла. Именно здесь задается тот самый шаг, который определяет «скачки» размера.

Почему фиксированный шаг лучше процентного?

Часто возникает вопрос: не лучше ли установить рост базы в процентах, например, 10%? Давайте проанализируем последствия. Если ваша база весит 100 Гб, то при росте в 10% сервер попытается разово выделить 10 Гб дискового пространства. Выделение такого объема — это тяжелая операция, которая может привести к:

Поэтому мы рекомендуем использовать фиксированный шаг (например, от 100 до 512 Мб в зависимости от интенсивности работы), как это и было сделано в примере из обсуждения. Это позволяет серверу предсказуемо и быстро расширять пространство.

Как увидеть реальное наполнение базы данных

Если мы хотим мониторить не просто размер файла на диске, а то, сколько места в нем реально занято данными 1С, нам нужно использовать встроенные отчеты SSMS. Рассмотрим, как это сделать:

  1. В обозревателе объектов (Object Explorer) нажмем правой кнопкой на нужную базу.
  2. Перейдем в раздел «Отчеты» -> «Стандартные отчеты».
  3. Выберем отчет «Использование диска» (Disk Usage).

В открывшемся окне мы увидим наглядную круговую диаграмму. Она покажет нам два критически важных параметра:

Влияние лога транзакций (.LDF) на рост базы

Зачастую основной причиной резкого роста является не файл данных, а файл лога транзакций. Проанализируем модель восстановления вашей базы. Если установлена модель Full (Полная), то лог транзакций будет расти до тех пор, пока вы не сделаете бэкап лога (не путать с полным бэкапом базы). В 1С при выполнении тяжелых операций, таких как переиндексация или загрузка больших объемов данных через DataExchange, лог может вырасти на десятки гигабайт за считанные минуты.

Если вам не требуется восстановление «на определенный момент времени», рассмотрите возможность переключения базы в модель Simple (Простая). В этом режиме SQL Server будет автоматически очищать и переиспользовать пространство внутри .ldf файла.

Мгновенная инициализация файлов — важная настройка

Чтобы минимизировать задержки в работе 1С при автоувеличении базы (тех самых скачках на 500 Мб), крайне важно включить Instant File Initialization (мгновенную инициализацию файлов).

Выясним, как это работает: по умолчанию SQL Server при расширении файла заполняет новое место нулями, чтобы очистить его от старых данных на диске. Это занимает время. При включенной мгновенной инициализации место выделяется мгновенно.

Для активации этой возможности необходимо:

  1. Открыть «Локальную политику безопасности» сервера Windows.
  2. Перейти в «Локальные политики» -> «Назначение прав пользователя».
  3. Найти параметр «Выполнение задач по обслуживанию томов» (Perform volume maintenance tasks).
  4. Добавить туда учетную запись, под которой запущена служба SQL Server.
  5. Перезапустить службу SQL Server.

Использование SQL-запросов для мониторинга

Для автоматизации контроля мы можем использовать системные представления. Рассмотрим пример скрипта, который выводит информацию о свободном месте во всех файлах текущей базы:


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С: почему данные удалили, а место не освободилось?

Важно помнить специфику работы СУБД: если вы удалите из 1С крупный документ или очистите регистр сведений, физический размер файла .mdf на диске не уменьшится. SQL Server просто пометит освободившиеся страницы как свободные для записи новых данных. Это нормальное поведение. Попытки постоянного использования команды SHRINKDATABASE (сжатие базы) крайне вредны, так как они вызывают жуткую фрагментацию индексов и падение производительности. К операции сжатия стоит прибегать только в исключительных случаях, например, после удаления половины данных из базы навсегда.

Таким образом, контроль роста базы заключается не в наблюдении за размером файлов в проводнике, а в правильной настройке шага автоувеличения, мониторинге свободного места внутри файлов и своевременном обслуживании логов транзакций.

← На главную