Данные из базы 1С удалили, а файл на диске не уменьшился: две ночи сжатия

04.10.26

База данных - Администрирование СУБД

Порции по 500 ГБ за целую ночь сжали файл базы на 1,2 ТБ, один большой проход следующей ночью снял 2,7 ТБ за 89 минут. Разбираем, почему файл базы 1С не уменьшается сам после очистки и почему режим TRUNCATEONLY не вернул ни гигабайта. Что ещё останавливало сжатие: параллельный бэкап, переключение модели восстановления, чужой отчёт на соседней базе того же сервера. И что делать после сжатия, чтобы база не стала медленнее, чем была.

Самое приятное число в проекте обрезки базы мы получили за пару минут. После очистки служебного кэша внутри файла данных осталось 108 ГБ занятого места. До очистки было занято 4 108 ГБ, а сам файл на диске весил 4 197.

Но сам диск этого не заметил: файл как занимал 4 197 ГБ, так и продолжал занимать. Свободного места на сервере практически не осталось. Чтобы вернуть его системе, потребовалось две ночи. В первую ночь всё шло по плану — удалось сжать файл с 4,2 ТБ на 1,2 ТБ. А вот вторая ночь пошла уже не по плану, но в итоге мы справились.

Кейс тот же, что в статье 3,85 ТБ мёртвого кэша: розничная сеть fashion-сегмента, три страны, около двухсот касс, MS SQL Server. Там разбиралось, почему данные мёртвые и почему их можно убирать. Здесь продолжение, о котором та статья молчит: что происходит с файлом после того, как данные ушли.

 

Свободно внутри файла и свободно на диске - разные числа

Удаление данных освобождает страницы внутри файла, и только. SQL Server однажды выделил под базу 4 197 ГБ и отдавать их обратно сам не станет. Для него это нормальное поведение: база выросла один раз, вырастет снова, зачем дёргать диск.

На тестовой копии базы мы увидели это в чистом виде. Размер у копии чуть отличался от боевой, 4 099 ГБ. Замеры после двух раундов очистки:

Что меряем До очистки После первого раунда После второго раунда
Занято данными внутри файла 4 099 ГБ 386 ГБ 160 ГБ
Свободно внутри файла меньше 1 ГБ 3 713 ГБ 3 940 ГБ
Размер файла на диске 4 099 ГБ 4 099 ГБ 4 099 ГБ

Освободили 96 % объёма, последняя строка не сдвинулась ни на гигабайт.

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

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

 

Почему быстрый вариант не сработал

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

Результат: файл остался ровно тем же.

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

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

Если база росла годами, а освобождённое место лежит вперемешку с живыми данными, мгновенного сжатия не будет. Понадобится полное, с перемещением страниц, и оно стоит времени.

 

План: порциями, несколько ночей

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

В нашем регламенте до прода стояла ровно эта картина. Сжатие 3,84 ТБ - самая долгая часть всей работы, часы или несколько ночей. Идти порциями, каждую ночь отрезать по куску. Прервать можно в любой момент, перенесённое не теряется.

С такой логикой трудно спорить: порция укладывается в окно, прерывание ничего не ломает. Эта гипотеза прожила одну ночь.

 

Ночь первая: порции застревают на хвосте

Первую ночь мы шли по плану, порциями по 500 ГБ. Файл уменьшился с 4 197 до 2 999,6 ГБ, диску вернулось 1,2 ТБ. До цели оставалось почти три терабайта.

Порция застревала на хвосте. Основной её объём переносился, а на последних гигабайтах сеанс повисал в ожидании SLEEP_TASK: в переводе с серверного это значит "жду", и работа при этом не идёт.

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

Вторая находка той же ночи касалась расписания. База по автоматическим заданиям переключала модель восстановления: в 22:30 ставилось SIMPLE, в 00:02 возвращалось FULL. Сжатие пишет в журнал транзакций каждое перемещение страницы. В SIMPLE журнал очищается сам на контрольных точках. В FULL он копит всё до ближайшего бэкапа журнала, и терабайтное перемещение упирается в его потолок: ошибка 9002, журнал заполнен, операция стоит.

Правило после этой ночи: на всё время сжатия база стоит в SIMPLE, а задания, которые её переключают, на ночь работ надо знать заранее и отключить. После работ модель возвращается на место, иначе вы молча теряете восстановление на точку во времени.

 

Ночь вторая: один большой проход оказался быстрее

На вторую ночь мы сделали то, от чего план прямо отговаривал: запустили одно сжатие сразу с 2 999,6 до 300 ГБ. Без порций, одной командой.

Оно прошло за 89 минут.

