Как уменьшить размер базы данных MS SQL, если стандартное сжатие и выгрузка в .dt не помогают?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда база данных 1С внезапно увеличивается в объеме в несколько раз (например, с 20 Гб до 60 Гб) и при этом категорически отказывается сжиматься стандартными средствами SQL Server Management Studio (SSMS), является довольно распространенной. Особенно часто это происходит после миграции базы между серверами или после выполнения массовых операций с данными. Рассмотрим подробно, почему это происходит и какими методами можно вернуть базе нормальный размер.

Анализируем причины разрастания: где именно занято место?

Прежде чем приступать к активным действиям по сжатию, проанализируем ситуацию. Если выгрузка базы в формат .dt и последующая загрузка в новую пустую базу не меняют размер файла .mdf, значит, проблема не в «дырках» (пустых страницах) внутри файла, а в том, что 1С считает эти данные полезными (в этом случае поможет универсальное сжатие базы). Выясним, что именно занимает место в базе.

Разберем основные шаги по диагностике, используя отчеты, показывающие размер базы 1С:

  1. Проверка топ-таблиц по занимаемому месту. Используя SQL Базомер или стандартные средства SSMS (правой кнопкой на базу данных -> Отчеты -> Стандартные отчеты -> Дисковое пространство по таблицам). Проанализируем, какие таблицы лидируют, проведя анализ размера таблицы SQL базы 1С. Если это _InfoReg... (регистры сведений) или _AccumReg... (регистры накопления), значит, в базу действительно записано много данных. Если лидируют системные таблицы Config или Files, проблема в раздутом кэше конфигурации или истории расширений.
  2. Проверка итогов. Выясним, нет ли в базе итогов за «будущие» периоды (например, за 3999 год), что часто случается при ошибках в коде. В 1С выполним операцию Управление итогами и проверим актуальность периодов.
  3. Проверка неиспользуемого пространства (Unused space). Посмотрим в свойствах базы, какой объем занимает Data Space и сколько из него реально свободно.

Метод 1: Принудительное увеличение с последующим сжатием

Рассмотрим парадоксальный, но эффективный метод, который помогает в случаях, когда SQL Server «зацикливается» на текущем распределении страниц. Суть метода заключается в том, чтобы сначала вручную увеличить логический размер файла до значения, превышающего текущий физический размер, а затем запустить процедуру SHRINKFILE с параметром 0.

Выполним следующие шаги в окне запросов SQL:

Сначала определим логическое имя файла базы (это не путь к файлу, а имя внутри SQL). Обычно оно совпадает с именем базы, но лучше проверить в свойствах. Далее выполним скрипт:


-- Устанавливаем размер файла чуть больше текущего (например, до 70 Гб, если база 60 Гб)
ALTER DATABASE [ИмяВашейБазы] 
MODIFY FILE ( NAME = 'Логическое_Имя_Файла' , SIZE = 70000 MB );
GO

-- Сразу после этого выполняем сжатие до минимально возможного размера
DBCC SHRINKFILE (N'Логическое_Имя_Файла' , 0);
GO

Этот алгоритм заставляет SQL Server пересчитать карту распределения страниц (IAM) и часто позволяет «сдвинуть» процесс сжатия с мертвой точки.

Метод 2: Манипуляция с файловыми группами (перенос данных)

Если один файл базы данных поврежден на логическом уровне или сильно фрагментирован в части LOB-данных (хранилищ значений), проанализируем вариант с добавлением второго файла в ту же файловую группу. Рассмотрим пошагово, как это сделать:

  1. Зайдем в Свойства базы данных на закладку Файлы.
  2. Добавим новый файл данных в ту же файловую группу (обычно PRIMARY).
  3. В окне сжатия (Shrink) выберем третий вариант: «Перенести данные в другие файлы той же файловой группы» (Empty file by migrating data to other files in the same filegroup).
  4. После того как первый файл будет очищен, его можно удалить из свойств базы.
  5. При необходимости процедуру можно повторить в обратном порядке или оставить новый файл как основной.

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

Метод 3: Очистка LOB-данных и реорганизация индексов

В 1С многие данные (картинки, файлы, версии конфигураций) хранятся в полях типа VARBINARY(MAX) или NTEXT. Обычный REBUILD индекса может не освобождать место, которое было зарезервировано под эти объекты. Выясним, поможет ли нам принудительное сжатие больших объектов.

Рассмотрим команду для реорганизации индексов с параметром сжатия LOB:


-- Применяем ко всем индексам таблицы, которая занимает больше всего места
ALTER INDEX ALL ON [Имя_Таблицы_1С] 
REORGANIZE WITH (LOB_COMPACTION = ON);
GO

Важно: В отличие от REBUILD, команда REORGANIZE выполняется в режиме онлайн и не блокирует таблицу целиком, но требует больше времени для завершения. Она эффективно «схлопывает» пустое место внутри страниц, занятых двоичными данными.

Метод 4: Проверка режима восстановления и транзакционного лога

Иногда место не освобождается из-за того, что транзакционный лог или механизмы обеспечения целостности (например, ADR — Accelerated Database Recovery в SQL 2019+) держат старые версии строк. Проанализируем алгоритм переключения режима восстановления:

  1. Установим режим восстановления Full (Полный).
  2. Выполним бэкап лога транзакций.
  3. Вернем режим восстановления Simple (Простой).
  4. Повторим попытку DBCC SHRINKDATABASE или DBCC SHRINKFILE.

Также стоит проверить наличие зависших транзакций, которые мешают очистке Ghost Records (записей-призраков). Посмотрим на результат выполнения команды:

DBCC OPENTRAN;

Если команда показывает транзакцию, которая висит уже несколько дней, ее необходимо завершить (или «убить» процесс через KILL), иначе SQL не сможет физически удалить помеченные к удалению данные из файла.

Метод 5: Проверка таблицы Files в 1С

Если после всех манипуляций в SQL база все еще огромная, а .dt тоже получается подозрительно большим, разберем ситуацию внутри 1С. Часто причиной является таблица Files, где хранятся временные данные обновлений. Попробуем очистить ее средствами самой платформы:

  1. Запустим 1С в режиме Конфигуратор.
  2. Выполним Администрирование -> Тестирование и исправление.
  3. Обязательно выберем пункт «Сжатие таблиц» и «Реиндексация таблиц».

Это пересоберет внутренние таблицы 1С и удалит помеченные на удаление объекты, которые могли попасть в файл выгрузки .dt.

Подведение итогов

Проанализировав все способы, мы видим, что решение проблемы «неудаляемого» места часто лежит в плоскости принудительного изменения структуры файла или очистки специфических типов данных (LOB). Помните, что любые операции с SHRINK вызывают сильную фрагментацию индексов. После успешного сжатия файла обязательно выполните REBUILD всех индексов, чтобы восстановить производительность системы.

← На главную