Восстановление клиент-серверной базы 1С из бэкапа MS SQL
Содержание
Файл .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
Это самый наглядный способ, им пользуются чаще всего.
- Откройте SSMS и подключитесь к экземпляру SQL Server, с которым работает кластер 1С.
- В обозревателе объектов щёлкните правой кнопкой по узлу
Базы данных(Databases) и выберитеВосстановить базу данных…(Restore Database…). - В блоке «Источник» отметьте
Устройство(Device), нажмите кнопку с многоточием, затемДобавитьи выберите файл .bak. - В поле «База данных» в блоке «Назначение» впишите новое имя. Например,
buh_copy. Не оставляйте имя исходной базы, если на сервере уже есть база с таким именем. - Перейдите на страницу
Файлы(Files). ОтметьтеПереместить все файлы в папку(Relocate all files to folder) и укажите папки для данных и журнала на этом сервере. Проверьте, что имена физических файлов не совпадают с файлами существующих баз. - На странице
Параметры(Options) решите, что делать с существующей базой. Перезапись нужна, только если вы осознанно заменяете базу (флажокПерезаписать существующую базу данных (WITH REPLACE)). - Нажмите
ОКи дождитесь сообщения об успешном восстановлении.
Если вы восстанавливаете поверх рабочей базы, всё, что внесли после момента бэкапа, пропадёт. Перед заменой сделайте свежую копию текущей базы и предупредите пользователей: их сеансы будут закрыты.
Флажок «Закрыть существующие соединения с целевой базой данных» обрывает работу всех, кто сейчас в этой базе. Включайте его вне рабочего времени или после того, как все вышли.
Для тестовой копии полезно сразу переключить модель восстановления на простую. Иначе журнал транзакций начнёт расти, а резервные копии этой базы никто делать не будет:
ALTER DATABASE [buh_copy] SET RECOVERY SIMPLE;
Подключение восстановленной базы к кластеру 1С
После RESTORE у вас есть база в SQL, но 1С о ней не знает. Её нужно зарегистрировать на сервере 1С:Предприятия.
Через консоль администрирования серверов 1С
- Запустите консоль администрирования серверов 1С:Предприятия и раскройте
Кластеры → <ваш кластер> → Информационные базы. - Правой кнопкой по
Информационные базы→Создать → Информационная база. - Заполните поля:
| Поле | Что указать |
|---|---|
| Имя | Имя базы в кластере, например buh_copy. Его будут вводить при подключении |
| Защищенное соединение | Выключено, если не настраивали иначе |
| Сервер баз данных | Имя экземпляра SQL: SRV-SQL или SRV-SQL\SQLEXPRESS |
| Тип СУБД | MSSQLServer |
| База данных | Имя, под которым вы восстановили бэкап (buh_copy) |
| Пользователь / пароль сервера БД | Логин SQL с правами на эту базу |
| Разрешить выдачу лицензий сервером 1С:Предприятия | По вашей схеме лицензирования |
| Смещение дат | То же, что у исходной базы. Для MS SQL по умолчанию 2000 |
| Создать базу данных в случае ее отсутствия | Снять: база уже есть |
| Установить блокировку регламентных заданий | Включить для копии рабочей базы |
- Нажмите
ОК. База появится в списке информационных баз кластера.
Смещение дат — частая ловушка. Если у исходной базы было 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 выдаёт по-английски, ниже — что он означает.
Администрирование → Выгрузить информационную базу).MOVE в команде.WITH REPLACE.ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE) и после восстановления верните MULTI_USER. Сеансы будут оборваны.RESTORE VERIFYONLY.db_owner.При удалении информационной базы из консоли кластера 1С предлагает выбрать, что сделать с базой данных. Выбирайте вариант, который оставляет базу SQL без изменений. Иначе восстановление придётся повторить.
Если после всех шагов база открывается, но 1С сообщает о несоответствии версии платформы, проблема уже не в SQL. Обновите платформу на сервере 1С и на клиентах до номера не ниже того, с которым работала исходная база.
Частые вопросы
Можно ли загрузить файл bak в файловую базу 1С?
Как восстановить базу на конкретное время, а не на момент полного бэкапа?
WITH NORECOVERY, журнал — с STOPAT на нужное время. При простой модели восстановления журналов нет, и такой возможности тоже нет.Нужна ли отдельная лицензия для восстановленной копии?
Подойдёт ли бесплатный SQL Server Express?
Сколько длится восстановление?
STATS.