Резервная копия информационной базы 1С в MS SQL Server: SSMS, T-SQL и расписание

· 11 мин

Содержание

Полную копию базы 1С на SQL сервере делают средствами самого MS SQL Server: командой BACKUP DATABASE или через пункт Tasks → Back Up… в SSMS. Пользователей при этом выгонять не нужно — SQL Server снимает согласованную копию «на ходу», а результат получается в одном файле .bak.

Частое заблуждение — что копию серверной базы надо делать через Конфигуратор выгрузкой в .dt. Выгрузка тоже работает, но требует монопольного доступа, идёт заметно дольше и на базе в сотни гигабайт превращается в ночную операцию. Бэкап средствами СУБД быстрее, не мешает работе и умеет восстанавливать данные на любой момент времени.

Что проверить перед первой копией

Пять минут подготовки снимают большую часть ошибок, которые всплывают потом.

  • 🔑 Права в SQL Server. Делать копию может член роли sysadmin или пользователь с ролью db_backupoperator в нужной базе. Для восстановления поверх существующей базы нужны права dbcreator или sysadmin.
  • 📁 Права на папку. Файл пишет не ваша учётная запись, а служба SQL Server. Для экземпляра по умолчанию это обычно NT Service\MSSQLSERVER. Ей нужны права на запись в папку с копиями.
  • 💽 Свободное место. С включённым сжатием копия базы 1С обычно занимает в несколько раз меньше файла данных .mdf, но закладывайте запас: хранить придётся несколько копий.
  • 🧭 Имя базы на SQL. Имя информационной базы в списке 1С и имя базы данных на SQL сервере могут не совпадать. Точное имя смотрите в консоли кластера: свойства информационной базы, поле База данных.
  • 📊 Модель восстановления. От неё зависит, нужен ли вам бэкап журнала. Проверка одним запросом:
SELECT name, recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
WHERE name = N'buh';

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

Копия базы 1С через SSMS вручную

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

  1. Откройте SQL Server Management Studio и подключитесь к экземпляру, где лежит база.
  2. Раскройте Databases, щёлкните правой кнопкой по базе 1С → Tasks → Back Up….
  3. На вкладке General проверьте: Backup type — Full, Back up to — Disk.
  4. Поставьте галку Copy-only backup, если у базы уже настроены регулярные копии (зачем — ниже).
  5. Удалите путь по умолчанию кнопкой Remove и добавьте свой через Add…, например D:\Backup\buh_before_update.bak.
  6. На вкладке Media Options включите Verify backup when finished и Perform checksum before writing to media.
  7. На вкладке Backup Options выберите Compress backup, если пункт доступен.
  8. Нажмите OK и дождитесь сообщения об успешном завершении.

В русской версии SSMS те же пункты называются Задачи → Создать резервную копию….

Зачем галка «Copy-only»

Обычная полная копия становится новой точкой отсчёта для разностных (differential) копий. Если админ настроил схему «полная в воскресенье + разностные ежедневно», а вы в среду сделали ручную полную копию и унесли файл на флешку, то разностные копии с четверга будут опираться на ваш файл. Восстановить их без него не получится.

Флаг COPY_ONLY делает копию «вне цепочки»: она полноценная, но расписание админа не ломает. Для любых ручных копий ставьте Copy-only.

Сжатие и редакция SQL Server

Сжатие копий есть в редакциях Standard и Enterprise. В Express его нет — пункт будет недоступен, а команда с COMPRESSION вернёт ошибку. Для баз 1С сжатие обычно уменьшает файл в 4–6 раз и ускоряет саму копию, потому что на диск пишется меньше данных.

Копирование базы скриптом T-SQL

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

DECLARE @file nvarchar(260) =
    N'D:\Backup\buh_' + FORMAT(GETDATE(), 'yyyyMMdd_HHmm') + N'.bak';

BACKUP DATABASE [buh]
TO DISK = @file
WITH COPY_ONLY, COMPRESSION, CHECKSUM, INIT, STATS = 10;

RESTORE VERIFYONLY FROM DISK = @file WITH CHECKSUM;

Что делают параметры:

ПараметрЧто даёт
COPY_ONLYкопия не влияет на цепочку разностных копий
COMPRESSIONсжатие (убрать на Express)
CHECKSUMконтрольные суммы страниц: битая страница остановит копию сразу, а не при восстановлении
INITперезаписать файл, если он уже есть, а не дописать ещё одну копию внутрь
STATS = 10сообщение о прогрессе каждые 10%

