К статье
Практический материал

Администрирование · 11 мин

Как сжать SQL-базу 1С: практическое руководство

Как безопасно сжать SQL-базу 1С: очистка журнала регистрации, shrink файлов MDF и LDF, перестроение индексов, типичные ошибки и проверка результата.

База 1С на MS SQL Server со временем растёт не только за счёт реальных данных, но и из-за журнала транзакций, удалённых объектов, версий изменений и фрагментированных индексов. Файл с данными (MDF) может занимать десятки гигабайт, хотя фактических данных в нём — в разы меньше. Сжатие базы позволяет вернуть свободное место на диске, ускорить создание резервных копий и упростить перенос базы между серверами.

Перед любыми действиями важно понимать: сжатие (shrink) — это не повседневная операция обслуживания, а разовая процедура после массовых удалений или очистки. Регулярное сжатие вредит производительности, потому что фрагментирует индексы и заставляет SQL Server заново расширять файлы при росте данных. Правильный подход — сначала удалить лишнее на уровне 1С, затем перестроить индексы и только после этого уменьшать физический размер файлов.

Ниже разобран полный цикл работ: от анализа занятого места до проверки результата. Все действия выполняются на тестовой копии или после создания резервной копии рабочей базы.

Когда базе действительно нужно сжатие

Не каждая большая база требует уменьшения. SQL Server резервирует место внутри файлов под будущие данные, и это нормально. Сжатие оправдано в конкретных ситуациях: после удаления большого объёма данных (свертка базы, очистка журнала регистрации, удаление старых документов), после переноса базы, когда нужно сократить размер бэкапа, или когда диск сервера физически заполнен.

Оценить ситуацию помогает отчёт о распределении места. В SQL Server Management Studio (SSMS) щёлкните правой кнопкой по базе, выберите «Отчёты» → «Стандартные отчёты» → «Использование дискового пространства». Отчёт покажет, сколько места занято данными, сколько зарезервировано и сколько реально свободно внутри файлов.

Свободного места внутри MDF более 30–40%Есть смысл сжимать

Выполните очистку данных и shrink файла данных

LDF в десятки раз больше MDFРаздут журнал транзакций

Проверьте модель восстановления и выполните усечение журнала

База растёт равномерно без удаленийСжатие бесполезно

Место снова заполнится данными, shrink только навредит

Бэкап занимает почти столько же, сколько базаПустого места мало

Сначала ищите реальный мусор: версии, журналы, дубли

Подготовка: резервная копия и анализ

Первый обязательный шаг — полная резервная копия базы средствами SQL Server. Не выгрузка DT из конфигуратора, а именно полный бэкап: при сбое во время shrink восстановиться из него быстрее и надёжнее. Убедитесь, что копия создана успешно и лежит на отдельном диске или сетевом ресурсе.

Далее найдите, что занимает место. Запрос к системным представлениям покажет самые большие таблицы базы. В 1С типичные «тяжёлые» объекты — журнал регистрации, регистры сведений с версионированием, таблицы изменений для планов обмена, хранилища двоичных данных (файлы, картинки). Зная конкретные таблицы, вы поймёте, что чистить в первую очередь.

sql
SELECT TOP 20 t.NAME AS TableName, SUM(a.total_pages) * 8 / 1024 AS SizeMB FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id JOIN sys.allocation_units a ON p.partition_id = a.container_id GROUP BY t.NAME ORDER BY SizeMB DESC

Очистка данных средствами 1С

Сжимать файл, полный мусорных данных, бессмысленно — сначала мусор нужно удалить. Основные направления очистки в типовых конфигурациях:

  • Журнал регистрации. В конфигураторе: «Администрирование» → «Журнал регистрации» → кнопка «Сократить». Укажите дату, до которой события не нужны. На больших базах это освобождает гигабайты.
  • Помеченные на удаление объекты. В режиме 1С:Предприятие запустите «Удаление помеченных объектов» (раздел «Администрирование»). Пометка не удаляет данные физически — только эта операция реально освобождает место.
  • Регистрация изменений для обменов. Если используются планы обмена, после успешной синхронизации удаляйте регистрацию изменений — таблицы изменений растут очень быстро.
  • Версии объектов и история данных. Если включено версионирование, настройте срок хранения версий и очистите старые.
  • Свертка базы. Для старых периодов используйте штатную обработку свертки — она заменяет документы прошлых лет остатками на дату свертки.

