Копия рабочей базы 1С через BACKUP и RESTORE: от бэкапа до запуска в кластере

· 11 мин

Содержание

Чтобы скопировать базу 1С средствами SQL Server, сделайте резервную копию исходной базы командой BACKUP DATABASE ... WITH COPY_ONLY, восстановите её под новым именем через RESTORE DATABASE ... WITH MOVE и зарегистрируйте получившуюся базу в кластере серверов 1С как новую информационную базу. Выгрузка в .dt при этом не нужна, а пользователи могут продолжать работать в исходной базе.

Способ хорош, когда база весит десятки гигабайт и выгрузка через Конфигуратор занимает часы. SQL Server снимает копию онлайн, сжимает её и восстанавливает в разы быстрее. Ниже пошагово: команды, настройки в SSMS, права, параметры в консоли кластера и ошибки, на которых чаще всего спотыкаются.

Что проверить до копирования базы 1С в SQL Server

Сначала убедитесь, что этот способ вам подходит. Он работает только тогда, когда и исходная база, и копия живут на MS SQL Server, а копию обслуживает кластер 1С.

СпособКогда подходитОграничения
BACKUP/RESTORE в SQL ServerБольшие базы, регулярные тестовые копии, копия на тот же или соседний SQL-серверТолько MS SQL → MS SQL; версия целевого SQL Server не ниже исходной
Выгрузка .dt в КонфигуратореПеренос на PostgreSQL, в файловый вариант или между разными СУБДМедленно на больших базах; при выгрузке и загрузке нужен монопольный доступ
Копирование .mdf/.ldfПочти никогдаНужно отключать базу от SQL Server, то есть останавливать работу

Перед началом проверьте пять вещей:

  • 🔑 Права в SQL Server. Для бэкапа нужна роль db_backupoperator в исходной базе или sysadmin. Для восстановления новой базы — серверная роль dbcreator или sysadmin.
  • 💾 Место на диске. Под файл .bak нужен объём примерно в размер занятых данных (со сжатием — в 3–6 раз меньше). Под восстановленную базу — столько же, сколько занимают файлы исходной, включая журнал транзакций.
  • 📁 Доступ службы SQL Server к папке. Файл бэкапа пишет не ваша учётная запись, а учётная запись службы SQL Server. У неё должны быть права на запись в папку бэкапа и на чтение при восстановлении.
  • 🔢 Версия SQL Server. Бэкап с SQL Server 2019 не восстановится на SQL Server 2016. Обратно — можно.
  • 🧩 Версия платформы 1С на кластере. Кластер, в котором вы зарегистрируете копию, должен работать на той же версии платформы, что и исходный, или с номером не ниже. Иначе при первом входе база потребует конвертации.

Посмотреть имя базы данных в SQL, которая стоит за информационной базой 1С, проще всего в консоли кластера: откройте свойства информационной базы, поле База данных. Имя в списке баз 1С и имя базы в SQL часто не совпадают.

Шаг 1. Резервная копия исходной базы средствами SQL

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

COPY_ONLY делает независимую копию, которая не влияет на цепочку бэкапов.

BACKUP DATABASE [buh_prod]
TO DISK = N'D:\Backup\buh_prod_copy.bak'
WITH COPY_ONLY,
     COMPRESSION,
     CHECKSUM,
     INIT,
     STATS = 10;

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

  1. COMPRESSION — сжатие. Файл получается в несколько раз меньше, бэкап часто идёт быстрее. В редакции Express сжатие недоступно, уберите этот параметр.
  2. CHECKSUM — проверка контрольных сумм страниц при записи. Повреждённая страница остановит бэкап, и вы узнаете о проблеме сразу, а не при восстановлении.
  3. INIT — перезаписать файл, если он уже есть. Без него новый бэкап допишется в тот же файл вторым набором.
  4. STATS = 10 — выводить прогресс каждые 10%.

То же самое в SSMS: правой кнопкой по базе → Задачи → Создать резервную копию. Тип — «Полная», отметьте «Только резервное копирование », на странице параметров включите сжатие и проверку контрольной суммы.

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

Шаг 2. Восстановление копии базы 1С под новым именем

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

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

В колонке LogicalName будут два имени (иногда больше): файл данных и файл журнала. Например, buh_prod и buh_prod_log. Их подставляем в MOVE:

RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh_prod_copy.bak'
WITH MOVE N'buh_prod'     TO N'E:\SQLData\buh_test.mdf',
     MOVE N'buh_prod_log' TO N'F:\SQLLog\buh_test_log.ldf',
     RECOVERY,
     STATS = 10;

После восстановления сразу выполните две команды:

ALTER DATABASE [buh_test] SET RECOVERY SIMPLE;

ALTER DATABASE [buh_test] MODIFY FILE (NAME = N'buh_prod',     NEWNAME = N'buh_test');
ALTER DATABASE [buh_test] MODIFY FILE (NAME = N'buh_prod_log', NEWNAME = N'buh_test_log');

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

В SSMS восстановление делается так: правой кнопкой по папке Базы данных → Восстановить базу данных. Источник — «Устройство», выберите файл .bak. В поле «База данных» назначения впишите новое имя. На странице «Файлы» отметьте «Переместить все файлы в папку» и проверьте, что имена файлов изменились на новые.

Внимательно смотрите на имя базы назначения. Если по ошибке оставить имя рабочей базы и отметить перезапись, SSMS восстановит вчерашние данные поверх сегодняшних. Отменить это нельзя.

Шаг 3. Владелец базы и пользователи SQL после копирования

Кластер 1С подключается к SQL Server под отдельным логином, который указан в свойствах информационной базы: например, usr1c. В восстановленной базе этот логин должен иметь права владельца.

Если копия создаётся на том же SQL-сервере, проблем обычно нет: пользователь базы связан с логином по SID, и SID совпадают. При переносе на другой сервер появляются «осиротевшие» пользователи: пользователь usr1c в базе есть, но к логину usr1c нового сервера не привязан. Найти их:

USE [buh_test];
SELECT dp.name AS db_user
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type = 'S'
  AND sp.sid IS NULL
  AND dp.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys');

Привязать пользователя к логину:

ALTER USER [usr1c] WITH LOGIN = [usr1c];

Самый надёжный вариант для баз 1С — сделать логин кластера владельцем базы целиком:

ALTER AUTHORIZATION ON DATABASE::[buh_test] TO [usr1c];

Владелец базы автоматически получает права db_owner. Платформе 1С они нужны: при обновлении конфигурации и реструктуризации она создаёт и меняет таблицы. Права только на чтение и запись данных не хватит.

Владельцем восстановленной базы становится логин, под которым выполнялось восстановление. Если восстанавливали под своей учётной записью Windows, владельцем окажетесь вы. Поэтому ALTER AUTHORIZATION полезно выполнять всегда.

Шаг 4. Регистрация скопированной базы в кластере серверов 1С

Сама по себе база в SQL Server для 1С пока не существует. Её нужно добавить в кластер как информационную базу, указав на уже готовую базу данных.

  1. Откройте консоль Администрирование серверов 1С Предприятия.
  2. Раскройте центральный сервер → Кластеры → нужный кластер → Информационные базы.
  3. Правой кнопкой → Создать → Информационная база.
  4. Заполните поля:
    • Имя — имя базы в кластере, например buh_test;
    • Сервер баз данных — имя SQL-сервера (с именем экземпляра, если он не по умолчанию: SQL01\MSSQL2019);
    • Тип СУБД — MS SQL Server;
    • База данных — имя восстановленной базы buh_test;
    • Пользователь сервера БД и пароль — логин usr1c;
    • Смещение дат — такое же, как у исходной базы.
  5. Флажок Создать базу данных в случае ее отсутствия не нужен: база уже есть.
  6. Отметьте Установить блокировку регламентных заданий.
  7. Нажмите «ОК».

Про смещение дат. Для MS SQL Server базы 1С обычно создают со смещением 2000. Посмотрите значение в свойствах исходной информационной базы и поставьте то же самое. При несовпадении все даты в копии сдвинутся на 2000 лет, и работать с ней будет нельзя.

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

Последний шаг — добавить базу в список у пользователя: в окне запуска 1С нажмите «Добавить» → «Добавление в список существующей информационной базы» → «На сервере 1С:Предприятия», укажите кластер и имя buh_test.

Первый запуск копии: что сделать в самой 1С

Конфигурации на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11 и другие) запоминают, где работает база. При первом входе в копию появится окно с сообщением о том, что информационная база перемещена или восстановлена из резервной копии.

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

