Восстановление базы данных из резервной копии (бэкапа) в SQL Server — это стандартная процедура, которая, тем не менее, часто вызывает трудности у администраторов 1С. Типичная ситуация: необходимо развернуть копию рабочей базы на том же сервере для проверки данных или тестирования обновлений, но процесс прерывается ошибкой о невозможности получения монопольного доступа («Database is in use»). Рассмотрим подробно, почему возникает эта проблема и как правильно настроить процесс восстановления, чтобы не повредить основную рабочую базу.
Одной из самых опасных и частых ошибок является попытка восстановления бэкапа в новую базу без изменения путей к физическим файлам. Проанализируем ситуацию: внутри файла бэкапа (.bak) хранится информация о логических именах (например, Trade_Data) и физических путях (например, C:\SQLData\Trade.mdf). Если вы создали новую пустую базу Trade_Copy и пытаетесь восстановить в нее бэкап основной базы Trade, SQL Server по умолчанию может попытаться перезаписать файлы «живой» рабочей базы.
Для решения этой проблемы выполним следующие действия в SQL Server Management Studio (SSMS):
.mdf и .ldf указывают на новые файлы, соответствующие вашей тестовой базе, а не на файлы основной конфигурации. Это критически важно, чтобы не «похерить» (как выразились участники обсуждения) рабочую базу.Если SQL Server сообщает, что база используется, значит, к ней есть активные подключения. Это может быть консоль 1С, фоновые задания или открытые окна самой SSMS. Разберем, как принудительно освободить базу для восстановления.
На вкладке «Параметры» (Options) в окне восстановления необходимо активировать опцию «Close existing connections to destination database». Эта настройка заставляет SQL Server разорвать все текущие сессии перед началом операции.
Если стандартная «галка» в интерфейсе не помогает, воспользуемся более надежным методом — переводом базы в однопользовательский режим с помощью скрипта. Рассмотрим пример кода:
ALTER DATABASE [Имя_Вашей_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- Здесь выполняется операция восстановления
ALTER DATABASE [Имя_Вашей_Базы] SET MULTI_USER;
В этом сценарии команда ROLLBACK IMMEDIATE мгновенно прерывает все незавершенные транзакции и выгоняет пользователей, позволяя вам беспрепятственно начать работу с файлами. После завершения восстановления не забудьте вернуть режим MULTI_USER, иначе пользователи не смогут подключиться к базе.
Часто виновником того, что база «занята», является сам сервер 1С:Предприятие. Даже если пользователи вышли, кластер может запускать фоновые процессы. Проанализируем необходимые настройки в консоли администрирования 1С:
Эти действия гарантируют, что в процессе восстановления SQL Server не получит новый запрос на соединение от rphost, который мог бы помешать установке монопольного режима.
Посмотрим на дополнительные параметры, которые часто игнорируются, но могут стать причиной сбоя. На вкладке «Options» есть несколько важных переключателей:
Важно понимать фундаментальное различие в инструментах. Если вы используете файл .bak, то все манипуляции проводятся в SQL Server Management Studio. Если же вы имеете дело с файлом .dt, то восстановление происходит через Конфигуратор 1С (пункт меню «Администрирование» — «Загрузить информационную базу»).
Выясним причину, почему авторы часто путают эти понятия: файл .dt — это платформенный механизм, он не зависит от типа СУБД, тогда как .bak — это низкоуровневая копия данных самого SQL Server. Для работы с большими базами данных использование .bak является предпочтительным, так как оно значительно быстрее и надежнее.
Напоследок проанализируем ситуацию с правами. Даже если вы обладаете правами администратора в системе, служба SQL Server работает под своей учетной записью (например, NT SERVICE\MSSQLSERVER). Убедитесь, что у этой учетной записи есть права «Чтение» и «Запись» на папку, где лежит файл бэкапа и куда будут записываться файлы базы. В противном случае вы получите ошибку доступа еще на этапе выбора файла.
Также помните о правиле совместимости: вы можете восстановить базу с более старой версии SQL Server на новую (например, с 2016 на 2019), но невозможно восстановить бэкап, сделанный в SQL Server 2022, на сервер версии 2017. В таких случаях единственным выходом будет использование выгрузки через .dt.