Все операции удаления выполняйте монопольно или в период минимальной нагрузки. После удаления данные внутри MDF-файла превращаются в пустое место — именно его и заберёт shrink.

Перестроение индексов перед сжатием

После массового удаления индексы становятся фрагментированными и занимают больше места, чем нужно. Перестроение индексов (rebuild) уплотняет данные и само по себе сокращает занимаемый объём, а заодно ускоряет последующее сжатие файла.

Запустите перестроение для всей базы ночью или в выходной. Можно использовать стандартный план обслуживания SQL Server (Maintenance Plan с задачей Rebuild Index) или скрипт. Обратите внимание: rebuild требует свободного места, сопоставимого с размером перестраиваемых индексов, поэтому при полностью забитом диске сначала освободите место другими способами.

Порядок действий
  1. 1
    Создайте полную резервную копию базы на отдельный носитель
  2. 2
    Проанализируйте самые большие таблицы и очистите данные средствами 1С
  3. 3
    Перестройте индексы базы (Rebuild Index) в нерабочее время
  4. 4
    Усеките журнал транзакций через простую модель восстановления
  5. 5
    Выполните Shrink файла данных с указанием целевого свободного места
  6. 6
    Повторно перестройте индексы после shrink и проверьте работу базы

Сжатие журнала транзакций (LDF)

Чаще всего проблема — не файл данных, а раздутый журнал транзакций. Это происходит, когда база работает в полной модели восстановления (Full), но резервные копии журнала не делаются: SQL Server не может очистить журнал и накапливает в нём все операции.

Если восстановление на произвольный момент времени вам не требуется, порядок действий такой: переведите базу в простую модель восстановления (свойства базы → «Параметры» → «Модель восстановления» → «Простая»), затем выполните сжатие файла журнала: правой кнопкой по базе → «Задачи» → «Сжать» → «Файлы» → выберите тип «Журнал». После сжатия верните полную модель восстановления, если она нужна, и сразу сделайте полный бэкап — иначе цепочка восстановления будет нарушена.

Если полная модель восстановления нужна постоянно, настройте регулярное резервное копирование журнала транзакций — это штатный механизм, который не даёт LDF-файлу расти бесконечно.

sql
ALTER DATABASE [ИмяБазы] SET RECOVERY SIMPLE; DBCC SHRINKFILE (N'ИмяЛогическогоФайлаЖурнала', 1024); ALTER DATABASE [ИмяБазы] SET RECOVERY FULL;

Сжатие файла данных (MDF)

После очистки и перестроения индексов можно уменьшать сам файл данных. В SSMS: правой кнопкой по базе → «Задачи» → «Сжать» → «Файлы», тип файла — «Данные». Выберите действие «Реорганизовать страницы перед освобождением неиспользуемого места» и укажите, сколько свободного места оставить после сжатия — разумно оставить 10–20% под рост данных, чтобы файл не начал расширяться сразу после операции.

Операция может занять часы на больших базах и существенно нагружает дисковую подсистему. Прогресс виден в окне выполнения. Не запускайте shrink в рабочее время и не прерывайте его. Альтернатива графическому интерфейсу — команда DBCC SHRINKFILE с указанием целевого размера в мегабайтах: она даёт больше контроля и работает предсказуемее, чем SHRINKDATABASE.

После сжатия индексы снова фрагментируются — shrink перемещает страницы данных без учёта их порядка. Поэтому завершающий шаг — повторное перестроение индексов. Да, это кажется парадоксальным, но именно поэтому shrink делают редко и только при реальной необходимости.