Внутри этих полутора часов было две разные фазы. Первые примерно 45 минут ушли на работу, упиравшуюся в процессор. По отчёту это была фоновая доработка освобождения страниц, оставшаяся от очистки. SQL Server освобождает очень большие объёмы не сразу, сначала помечает их и разбирает потом, в фоне. Наша трактовка: "две минуты", за которые освободилось почти 4 ТБ, были минутами на пометку, а сама разборка шла ещё и во вторую ночь.

Вторая фаза пошла быстро. Оставшиеся примерно 44 минуты файл уменьшался в среднем на 50-60 ГБ в минуту: в отчёте стоит около 53, наш пересчёт 2 700 ГБ на 44 минуты, если считать, что весь объём ушёл во второй фазе, даёт 61. Обе исходные цифры приблизительные, поэтому читайте их как порядок, точного хронометража у нас нет.

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

Дальше двумя шагами дожали файл с 300 до 105 ГБ. Данных к этому моменту было около 104 ГБ, так что файл встал почти впритык к ним.

От старта проекта: 4 197 ГБ превратились в 105, минус 97,5 %.

 

Размер файла базы по шагам: 4 197 ГБ на старте, 2 999,6 ГБ после первой ночи порциями, 300 ГБ после одного прохода за 89 минут, 105 ГБ после дожима

 

Что ещё останавливало сжатие

Кроме хвостов, операцию останавливали ещё три вещи, и все три к самому сжатию отношения не имели.

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

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

Чужой отчёт на соседней базе. На том же экземпляре SQL Server жила вторая база сети. Там зависший отчёт занял 24 потока, проработал 4,3 часа и душил весь сервер, сжатие нашей базы почти встало. После того как его сеанс сняли, сжатие пошло дальше. Перед ночью работ проверяйте не только свою базу, но и соседей по экземпляру: тяжёлое у соседа отнимает ресурсы у вас.

 

После сжатия: индексы и статистика

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

Перестроение 200 индексов заняло 44 минуты и прошло без единой ошибки. Вместе с ним обновили статистику, чтобы отчёты получили свежие планы. Занятое место внутри файла при этом ещё сократилось, с 104 до 90,7 ГБ: перестроенные индексы плотнее.

Последним шагом вернули модель восстановления FULL и сразу сняли полный бэкап, от которого теперь отсчитывается цепочка. Он весил 18,34 ГБ. До проекта ночной бэкап этой базы занимал 556 ГБ и шёл два часа, и похудел он благодаря очистке данных, сжатие файла тут было ни при чём.

 

Сколько места оставить

Сжимать файл в упор к данным не обязательно. База растёт, и автоприрост файла посреди рабочего дня может дать паузу пользователям. В итоговом отчёте это записано опцией: если нужен запас, файл можно разово выставить на 130-150 ГБ, хвост уже чистый, это минуты работы.

Отсюда и наш ответ на спор о том, вредно ли сжатие. Регулярное сжатие по расписанию вредно: файл сжимается, потом снова растёт, индексы каждый раз перемешиваются, и сервер тратит ночи на работу, которая ничего не меняет. После разовой очистки картина другая. Из базы ушло 97 % объёма, обратно он не вернётся, и сжатие тут самый короткий путь вернуть диск. Есть и штатный вариант с выгрузкой и загрузкой базы через DT, но замера на терабайтах по нему у нас нет, и сравнивать мы не берёмся.

 

С чего начинать, если база выросла

Всё описанное выше начинается после того, как стало понятно, что именно занимает место и что из этого можно убирать. Это главная часть работы: две ночи сжатия ничего не стоят, если удалили не то.

Первым шагом нужна карта: какие объекты базы сколько весят и где объём не совпадает с ожиданием. Для этого у нас есть обработка Карта объёмов базы 1С. Она обходит объекты метаданных платформенными средствами, отдельным списком показывает служебные таблицы, за которыми не стоит ни один объект, и считает долю каждого. На этой самой базе такая карта и показала, что 92 % объёма занимает мёртвый кэш разграничения доступа. Дальше решается, что из этого живое, что мёртвое и каким путём его убирать, и только потом очередь доходит до файла.

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

Другие наши инструменты:

Database Compression Tool

Инструмент для свертки и сжатия баз данных 1С

2–3 раза
Сокращение размера базы
1С
Поддержка любых конфигураций
Многопоточность
Параллельная обработка данных
Подробнее →

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

Вступайте в нашу телеграмм-группу Инфостарт

сжатие базы 1С SHRINKFILE TRUNCATEONLY размер файла базы MS SQL Server очистка базы 1С большая база 1С модель восстановления SIMPLE FULL ошибка 9002 ошибка 3140 перестроение индексов обслуживание СУБД освобождение места на диске обрезка базы

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Разработчик Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    83146    431    171    

361

Свертка базы Системный администратор Разработчик 1С:Предприятие 8 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 3.0 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 Платные (руб)

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

