Резервная копия информационной базы 1С в MS SQL Server: SSMS, T-SQL и расписание
Содержание
Полную копию базы
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 вручную
Графический способ подходит для разовой копии: перед обновлением конфигурации, перед закрытием периода, для передачи базы разработчику.
- Откройте SQL Server Management Studio и подключитесь к экземпляру, где лежит база.
- Раскройте
Databases, щёлкните правой кнопкой по базе 1С →Tasks → Back Up…. - На вкладке
Generalпроверьте:Backup type—Full,Back up to—Disk. - Поставьте галку
Copy-only backup, если у базы уже настроены регулярные копии (зачем — ниже). - Удалите путь по умолчанию кнопкой
Removeи добавьте свой черезAdd…, напримерD:\Backup\buh_before_update.bak. - На вкладке
Media OptionsвключитеVerify backup when finishedиPerform checksum before writing to media. - На вкладке
Backup OptionsвыберитеCompress backup, если пункт доступен. - Нажмите
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.
- Убедитесь, что служба
SQL Server Agentзапущена и тип запуска у неёАвтоматически. В SSMS у узлаSQL Server Agentне должно быть красной стрелки. - Раскройте
SQL Server Agent → Jobs, правой кнопкой →New Job…. - На вкладке
Generalзадайте имя, например1C buh full backup. - На вкладке
Steps→New…: типTransact-SQL script (T-SQL), базаmaster, в поле команды — скрипт копии безCOPY_ONLY. - На вкладке
Schedules→New…: ежедневно, время вне рабочего дня, например 23:30. - На вкладке
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С, сервер баз данных, тип СУБД
MS SQL Serverи в поле имени базы данных —buh_test. - Обязательно включите флажок
Установить блокировку регламентных заданий. - После этого добавьте базу в список у пользователя в окне запуска 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С, и что с ними делать.
NT Service\MSSQLSERVER) права на запись. Для сетевой папки используйте путь вида \\server\backup, а не подключённый диск Z: — службе он не виден.ALTER DATABASE [buh] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; — это мгновенно оборвёт всех пользователей, поэтому только вне рабочего времени. После восстановления верните SET MULTI_USER.WITH REPLACE, если перезапись действительно нужна..dt в Конфигураторе.BACKUP LOG, настройте его расписание или переведите базу в SIMPLE и сразу снимите полную копию.ALTER AUTHORIZATION ON DATABASE::[buh_test] TO [login1c];. Тот же логин укажите в свойствах информационной базы в консоли кластера.Частые вопросы
Чем копия в .bak отличается от выгрузки .dt?
.bak — физическая копия базы SQL Server: быстрая, без отключения пользователей, восстанавливается только в MS SQL той же или более новой версии. Файл .dt — логическая выгрузка 1С: медленнее, требует монопольного доступа, зато загружается в файловую базу, PostgreSQL или другую версию SQL.Можно ли делать копию, пока бухгалтеры работают в 1С?
BACKUP DATABASE не блокирует работу пользователей и даёт согласованное состояние базы на момент окончания копии. Нагрузка на диск при этом растёт, поэтому регулярные копии ставят на нерабочее время.Сколько копий хранить?
Как скопировать базу 1С на другой SQL сервер?
COPY_ONLY, перенесите .bak на новый сервер, восстановите с MOVE в папки нового сервера, создайте логин для 1С и зарегистрируйте базу в кластере с блокировкой регламентных заданий.Нужна ли отдельная копия базы tempdb или системных баз?
tempdb не копируют: она пересоздаётся при каждом запуске SQL Server. Базу master есть смысл копировать изредка — в ней хранятся логины, без которых после аварии сервера придётся заново настраивать доступ.