Типичные ошибки
01
Включённый автосжимание (AutoShrink) — база постоянно сжимается и расширяется, индексы деградируют, производительность падает
02
Shrink без предварительной очистки данных — файл не уменьшается, потому что свободного места внутри нет
03
Сжатие журнала при полной модели восстановления без бэкапа журнала — shrink не освобождает место, администратор считает операцию нерабочей
04
Прерывание shrink кнопкой отмены или перезагрузкой сервера — риск повреждения базы и долгого отката транзакции
05
Отсутствие rebuild после shrink — запросы начинают работать медленнее, чем до сжатия

Проверка результата и дальнейшее обслуживание

После всех операций сверьте размеры файлов на диске с ожидаемыми, повторно запустите отчёт об использовании пространства и проверьте, что база открывается в 1С:Предприятии без ошибок. Выполните тестирование и исправление в конфигураторе в режиме проверки физической целостности, если есть малейшие сомнения.

Чтобы проблема не вернулась, настройте регулярное обслуживание: плановые бэкапы (включая журнал транзакций при полной модели восстановления), периодическое перестроение или реорганизацию индексов, регламентную очистку журнала регистрации и контроль регистрации изменений в планах обмена. Профилактика избавляет от необходимости экстренных сжатий.

Контрольные точки

Как проверить результат

Размер MDF и LDF на диске
Норма

Файлы уменьшились до ожидаемого объёма с запасом 10–20%

Тревожный признак

Размер не изменился — значит, свободного места внутри не было или журнал не усечён

Отчёт об использовании пространства
Норма

Доля неиспользуемого места соответствует оставленному запасу

Тревожный признак

Свободного места много, но файл не сжался — shrink выполнялся не для того файла

Работа пользователей в 1С
Норма

Формы и отчёты открываются с обычной скоростью

Тревожный признак

Заметные тормоза — вероятно, индексы фрагментированы, нужен rebuild

Модель восстановления и бэкапы
Норма

Модель восстановления соответствует политике, полный бэкап создан после операций

Тревожный признак

База осталась в простой модели, а требовалась полная — цепочка восстановления потеряна

Итог

Что важно запомнить

Сжатие SQL-базы 1С — это последний шаг, а не первый: сначала очистка данных средствами 1С, затем перестроение индексов, потом shrink файлов и снова rebuild. Всегда начинайте с резервной копии, работайте в нерабочее время и не используйте автосжатие как постоянную практику.

Частые вопросы

Можно ли сжать базу 1С без остановки работы пользователей?

Технически shrink не требует монопольного доступа, но на практике операция сильно нагружает диски и может замедлить работу до неприемлемого уровня. Очистка данных в 1С (удаление помеченных объектов, свертка) часто вообще требует монопольного режима. Планируйте работы на ночь или выходные.

Почему после удаления данных размер базы не уменьшился?

SQL Server не возвращает освободившееся место операционной системе автоматически — оно остаётся зарезервированным внутри файла под будущие данные. Чтобы физически уменьшить файл, нужна отдельная операция сжатия (Shrink) на уровне СУБД.

Чем отличается сжатие базы от выгрузки и загрузки через DT?

Выгрузка в DT и загрузка в новую базу — более радикальный способ: данные физически перезаписываются заново, без пустот и фрагментации. Но это долго на больших базах, требует монопольного доступа и не переносит некоторые настройки. Shrink быстрее и проще, но менее «чистый» по результату.

Опасна ли команда DBCC SHRINKFILE для данных?

При корректном выполнении — нет, но операция не должна прерываться сбоем питания или перезагрузкой сервера. Поэтому обязательны резервная копия до начала и стабильное электропитание (ИБП) на время работы. После сжатия перестройте индексы.

Журнал транзакций снова быстро вырос после сжатия. Что делать?

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

Нужно ли сжимать файловую базу 1С таким же способом?

Нет, файловый формат (1Cv8.1CD) обслуживается иначе: там используется «Тестирование и исправление» с включённой опцией сжатия таблиц либо выгрузка/загрузка через DT. Инструменты SQL Server к файловым базам не применяются.