6000 руб.

22.05.2024    9581    61    40    

69

Перенос данных 1C Оптовая торговля Свертка базы Системный администратор Разработчик Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Хотите точно знать, что вы выгружаете? Хотите сворачивать товары по НДС или фильтровать товары по доп. реквизиту? Вы волшебник, которому необходимо превращать одних контрагентов в других? Хотите при выгрузке превратить группу товаров в один? Или просто нужен удобный OLE обмен между 1C:Управление торговлей (ред. 11 или 10) и 1С:Бухгалтерия предприятия (ред. 2 или 3). Тогда эта обработка для вас!

12900 руб.

19.04.2013    187348    406    407    

346

Свертка базы Системный администратор Разработчик 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 Россия Управленческий учет Платные (руб)

Механизм обрезки (свертки) базы 1С. Описан процесс переноса среза остатков в новую базу. Реализован способ обмена между базами без длительного отключения рабочей базы. Представлено прикладное решение - обработка по переносу данных. Есть 2 варианта запуска: на обычных и управляемых формах.

7320 руб.

27.03.2023    12174    22    4    

25

Администрирование СУБД HighLoad оптимизация Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

Большинство материалов о компрессии в PostgreSQL отвечают на вопрос «во сколько раз удалось уменьшить базу». Мы предлагаем посмотреть на проблему с другой стороны — какой ценой достигается эта экономия? В статье разбираем архитектурные компромиссы различных подходов к компрессии страниц, объясняем, почему при разработке CSM в Tantor Postgres отказались от погони за максимальным коэффициентом сжатия, и показываем результаты нагрузочных испытаний на реальных базах 1С.

01.10.2026    1430    Tantor    6    

17

HighLoad оптимизация Администрирование СУБД Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

В рамках 18 релиза СУБД Tantor Postgres мы рассказывали об оптимизациях, которые помогают планировщику сделать более точный выбор между Nested Loop и Hash Join. В следующем релизе у нас планируются оптимизации, которые позволят ускорить выполнение как Nested Loop, так и Hash Join. Сегодня мы расскажем об одном из таких методов - фильтре Блума.

31.08.2026    6104    Tantor    3    

18

Администрирование СУБД Системный администратор Разработчик Бесплатно (free)

5,5 тысячи пользователей в единой базе 1С, розница в режиме 24/7 и SLA 99,98% – в таких условиях любая авария быстро превращается в очереди на кассах, потерю денег и давление со стороны бизнеса. Показываем, как выстроить процесс аварийно-восстановительных работ: от первых алертов и базового скрининга системы до подключения команды, проверки гипотез и дебрифа после инцидента. Разбираем, как метрики, дашборды, техжурнал, Zabbix, Prometheus, Grafana, Telegram-боты и скрипты помогают не гадать, а быстро находить причину проблемы. На реальных авариях объясняем, почему «быстро» не должно означать «рискованно», как работа над ошибками снижает панику и почему каждая авария может сделать систему надежнее.

11.08.2026    3391    jul.dolganova    9    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 9899100 17 04.10.26 21:56 Сейчас в теме
Вы о чем?
Кейс тот же, что в статье 3,85 ТБ мёртвого кэша: розничная сеть fashion-сегмента, три страны, около двухсот касс, MS SQL Server. Там разбиралось, почему данные мёртвые и почему их можно убирать. Здесь продолжение, о котором та статья молчит: что происходит с файлом после того, как данные ушли.

вы хоть редактируете текст после ИИ ??

Если Вы говорите по Русски, то поясните это
.... Первую мы провели по плану и сжали файл на 1,2 ТБ из 4,2. Вторую вопреки плану и закончили.

Что "вопреки плану..." ? Что "... и закончили"??
Чем закончили??

Вы ИИ генерацию, напрямую пихаете в публикацю? сами не читаете этот маразм??
3. WasiliyMay 8 05.10.26 13:49 Сейчас в теме
(1) Чукча не читатель, чукча писатель.
2. speshuric 1345 04.10.26 23:14 Сейчас в теме
Если вам надо прям с 4 ТБ уменьшить до сотен ГБ, то лучше сделать по-другому.
0. База данных забэкаплена, с ней никто не работает, да и вообще лучше пусть никто не работает с сервером. База в модели simple или bulk logged, т.к. это сильно ускорит пп 2 и 5.
1. Создаём вторую filegroup с одним файлом. Лучше физически на другом носителе - так быстрее будет.
2. Идём по всем таблицам/индексам и делаем alter с переносом в другую filegroup. Можно с maxdop=много, если сжатие на уровне страниц есть. Время работы пропорционально объёму данных. Естественно, это надо написать скрипт.
3. Делаем shrinkfile основной filegroup до примерно нужного размера или меньше. Внимание: shrinkfile, а не shrinkdatabase.
4. Если уменьшили до размеров меньше данных, то внимательно смотрим на автоприращение (надо чтобы оно было, лучше чтобы оно не было в процентах, для этих масштабов я бы приращал по 0,5 или по 1 ГБ)
5. Переливаем данные обратно. Тут лучше сделать так, чтобы большие и стабильные таблицы переносились раньше постоянно меняющихся и мелких.
6. Удаляем пустую вторую filegroup. Всё готово.