Функция FORMAT есть начиная с SQL Server 2012. Скрипт запускается в окне New Query в SSMS или из командной строки утилитой sqlcmd.

Полная, разностная и копия журнала

Для регулярной защиты одного типа копий мало. Рабочая схема для бухгалтерской базы выглядит так:

ТипКомандаКак частоЧто даёт
ПолнаяBACKUP DATABASE …раз в сутки или раз в неделюсамостоятельная точка восстановления
РазностнаяBACKUP DATABASE … WITH DIFFERENTIALежедневно между полнымиизменения с последней полной, файл меньше
ЖурналBACKUP LOG …каждые 15–60 минутвосстановление на любую минуту

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

Ночная копия по расписанию в SQL Server Agent

Руками копию делают один раз. Для ежедневной защиты базы 1С нужен планировщик. В Standard и Enterprise это SQL Server Agent.

  1. Убедитесь, что служба SQL Server Agent запущена и тип запуска у неё Автоматически. В SSMS у узла SQL Server Agent не должно быть красной стрелки.
  2. Раскройте SQL Server Agent → Jobs, правой кнопкой → New Job….
  3. На вкладке General задайте имя, например 1C buh full backup.
  4. На вкладке Steps → New…: тип Transact-SQL script (T-SQL), база master, в поле команды — скрипт копии без COPY_ONLY.
  5. На вкладке Schedules → New…: ежедневно, время вне рабочего дня, например 23:30.
  6. На вкладке Notifications настройте письмо при сбое. Для этого заранее нужен Database Mail и оператор.

Старые файлы сами не удаляются. Добавьте второй шаг или используйте мастер Management → Maintenance Plans → Maintenance Plan Wizard: в нём есть готовые задачи Back Up Database и Maintenance Cleanup Task, которая чистит .bak старше заданного срока.

Задание Agent, которое ни разу не упало, ещё не значит, что копии рабочие. Раз в месяц восстанавливайте последнюю копию в тестовую базу и открывайте её в 1С.

Если у вас SQL Server Express

В Express нет SQL Server Agent. Расписание делают Планировщиком заданий Windows. Сохраните скрипт копии в файл D:\Scripts\backup_buh.sql (без COMPRESSION) и создайте .bat:

@echo off
sqlcmd -S .\SQLEXPRESS -E -b -i "D:\Scripts\backup_buh.sql" -o "D:\Backup\backup_log.txt"
forfiles /p "D:\Backup" /m *.bak /d -14 /c "cmd /c del @path"

Первая строка делает копию под Windows-учёткой задания (-E) и пишет лог, -b возвращает код ошибки при сбое. Вторая удаляет копии старше 14 дней. В Планировщике запускайте задание от имени учётной записи, у которой есть права на базу в SQL Server, и отметьте «Выполнять вне зависимости от регистрации пользователя».

Учтите ограничение Express: размер одной базы данных — не больше 10 ГБ. Для растущей базы 1С это скорее повод перейти на Standard, чем на хитрые скрипты.

Журнал транзакций: почему растёт .ldf и что с ним делать

Самая частая жалоба после установки SQL под 1С — файл журнала .ldf вырос до размера, сопоставимого с базой, и съел диск. Причина почти всегда одна: база в модели восстановления FULL, а копии журнала никто не делает.

В модели FULL журнал хранит все изменения до тех пор, пока их не заберёт BACKUP LOG. Полная копия журнал не очищает. Отсюда два честных варианта.

МодельКогда выбиратьЧто делать с журналом
SIMPLEпотеря данных за день допустима, достаточно ночной копииничего, место в журнале освобождается само
FULLнужно восстановление на конкретную минутурегулярный BACKUP LOG каждые 15–60 минут

Копия журнала в модели FULL:

DECLARE @log nvarchar(260) =
    N'D:\Backup\buh_log_' + FORMAT(GETDATE(), 'yyyyMMdd_HHmm') + N'.trn';
BACKUP LOG [buh] TO DISK = @log WITH COMPRESSION, CHECKSUM;

Посмотреть заполнение журналов всех баз: DBCC SQLPERF(LOGSPACE);. Поле log_reuse_wait_desc из запроса в начале подскажет, чего ждёт журнал: LOG_BACKUP означает именно отсутствие копий журнала.

Как уменьшить раздутый журнал

После копии журнала (или перехода на SIMPLE) место внутри файла освобождается, но сам файл на диске не уменьшается. Сжать его можно так:

USE [buh];
DBCC SHRINKFILE (N'buh_log', 1024);  -- до 1 ГБ

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

