Администрирование · 11 мин
Как сжать SQL-базу 1С: практическое руководство
Как безопасно сжать SQL-базу 1С: очистка журнала регистрации, shrink файлов MDF и LDF, перестроение индексов, типичные ошибки и проверка результата.
База 1С на MS SQL Server со временем растёт не только за счёт реальных данных, но и из-за журнала транзакций, удалённых объектов, версий изменений и фрагментированных индексов. Файл с данными (MDF) может занимать десятки гигабайт, хотя фактических данных в нём — в разы меньше. Сжатие базы позволяет вернуть свободное место на диске, ускорить создание резервных копий и упростить перенос базы между серверами.
Перед любыми действиями важно понимать: сжатие (shrink) — это не повседневная операция обслуживания, а разовая процедура после массовых удалений или очистки. Регулярное сжатие вредит производительности, потому что фрагментирует индексы и заставляет SQL Server заново расширять файлы при росте данных. Правильный подход — сначала удалить лишнее на уровне 1С, затем перестроить индексы и только после этого уменьшать физический размер файлов.
Ниже разобран полный цикл работ: от анализа занятого места до проверки результата. Все действия выполняются на тестовой копии или после создания резервной копии рабочей базы.
Когда базе действительно нужно сжатие
Не каждая большая база требует уменьшения. SQL Server резервирует место внутри файлов под будущие данные, и это нормально. Сжатие оправдано в конкретных ситуациях: после удаления большого объёма данных (свертка базы, очистка журнала регистрации, удаление старых документов), после переноса базы, когда нужно сократить размер бэкапа, или когда диск сервера физически заполнен.
Оценить ситуацию помогает отчёт о распределении места. В SQL Server Management Studio (SSMS) щёлкните правой кнопкой по базе, выберите «Отчёты» → «Стандартные отчёты» → «Использование дискового пространства». Отчёт покажет, сколько места занято данными, сколько зарезервировано и сколько реально свободно внутри файлов.
Выполните очистку данных и shrink файла данных
Проверьте модель восстановления и выполните усечение журнала
Место снова заполнится данными, shrink только навредит
Сначала ищите реальный мусор: версии, журналы, дубли
Подготовка: резервная копия и анализ
Первый обязательный шаг — полная резервная копия базы средствами SQL Server. Не выгрузка DT из конфигуратора, а именно полный бэкап: при сбое во время shrink восстановиться из него быстрее и надёжнее. Убедитесь, что копия создана успешно и лежит на отдельном диске или сетевом ресурсе.
Далее найдите, что занимает место. Запрос к системным представлениям покажет самые большие таблицы базы. В 1С типичные «тяжёлые» объекты — журнал регистрации, регистры сведений с версионированием, таблицы изменений для планов обмена, хранилища двоичных данных (файлы, картинки). Зная конкретные таблицы, вы поймёте, что чистить в первую очередь.
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Создайте полную резервную копию базы на отдельный носитель
- 2Проанализируйте самые большие таблицы и очистите данные средствами 1С
- 3Перестройте индексы базы (Rebuild Index) в нерабочее время
- 4Усеките журнал транзакций через простую модель восстановления
- 5Выполните Shrink файла данных с указанием целевого свободного места
- 6Повторно перестройте индексы после shrink и проверьте работу базы
Сжатие журнала транзакций (LDF)
Чаще всего проблема — не файл данных, а раздутый журнал транзакций. Это происходит, когда база работает в полной модели восстановления (Full), но резервные копии журнала не делаются: SQL Server не может очистить журнал и накапливает в нём все операции.
Если восстановление на произвольный момент времени вам не требуется, порядок действий такой: переведите базу в простую модель восстановления (свойства базы → «Параметры» → «Модель восстановления» → «Простая»), затем выполните сжатие файла журнала: правой кнопкой по базе → «Задачи» → «Сжать» → «Файлы» → выберите тип «Журнал». После сжатия верните полную модель восстановления, если она нужна, и сразу сделайте полный бэкап — иначе цепочка восстановления будет нарушена.
Если полная модель восстановления нужна постоянно, настройте регулярное резервное копирование журнала транзакций — это штатный механизм, который не даёт LDF-файлу расти бесконечно.
ALTER DATABASE [ИмяБазы] SET RECOVERY SIMPLE; DBCC SHRINKFILE (N'ИмяЛогическогоФайлаЖурнала', 1024); ALTER DATABASE [ИмяБазы] SET RECOVERY FULL;Сжатие файла данных (MDF)
После очистки и перестроения индексов можно уменьшать сам файл данных. В SSMS: правой кнопкой по базе → «Задачи» → «Сжать» → «Файлы», тип файла — «Данные». Выберите действие «Реорганизовать страницы перед освобождением неиспользуемого места» и укажите, сколько свободного места оставить после сжатия — разумно оставить 10–20% под рост данных, чтобы файл не начал расширяться сразу после операции.
Операция может занять часы на больших базах и существенно нагружает дисковую подсистему. Прогресс виден в окне выполнения. Не запускайте shrink в рабочее время и не прерывайте его. Альтернатива графическому интерфейсу — команда DBCC SHRINKFILE с указанием целевого размера в мегабайтах: она даёт больше контроля и работает предсказуемее, чем SHRINKDATABASE.
После сжатия индексы снова фрагментируются — shrink перемещает страницы данных без учёта их порядка. Поэтому завершающий шаг — повторное перестроение индексов. Да, это кажется парадоксальным, но именно поэтому shrink делают редко и только при реальной необходимости.
Проверка результата и дальнейшее обслуживание
После всех операций сверьте размеры файлов на диске с ожидаемыми, повторно запустите отчёт об использовании пространства и проверьте, что база открывается в 1С:Предприятии без ошибок. Выполните тестирование и исправление в конфигураторе в режиме проверки физической целостности, если есть малейшие сомнения.
Чтобы проблема не вернулась, настройте регулярное обслуживание: плановые бэкапы (включая журнал транзакций при полной модели восстановления), периодическое перестроение или реорганизацию индексов, регламентную очистку журнала регистрации и контроль регистрации изменений в планах обмена. Профилактика избавляет от необходимости экстренных сжатий.
Как проверить результат
Файлы уменьшились до ожидаемого объёма с запасом 10–20%
Размер не изменился — значит, свободного места внутри не было или журнал не усечён
Доля неиспользуемого места соответствует оставленному запасу
Свободного места много, но файл не сжался — shrink выполнялся не для того файла
Формы и отчёты открываются с обычной скоростью
Заметные тормоза — вероятно, индексы фрагментированы, нужен rebuild
Модель восстановления соответствует политике, полный бэкап создан после операций
База осталась в простой модели, а требовалась полная — цепочка восстановления потеряна
Что важно запомнить
Сжатие SQL-базы 1С — это последний шаг, а не первый: сначала очистка данных средствами 1С, затем перестроение индексов, потом shrink файлов и снова rebuild. Всегда начинайте с резервной копии, работайте в нерабочее время и не используйте автосжатие как постоянную практику.
Частые вопросы
Можно ли сжать базу 1С без остановки работы пользователей?
Технически shrink не требует монопольного доступа, но на практике операция сильно нагружает диски и может замедлить работу до неприемлемого уровня. Очистка данных в 1С (удаление помеченных объектов, свертка) часто вообще требует монопольного режима. Планируйте работы на ночь или выходные.
Почему после удаления данных размер базы не уменьшился?
SQL Server не возвращает освободившееся место операционной системе автоматически — оно остаётся зарезервированным внутри файла под будущие данные. Чтобы физически уменьшить файл, нужна отдельная операция сжатия (Shrink) на уровне СУБД.
Чем отличается сжатие базы от выгрузки и загрузки через DT?
Выгрузка в DT и загрузка в новую базу — более радикальный способ: данные физически перезаписываются заново, без пустот и фрагментации. Но это долго на больших базах, требует монопольного доступа и не переносит некоторые настройки. Shrink быстрее и проще, но менее «чистый» по результату.
Опасна ли команда DBCC SHRINKFILE для данных?
При корректном выполнении — нет, но операция не должна прерываться сбоем питания или перезагрузкой сервера. Поэтому обязательны резервная копия до начала и стабильное электропитание (ИБП) на время работы. После сжатия перестройте индексы.
Журнал транзакций снова быстро вырос после сжатия. Что делать?
Если база в полной модели восстановления, настройте регулярное резервное копирование журнала транзакций — без него журнал не очищается. Если восстановление на момент времени не нужно, переведите базу в простую модель восстановления постоянно. Также проверьте, нет ли долгих незавершённых транзакций или репликаций, удерживающих журнал.
Нужно ли сжимать файловую базу 1С таким же способом?
Нет, файловый формат (1Cv8.1CD) обслуживается иначе: там используется «Тестирование и исправление» с включённой опцией сжатия таблиц либо выгрузка/загрузка через DT. Инструменты SQL Server к файловым базам не применяются.