После входа проверьте:

  • 🔄 Узлы обмена. В копии не должно быть активных синхронизаций с рабочими базами. Если ваш обмен настроен не на БСП, отключите его вручную.
  • 📧 Учётные записи почты и ЭДО. В тестовой базе их лучше отключить, чтобы никто случайно не отправил документ контрагенту.
  • 🏷️ Заголовок окна. Поменяйте его в настройках программы, например на «ТЕСТОВАЯ КОПИЯ», чтобы пользователи не путали базы.

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

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

Тестовую копию обычно обновляют регулярно: раз в неделю или перед каждой проверкой обновления. Всё описанное выше укладывается в один скрипт T-SQL, который запускается через sqlcmd или заданием SQL Server Agent.

DECLARE @bak NVARCHAR(260) = N'D:\Backup\buh_prod_copy.bak';

BACKUP DATABASE [buh_prod] TO DISK = @bak
WITH COPY_ONLY, COMPRESSION, CHECKSUM, INIT;

IF DB_ID(N'buh_test') IS NOT NULL
    ALTER DATABASE [buh_test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

RESTORE DATABASE [buh_test] FROM DISK = @bak
WITH REPLACE, RECOVERY,
     MOVE N'buh_prod'     TO N'E:\SQLData\buh_test.mdf',
     MOVE N'buh_prod_log' TO N'F:\SQLLog\buh_test_log.ldf';

ALTER DATABASE [buh_test] SET MULTI_USER;
ALTER DATABASE [buh_test] SET RECOVERY SIMPLE;
ALTER AUTHORIZATION ON DATABASE::[buh_test] TO [usr1c];

Запуск из командной строки или Планировщика заданий Windows:

sqlcmd -S SQL01 -E -b -i C:\Scripts\copy_buh.sql -o C:\Scripts\copy_buh.log

Ключ -E — вход под учётной записью Windows, -b — вернуть код ошибки при сбое, -o — записать вывод в лог.

SET SINGLE_USER WITH ROLLBACK IMMEDIATE обрывает все подключения к тестовой базе, в том числе сеансы 1С. Несохранённые данные пользователей копии пропадут. Запускайте скрипт ночью или заранее предупредите тестировщиков. Ещё аккуратнее — сначала включить в консоли кластера блокировку начала сеансов для buh_test, а потом запускать восстановление.

Ещё три момента автоматизации:

  • 📌 Регистрировать базу в кластере повторно не нужно. Информационная база уже ссылается на buh_test в SQL, после восстановления она просто увидит новые данные.
  • 📌 Окно о перемещении базы может появиться снова после очередного обновления копии: в базе снова оказываются данные рабочей. Каждый раз отвечайте, что это копия.
  • 📌 Если копия обновляется регулярно, держите отдельную папку под .bak и чистите старые файлы. Скрипт с INIT перезаписывает один файл, но при смене имени файлы начнут копиться.

Для работы с кластером из командной строки есть утилита rac. Например, rac cluster list покажет кластеры и их идентификаторы. Параметры создания информационной базы и управления сеансами смотрите в справке rac help infobase и rac help session.

Ошибки при копировании базы 1С через SQL и что с ними делать

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

Удаляя регистрацию из кластера, следите за флажками в окне удаления: нужно выбрать вариант, при котором база данных на SQL-сервере остаётся. Иначе консоль удалит и саму базу.

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

Можно ли так скопировать базу с MS SQL на PostgreSQL?
Нет. BACKUP и RESTORE работают только внутри MS SQL Server. Для переноса на PostgreSQL выгрузите базу в .dt в Конфигураторе и загрузите в новую базу.
Нужна ли отдельная лицензия 1С для тестовой копии?
Клиентские лицензии считаются по сеансам, а не по базам. Пользователь, вошедший в копию, занимает лицензию так же, как в рабочей базе. Отдельная лицензия на саму копию не нужна.
Что делать, если база больше 10 ГБ, а SQL Server в редакции Express?
Express ограничивает размер файла данных одной базы 10 ГБ. Восстановить в него большую базу не получится: нужна редакция Standard или выше, либо другой сервер.
Можно ли восстановить копию на тот же SQL Server, где работает рабочая база?
Можно, если хватает места на дисках и вы задали новые пути в MOVE. Учтите, что тестовая база будет делить с рабочей память и диски сервера.
Сохранятся ли в копии пользователи 1С и их пароли?
Да. Список пользователей информационной базы хранится в самой базе данных и переносится вместе с ней.