Переключение базы из FULL в SIMPLE обрывает цепочку копий журнала. Сразу после возврата в FULL сделайте полную копию, иначе новые копии журнала будет не к чему применить.

Восстановление: поверх рабочей базы или в новую

Чаще всего копию разворачивают в новую базу: для теста обновления, для разбора ошибки, для «как было на 1-е число». Рабочую базу перезаписывают только при реальной аварии.

Развернуть копию в новую базу

Сначала узнайте логические имена файлов внутри копии:

RESTORE FILELISTONLY FROM DISK = N'D:\Backup\buh_20261007_2330.bak';

Затем восстановите под новым именем, переложив файлы, чтобы они не конфликтовали с рабочей базой:

RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh_20261007_2330.bak'
WITH MOVE N'buh'     TO N'D:\SQLData\buh_test.mdf',
     MOVE N'buh_log' TO N'D:\SQLData\buh_test_log.ldf',
     RECOVERY, STATS = 10;

Вместо buh и buh_log подставьте имена из колонки LogicalName. В SSMS то же самое делается через Databases → Restore Database…: на странице Files отметьте Relocate all files to folder, в поле Database впишите новое имя.

Подключить копию к серверу 1С

Восстановленная база на SQL — ещё не информационная база 1С. Её нужно зарегистрировать в кластере:

  1. Откройте консоль администрирования серверов 1С:Предприятия, раскройте кластер → Информационные базы → Создать → Информационная база.
  2. Укажите имя для 1С, сервер баз данных, тип СУБД MS SQL Server и в поле имени базы данных — buh_test.
  3. Обязательно включите флажок Установить блокировку регламентных заданий.
  4. После этого добавьте базу в список у пользователя в окне запуска 1С.

Без блокировки регламентных заданий копия начнёт жить своей жизнью: отправлять обмены, загружать банковские выписки, забирать документы из ЭДО. В итоге документы задвоятся или «уйдут» в тестовую базу вместо рабочей.

Восстановить рабочую базу на момент времени

При модели FULL и цепочке копий журнала можно откатить базу, например, на 14:05 — за минуту до массового удаления документов:

RESTORE DATABASE [buh] FROM DISK = N'D:\Backup\buh_full.bak'
    WITH NORECOVERY, REPLACE;
RESTORE DATABASE [buh] FROM DISK = N'D:\Backup\buh_diff.bak'
    WITH NORECOVERY;
RESTORE LOG [buh] FROM DISK = N'D:\Backup\buh_log_1400.trn'
    WITH NORECOVERY;
RESTORE LOG [buh] FROM DISK = N'D:\Backup\buh_log_1415.trn'
    WITH STOPAT = N'2026-10-07T14:05:00', RECOVERY;

Порядок строгий: полная → последняя разностная → все копии журнала по порядку → RECOVERY на последнем шаге. Пока база в состоянии Restoring…, 1С к ней подключиться не может.

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

Ошибки при копировании и восстановлении базы

Ниже — тексты ошибок SQL Server, которые встречаются при работе с базами 1С, и что с ними делать.

Диагностика: выберите симптом

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

Чем копия в .bak отличается от выгрузки .dt?
Файл .bak — физическая копия базы SQL Server: быстрая, без отключения пользователей, восстанавливается только в MS SQL той же или более новой версии. Файл .dt — логическая выгрузка 1С: медленнее, требует монопольного доступа, зато загружается в файловую базу, PostgreSQL или другую версию SQL.
Можно ли делать копию, пока бухгалтеры работают в 1С?
Да. BACKUP DATABASE не блокирует работу пользователей и даёт согласованное состояние базы на момент окончания копии. Нагрузка на диск при этом растёт, поэтому регулярные копии ставят на нерабочее время.
Сколько копий хранить?
Распространённая схема: ежедневные копии за 2 недели, еженедельные за 2–3 месяца, копии на конец каждого закрытого квартала — дольше. Хотя бы одна свежая копия должна лежать вне сервера.
Как скопировать базу 1С на другой SQL сервер?
Сделайте копию с COPY_ONLY, перенесите .bak на новый сервер, восстановите с MOVE в папки нового сервера, создайте логин для 1С и зарегистрируйте базу в кластере с блокировкой регламентных заданий.
Нужна ли отдельная копия базы tempdb или системных баз?
tempdb не копируют: она пересоздаётся при каждом запуске SQL Server. Базу master есть смысл копировать изредка — в ней хранятся логины, без которых после аварии сервера придётся заново настраивать доступ.