На древнем-древнем сервере 15+ лет назад переброска у меня утыкалась больше в диски. Диски тогда были хоть и крутящиеся, но в raid и без проблем утыкались в sas примерно на 1 ГБ/с. Т.е. вся операция - несколько часов на отладку скрипта, а потом запустить и сходить борщ поесть.
Плюсы: быстро, фрагментация нулевая (хотя на ssd она и не влияет совсем), свободного места ровно столько, сколько нужно.
Минус: сервер занят, работать в это время не получится, операцию прерывать неудобно.

Если простой невозможен, то хорошо получается делать shrinkfile с постоянным уменьшением размера. Опять же - скриптом, конечно. Да, это сильно дольше прошлого варианта, но достаточно предсказуемо, наблюдаемо, прерываемо. Если поглядывать, что shrinkfile не завис, то обычно время достаточно линейное от размера освобождаемого места. Но зато можно всегда прервать и продолжить потом.
4. V.Nikonov 141 06.10.26 14:34 Сейчас в теме
Сжатие Базы через свёртку - обычно Долго, Дорого, малость Рискованно...
Однако практически в любой Базе хранится информация, которая постепенно теряет Актуальность.
1) Группа данных эквивалентная протоколам... Это могут быть Тексты сообщений отправленных в Другую Информационную Систему, а может простой Лог событий обмена... Нужен ли он спустя месяц?
2) Данные имеющий смысл Планирование... Например, состав Заказа покупателя (Резервирование), после исполнения или закрытия резко снижает значимость. Нужна ли подобная информация спустя годы?

Если под первую группу в Информационных Системах могут предусматриваться Регламентные задания "Удаление неактуальной информации", то для второй группы - наверняка придётся самостоятельно дорабатывать алгоритмы...
Но, это часто даёт заметный выигрыш в размерах.

П.С. Удаление "старья", может открыть путь к удалению связанной информации... Например, Номенклатурные позиции, которые были в Заказах, но так и не была исполнена Закупка и Отгрузка. Мелочь, но так приятна Глазу.
П.П.С. Рассматривал варианты "Замены похожих Номенклатурных позиций" со свёрткой документов движения. В документах сохраняется Дата, Номер, реквизиты Шапки, а Табличная Часть сворачивается с сохранением Суммы (количества товара)... Это заодно улучшит некоторые виды Аналитики Истории...
5. nedomolkov.ivan 485 13.10.26 14:56 Сейчас в теме
( 1 ) Поясню, в анонсе две ночи ужаты в две фразы, и вторая вышла невнятной. Первая ночь шла по плану: сжимали порциями по 500 ГБ, файл ушёл с 4 197 до 2 999,6 ГБ, диску вернулось 1,2 ТБ. На вторую ночь от порций отказались и запустили одно сжатие сразу с 2 999,6 до 300 ГБ. Оно прошло за 89 минут. Потом двумя шагами дожали файл до 105 ГБ при 104 ГБ данных. В теле статьи всё это расписано по шагам, вместе с ошибками 9002 и 3140, которые ловили по дороге.
6. nedomolkov.ivan 485 13.10.26 14:56 Сейчас в теме
( 2 ) Спасибо, способ с переносом в соседнюю файловую группу мы не пробовали, замера по нему нет, так что сравнивать не берусь. Под наш случай он ложится: после очистки данных осталось 108 ГБ, вторая группа нужна небольшая, а не на терабайты. Упёрлись бы мы в другое: свободное место на сервере к тому моменту кончилось, второй носитель пришлось бы искать. А одно сжатие с 3 ТБ до 300 ГБ в итоге прошло за 89 минут и в окно простоя уложилось. Вариант со shrinkfile порциями без простоя у нас и был планом, так шла первая ночь по 500 ГБ за раз.
7. nedomolkov.ivan 485 13.10.26 14:57 Сейчас в теме
( 4 ) Согласен, и в нашем кейсе почти весь объём дала ровно ваша первая группа. Служебный кэш, который никто не чистил, занимал 4 ТБ из 4,1: после его очистки внутри файла осталось 108 ГБ. Со второй группой сложнее: заказы и резервы тянут за собой регистры, там без своих алгоритмов и проверки остатков до и после я бы не трогал.
Для отправки сообщения требуется регистрация/авторизация