Почему бэкап базы 1С 7.7 средствами SQL значительно больше выгрузки из Конфигуратора?

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

При администрировании баз данных 1С:Предприятие 7.7 на MS SQL Server специалисты часто сталкиваются с парадоксальной ситуацией: штатная выгрузка данных через Конфигуратор (файл .dat) занимает, к примеру, 140 МБ, в то время как полный бэкап средствами SQL Server (.bak) достигает 2300 МБ. Даже после сжатия сторонними архиваторами разница остается колоссальной.

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

Логическая выгрузка против физического дампа

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

Бэкап средствами SQL Server — это физическая копия страниц базы данных. SQL Server хранит информацию в страницах объемом 8 КБ. Когда мы делаем BACKUP DATABASE, система копирует эти страницы "как есть", включая служебную информацию, пустые пространства внутри страниц и структуру размещения данных на диске.

Проанализируем основные факторы, влияющие на размер SQL-бэкапа:

  1. Индексы. Это главная причина раздутого объема. В 1С 7.7 индексы (аналоги файлов .cdx в файловой версии) могут занимать от 50% до 70% общего объема базы. Конфигуратор 1С при выгрузке игнорирует индексы полностью. Предполагается, что при загрузке данных в новую базу 1С сама перестроит индексы с нуля. SQL-бэкап обязан сохранить их, чтобы база была готова к работе мгновенно после восстановления.
  2. Таблицы итогов. Регистры в 1С (остатки, обороты) хранят рассчитанные итоги в специальных таблицах (начинаются на RG*). При выгрузке 1С может оптимизировать передачу этих данных или вовсе пересчитывать их при загрузке (в зависимости от параметров). SQL-бэкап хранит физическое состояние этих таблиц в полном объеме.
  3. Фрагментация данных. Со временем из-за постоянных операций вставки, удаления и обновления данных в SQL Server возникает внутренняя фрагментация. Страницы заполняются не полностью, образуются "дыры". SQL-бэкап копирует эти "полупустые" страницы. Выгрузка 1С, напротив, читает только "живые" записи, полностью игнорируя пустоты.
  4. Зарезервированное место (Autogrow). Если для файла базы данных (MDF) задан большой размер или большой шаг автоматического расширения, файл может быть заполнен данными лишь наполовину, но его физический размер будет огромным. Хотя бэкап SQL обычно не включает совсем пустые страницы в конце файла, внутренняя разреженность данных все равно увеличивает итоговый размер.

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

Выясним причину, связанную с файлом .ldf. В сообщениях форума часто упоминается, что SQL-бэкап "тащит" за собой всё. Если база данных работает в модели восстановления Full (Полная), SQL Server записывает каждое изменение в журнал транзакций. Если бэкапы журнала не делаются регулярно, файл LDF может вырасти до гигантских размеров, превышающих саму базу.

Хотя стандартный Full Backup базы данных не включает в себя весь файл лога, он включает в себя ту часть журнала, которая необходима для обеспечения согласованности данных на момент завершения бэкапа. Кроме того, общее состояние метаданных базы в SQL-формате требует гораздо больше служебной информации, чем простой плоский список данных в формате 1С.

Специфика 1С 7.7: Периодические реквизиты и история

Рассмотрим подробнее вопрос о "чепухе", упоминаемой в дискуссии. В 1С 7.7 существует таблица _1SCONST, где хранится история периодических реквизитов справочников и значения констант. Некоторые пользователи опасаются, что при выгрузке эта история теряется.

На самом деле, штатная выгрузка через Конфигуратор (Администрирование -> Выгрузка данных) полностью сохраняет таблицу _1SCONST. Проблемы с потерей истории могут возникать только при использовании механизмов УРБД (распределенных баз), если в правилах миграции не указана передача периодики. В контексте обычного бэкапа — и SQL, и 1С сохраняют эти данные одинаково надежно, но SQL делает это в "сыром" виде таблиц со всеми сопутствующими индексами по датам и объектам.

Сравнение эффективности сжатия

Посмотрим на пример из сообщения: SQL-бэкап 2300 МБ сжимается RAR-ом до 867 МБ. Это происходит потому, что внутри .bak файла много избыточной информации (индексы, пустые места в страницах), которая хорошо поддается алгоритмам сжатия. Однако размер все равно остается больше 140 МБ (размера .dat).

Почему 1С сжимает лучше?

Какая копия надежнее?

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

Преимущества SQL-бэкапа:

  1. Скорость восстановления. Восстановить .bak файл в разы быстрее, чем загружать .dat через Конфигуратор, так как во втором случае 1С будет заново создавать таблицы и — самое долгое — строить все индексы.
  2. Точка восстановления (Point-in-time recovery). При использовании SQL-бэкапов в сочетании с бэкапами логов (LDF), вы можете откатить базу на конкретную минуту или секунду (например, до того, как пользователь запустил ошибочную обработку). Выгрузка 1С позволяет восстановиться только на момент её создания.
  3. Автоматизация. Создание SQL-бэкапа не требует монопольного доступа к базе в большинстве случаев (через SQL Agent), тогда как выгрузка 1С 7.7 требует, чтобы в базе никого не было.

Заключение

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

Рекомендуем использовать SQL-бэкап как основной инструмент ежедневного резервного копирования, а выгрузку 1С — как дополнительное средство "архивного" хранения данных за прошлые годы.

← На главную