Восстановление клиент-серверной базы 1С из бэкапа MS SQL

· 10 мин

Содержание

Файл .bak загружается не в 1С, а в Microsoft SQL Server. Порядок такой: восстановите его в SQL Server Management Studio через Базы данных → Восстановить базу данных… под новым именем. Затем в консоли кластера 1С создайте информационную базу, которая смотрит на эту базу SQL. Флажок «Создать базу данных в случае ее отсутствия» при этом снимите.

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

Что проверить до загрузки базы из bak

Проверьте пять вещей до запуска восстановления: каждая из них может остановить его на середине.

📌 Версия SQL Server. Бэкап восстанавливается только на ту же или более новую версию. Копию с SQL Server 2022 на 2017 не загрузить никакими настройками. Версию сервера покажет запрос SELECT @@VERSION;. Версию, на которой снят бэкап, покажет RESTORE HEADERONLY (колонки SoftwareVersionMajor и DatabaseVersion).

📌 Редакция. У SQL Server Express есть предел: 10 ГБ на файл данных одной базы. Если в бэкапе база больше, Express её не примет.

📌 Место на диске. Нужно места не меньше, чем занимали файлы исходной базы, а не сам .bak. Бэкап мог быть сжатым, тогда база выйдет в 3–5 раз больше файла. Точные размеры покажет RESTORE FILELISTONLY (колонка Size, в байтах).

📌 Платформа 1С. Версия платформы на сервере 1С должна быть не ниже той, с которой работали с базой. Если исходная база жила на 8.3.24, а у вас кластер 8.3.18, база не откроется, даже если SQL восстановится без ошибок.

📌 Тот ли это файл. Иногда «.bak» оказывается переименованной копией файловой базы 1Cv8.1CD или архивом обработки «Резервное копирование ». Проверить просто: RESTORE HEADERONLY на таком файле выдаст ошибку формата носителя.

Посмотреть содержимое бэкапа, ничего не восстанавливая:

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

Из второго запроса выпишите логические имена файлов (колонка LogicalName). Обычно их два: файл данных и файл журнала. Эти имена понадобятся при восстановлении командой.

Положите .bak на локальный диск сервера SQL, а не на сетевую папку или рабочий стол пользователя. Служба SQL Server работает под своей учётной записью и чужие профили и шары часто не видит.

Восстановление .bak в SQL Server Management Studio

Это самый наглядный способ, им пользуются чаще всего.

  1. Откройте SSMS и подключитесь к экземпляру SQL Server, с которым работает кластер 1С.
  2. В обозревателе объектов щёлкните правой кнопкой по узлу Базы данных (Databases) и выберите Восстановить базу данных… (Restore Database…).
  3. В блоке «Источник» отметьте Устройство (Device), нажмите кнопку с многоточием, затем Добавить и выберите файл .bak.
  4. В поле «База данных» в блоке «Назначение» впишите новое имя. Например, buh_copy. Не оставляйте имя исходной базы, если на сервере уже есть база с таким именем.
  5. Перейдите на страницу Файлы (Files). Отметьте Переместить все файлы в папку (Relocate all files to folder) и укажите папки для данных и журнала на этом сервере. Проверьте, что имена физических файлов не совпадают с файлами существующих баз.
  6. На странице Параметры (Options) решите, что делать с существующей базой. Перезапись нужна, только если вы осознанно заменяете базу (флажок Перезаписать существующую базу данных (WITH REPLACE)).
  7. Нажмите ОК и дождитесь сообщения об успешном восстановлении.

Если вы восстанавливаете поверх рабочей базы, всё, что внесли после момента бэкапа, пропадёт. Перед заменой сделайте свежую копию текущей базы и предупредите пользователей: их сеансы будут закрыты.

Флажок «Закрыть существующие соединения с целевой базой данных» обрывает работу всех, кто сейчас в этой базе. Включайте его вне рабочего времени или после того, как все вышли.

Для тестовой копии полезно сразу переключить модель восстановления на простую. Иначе журнал транзакций начнёт расти, а резервные копии этой базы никто делать не будет:

ALTER DATABASE [buh_copy] SET RECOVERY SIMPLE;

Подключение восстановленной базы к кластеру 1С

После RESTORE у вас есть база в SQL, но 1С о ней не знает. Её нужно зарегистрировать на сервере 1С:Предприятия.

Через консоль администрирования серверов 1С

  1. Запустите консоль администрирования серверов 1С:Предприятия и раскройте Кластеры → <ваш кластер> → Информационные базы.
  2. Правой кнопкой по Информационные базы → Создать → Информационная база.
  3. Заполните поля:
ПолеЧто указать
ИмяИмя базы в кластере, например buh_copy. Его будут вводить при подключении
Защищенное соединениеВыключено, если не настраивали иначе
Сервер баз данныхИмя экземпляра SQL: SRV-SQL или SRV-SQL\SQLEXPRESS
Тип СУБДMSSQLServer
База данныхИмя, под которым вы восстановили бэкап (buh_copy)
Пользователь / пароль сервера БДЛогин SQL с правами на эту базу
Разрешить выдачу лицензий сервером 1С:ПредприятияПо вашей схеме лицензирования
Смещение датТо же, что у исходной базы. Для MS SQL по умолчанию 2000
Создать базу данных в случае ее отсутствияСнять: база уже есть
Установить блокировку регламентных заданийВключить для копии рабочей базы
  1. Нажмите ОК. База появится в списке информационных баз кластера.

Смещение дат — частая ловушка. Если у исходной базы было 2000, а вы зарегистрировали копию с нулём (или наоборот), даты в документах разъедутся. Значение хранится в самой базе SQL, в служебной таблице:

USE [buh_copy];
SELECT * FROM _YearOffset;

Блокировка регламентных заданий нужна, чтобы копия не начала жить своей жизнью. Иначе она загрузит выписки из банка, отправит почту, запустит обмен с сайтом или с другой базой и испортит данные рабочего контура.

Блокировку регламентных заданий потом можно снять в свойствах информационной базы в той же консоли. Делайте это только если копия становится рабочей базой.

Через окно запуска 1С

Если доступа к консоли нет, базу можно зарегистрировать из клиента. В окне запуска нажмите Добавить, выберите создание новой информационной базы, затем вариант без конфигурации и размещение «На сервере 1С:Предприятия». На следующем шаге укажите кластер, имя базы, сервер СУБД и имя восстановленной базы SQL. Флажок «Создать базу данных в случае ее отсутствия» снимите. Права администратора кластера при этом всё равно понадобятся, если на кластере они заданы.

Командой rac

На серверах без графической оболочки регистрацию выполняют утилитой rac через сервер администрирования ras. Набор параметров зависит от версии платформы, поэтому сверьтесь со справкой: rac help infobase. Узнать идентификатор кластера можно командой rac cluster list.

Права SQL и пользователи 1С после загрузки базы

Здесь два независимых уровня, их часто путают.

Уровень SQL Server

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

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

Найти осиротевших пользователей:

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

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

USE [buh_copy];
ALTER USER [user1c] WITH LOGIN = [user1c];
ALTER ROLE db_owner ADD MEMBER [user1c];

Если логина user1c на сервере нет, сначала создайте его (CREATE LOGIN) или используйте логин, под которым работают остальные базы кластера.

Уровень 1С

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

Проблемы бывают с аутентификацией Windows. Если копию развернули в другом домене, привязка пользователей к доменным учётным записям перестанет совпадать. Откройте Конфигуратор под администратором 1С, зайдите в Администрирование → Пользователи и поправьте поле пользователя ОС у нужных записей.

Загрузка базы из bak без SSMS: sqlcmd, PowerShell, PostgreSQL

Командная строка удобна, когда SSMS не установлена или восстановление нужно поставить в расписание.

sqlcmd

Утилита ставится вместе с SQL Server. Пример для бэкапа, где логические имена файлов buh и buh_log (берите свои из RESTORE FILELISTONLY):

RESTORE DATABASE [buh_copy]
FROM DISK = N'D:\Backup\buh.bak'
WITH
  MOVE N'buh'     TO N'E:\SQLData\buh_copy.mdf',
  MOVE N'buh_log' TO N'F:\SQLLog\buh_copy_log.ldf',
  STATS = 10;

Сохраните запрос в файл restore.sql и запустите:

sqlcmd -S SRV-SQL -E -i D:\Scripts\restore.sql

Ключ -E означает вход под текущей учётной записью Windows. Для SQL-логина вместо него укажите -U sa -P пароль. Параметр STATS = 10 выводит прогресс каждые 10%, на больших базах это помогает понять, что процесс не завис.

PowerShell

В модуле SqlServer есть командлет Restore-SqlDatabase. Для переноса файлов в другие папки ему передают объекты RelocateFile. На практике проще вызвать из PowerShell тот же sqlcmd или Invoke-Sqlcmd с текстом RESTORE DATABASE: так запрос остаётся одинаковым и для ручного, и для автоматического запуска.

Если база 1С на PostgreSQL

Тогда бэкап — это не .bak SQL Server, а дамп pg_dump. Его иногда тоже называют .bak. Восстанавливается он утилитой pg_restore в заранее созданную пустую базу:

createdb -U postgres -T template0 buh_copy
pg_restore -U postgres -d buh_copy -j 4 D:\Backup\buh.bak

Используйте утилиты из той сборки PostgreSQL, которая стоит под 1С. Дамп из более новой версии pg_restore старой версии прочитать не сможет. Дальше регистрация в кластере та же, только тип СУБД PostgreSQL.

СпособКогда подходитРиски
SSMSРазовое восстановление, есть доступ к серверуЛегко оставить флажок перезаписи
sqlcmdНет SSMS, нужен скрипт или задание по расписаниюОшибка в пути MOVE — восстановление не стартует
pg_restoreБаза 1С на PostgreSQLНесовпадение версий PostgreSQL
Выгрузка .dtВерсии SQL несовместимы, нужен перенос в файловый вариантНужен доступ к исходной базе

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

Ошибки чаще всего появляются уже на шаге RESTORE. Их текст SQL Server выдаёт по-английски, ниже — что он означает.

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

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

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

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

Можно ли загрузить файл bak в файловую базу 1С?
Напрямую нет. Восстановите бэкап в SQL Server, зарегистрируйте базу в кластере, выгрузите её в .dt через Конфигуратор и загрузите этот файл в новую файловую базу.
Как восстановить базу на конкретное время, а не на момент полного бэкапа?
Нужна цепочка: полный бэкап, при наличии разностный и все бэкапы журнала транзакций. Полный и разностный восстанавливают с WITH NORECOVERY, журнал — с STOPAT на нужное время. При простой модели восстановления журналов нет, и такой возможности тоже нет.
Нужна ли отдельная лицензия для восстановленной копии?
Нет. Клиентские лицензии расходуются на сеансы, а не на базы. Но каждый вход в копию занимает лицензию так же, как вход в рабочую базу.
Подойдёт ли бесплатный SQL Server Express?
Да, если файл данных базы не больше 10 ГБ. Для небольших баз и тестовых копий этого хватает.
Сколько длится восстановление?
Зависит от дисков. Ориентировочно база на 20–30 ГБ на SSD восстанавливается за 5–15 минут, на HDD дольше. Прогресс показывает параметр STATS.