При администрировании баз данных 1С:Предприятие 7.7 на MS SQL Server специалисты часто сталкиваются с парадоксальной ситуацией: штатная выгрузка данных через Конфигуратор (файл .dat) занимает, к примеру, 140 МБ, в то время как полный бэкап средствами SQL Server (.bak) достигает 2300 МБ. Даже после сжатия сторонними архиваторами разница остается колоссальной.
В этой статье мы подробно разберем, почему возникает такая разница, что именно "лишнего" (на первый взгляд) хранит SQL-бэкап и почему это критически важно для понимания архитектуры системы. Мы проанализируем внутренние механизмы хранения данных и выясним, каким образом 1С "ужимает" информацию при экспорте.
Разберем фундаментальное различие в подходах. Выгрузка из Конфигуратора 1С — это логический дамп данных. Программа последовательно сканирует таблицы, извлекает из них записи и записывает их в компактный текстово-бинарный файл. В этом файле сохраняется только полезная нагрузка: значения реквизитов справочников, строк документов, констант и проводок.
Бэкап средствами SQL Server — это физическая копия страниц базы данных. SQL Server хранит информацию в страницах объемом 8 КБ. Когда мы делаем BACKUP DATABASE, система копирует эти страницы "как есть", включая служебную информацию, пустые пространства внутри страниц и структуру размещения данных на диске.
Проанализируем основные факторы, влияющие на размер SQL-бэкапа:
.cdx в файловой версии) могут занимать от 50% до 70% общего объема базы. Конфигуратор 1С при выгрузке игнорирует индексы полностью. Предполагается, что при загрузке данных в новую базу 1С сама перестроит индексы с нуля. SQL-бэкап обязан сохранить их, чтобы база была готова к работе мгновенно после восстановления.RG*). При выгрузке 1С может оптимизировать передачу этих данных или вовсе пересчитывать их при загрузке (в зависимости от параметров). SQL-бэкап хранит физическое состояние этих таблиц в полном объеме.Выясним причину, связанную с файлом .ldf. В сообщениях форума часто упоминается, что SQL-бэкап "тащит" за собой всё. Если база данных работает в модели восстановления Full (Полная), SQL Server записывает каждое изменение в журнал транзакций. Если бэкапы журнала не делаются регулярно, файл LDF может вырасти до гигантских размеров, превышающих саму базу.
Хотя стандартный Full Backup базы данных не включает в себя весь файл лога, он включает в себя ту часть журнала, которая необходима для обеспечения согласованности данных на момент завершения бэкапа. Кроме того, общее состояние метаданных базы в SQL-формате требует гораздо больше служебной информации, чем простой плоский список данных в формате 1С.
Рассмотрим подробнее вопрос о "чепухе", упоминаемой в дискуссии. В 1С 7.7 существует таблица _1SCONST, где хранится история периодических реквизитов справочников и значения констант. Некоторые пользователи опасаются, что при выгрузке эта история теряется.
На самом деле, штатная выгрузка через Конфигуратор (Администрирование -> Выгрузка данных) полностью сохраняет таблицу _1SCONST. Проблемы с потерей истории могут возникать только при использовании механизмов УРБД (распределенных баз), если в правилах миграции не указана передача периодики. В контексте обычного бэкапа — и SQL, и 1С сохраняют эти данные одинаково надежно, но SQL делает это в "сыром" виде таблиц со всеми сопутствующими индексами по датам и объектам.
Посмотрим на пример из сообщения: SQL-бэкап 2300 МБ сжимается RAR-ом до 867 МБ. Это происходит потому, что внутри .bak файла много избыточной информации (индексы, пустые места в страницах), которая хорошо поддается алгоритмам сжатия. Однако размер все равно остается больше 140 МБ (размера .dat).
Почему 1С сжимает лучше?
.dat — это специализированный проприетарный формат, оптимизированный именно под типы данных 1С.Проанализируем ситуацию с точки зрения безопасности. Несмотря на то, что выгрузка 1С намного меньше, она не является полноценной заменой бэкапу SQL для администратора базы данных.
Преимущества SQL-бэкапа:
.bak файл в разы быстрее, чем загружать .dat через Конфигуратор, так как во втором случае 1С будет заново создавать таблицы и — самое долгое — строить все индексы.LDF), вы можете откатить базу на конкретную минуту или секунду (например, до того, как пользователь запустил ошибочную обработку). Выгрузка 1С позволяет восстановиться только на момент её создания.Разница в размерах — это не ошибка, а следствие различного предназначения инструментов. Выгрузка 1С .dat предназначена для переноса данных между версиями или платформами (например, из SQL обратно в файловую версию), а SQL-бэкап .bak — для обеспечения непрерывности бизнес-процессов и быстрого восстановления работоспособности сервера.
Рекомендуем использовать SQL-бэкап как основной инструмент ежедневного резервного копирования, а выгрузку 1С — как дополнительное средство "архивного" хранения данных за прошлые годы.