Почему возникает ошибка «Исключительный доступ» при восстановлении базы SQL для 1С и как ее исправить?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При попытке восстановить резервную копию базы данных MS SQL Server, которая используется (или планируется к использованию) в 1С:Предприятие, администраторы часто сталкиваются с критической ошибкой: «Исключительный доступ не может быть получен потому, что база данных используется». Эта ошибка возникает из-за того, что сервер SQL не может монопольно захватить ресурсы базы для перезаписи данных, так как с ней в этот момент взаимодействует другой процесс.

Давайте разберем пошагово, как проанализировать ситуацию и успешно восстановить базу.

Основные причины блокировки базы данных

Прежде чем приступать к восстановлению, рассмотрим, кто или что может удерживать соединение с базой:

  1. Сервер 1С:Предприятие: если база уже добавлена в консоль кластера (настроить мониторинг кластера важно для диагностики), службы 1С постоянно проверяют ее доступность и пытаются установить соединения.
  2. SQL Server Management Studio (SSMS): если у вас открыто окно запросов или обозреватель объектов, сфокусированный на данной базе, это создает активную сессию.
  3. Фоновые процессы SQL: работа SQL Server Agent или регламентные задачи обслуживания могут временно блокировать базу.
  4. Антивирусное ПО: активное сканирование файлов данных (.mdf, .ldf) может приводить к блокировке на уровне файловой системы.

Метод 1: Использование параметра REPLACE

Частой причиной ошибки является попытка восстановить данные поверх существующей базы без указания параметров перезаписи. В SQL Server по умолчанию защита от случайной перезаписи не позволяет «накатить» один бэкап на другой. Необходимо использовать параметр WITH REPLACE.

Если вы выполняете восстановление через SQL-скрипт, воспользуйтесь следующей конструкцией:


RESTORE DATABASE [ИмяВашейБазы]
FROM DISK = 'C:\Backup\MyBase.bak'
WITH REPLACE,
MOVE 'Logical_Data_Name' TO 'C:\SQLData\MyBase.mdf',
MOVE 'Logical_Log_Name' TO 'C:\SQLData\MyBase.ldf';

Использование ключа WITH REPLACE заставляет SQL Server перезаписать существующую базу данных, даже если ее идентификаторы (GUID) или имена файлов не совпадают с исходными (для автоматизации процесса можно использовать SQL-скрипты для архивации).

Метод 2: Принудительный перевод в однопользовательский режим

Если вы хотите гарантированно отключить всех пользователей перед восстановлением, используйте команду принудительного отката транзакций. Это один из самых эффективных способов освободить ресурсы.

Выполните следующий запрос в SQL Server Management Studio:


ALTER DATABASE [ИмяВашейБазы] 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;

После того как база перейдет в режим SINGLE_USER, все активные сессии будут принудительно разорваны. Теперь вы можете запустить процесс восстановления. По завершении не забудьте вернуть базу в многопользовательский режим:


ALTER DATABASE [ИмяВашейБазы] 
SET MULTI_USER;

Метод 3: Правильная последовательность действий

Многие ошибки возникают из-за неправильной очередности действий в 1С и SQL. Рассмотрим оптимальный алгоритм работы, который исключает конфликт блокировок:

  1. Создание пустой базы в MS SQL: Сначала зайдите в SQL Server Management Studio и создайте пустую базу данных с нужным именем. Убедитесь, что пути к файлам данных и логов (.mdf и .ldf) заданы корректно и соответствуют вашим требованиям.
  2. Восстановление данных: Выполните восстановление бэкапа в эту пустую базу. Именно на этом этапе используйте WITH REPLACE и проверьте вкладку «Files» (в интерфейсе восстановления), чтобы убедиться, что файлы перенаправлены в нужную папку (опция «Relocate all files»).
  3. Подключение 1С: Только после того, как база успешно развернута в SQL, открывайте консоль администрирования 1С. Создайте новую информационную базу и укажите параметры подключения к уже существующей, готовой базе данных.

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

Дополнительные советы

Если ошибка сохраняется, выполните запрос для поиска «виновника» блокировок (также рекомендуем инструменты анализа SQL):


SELECT * FROM sys.sysprocesses 
WHERE dbid = DB_ID('ИмяВашейБазы');

Результат покажет SPID (идентификатор процесса) и имя приложения, которое удерживает соединение. Если вы видите, что блокировку создает, например, msmdsrv.exe или процессы 1cv8.exe, завершите их через «Диспетчер задач» или монитор активности SQL Server.

Всегда проверяйте пути к файлам базы данных. Если при восстановлении SQL Server пытается обратиться к пути, который был задан в исходной базе (из которой делался бэкап), а этот путь занят или недоступен, вы также получите ошибку доступа. Обязательно проверяйте пути на вкладке «Files» в мастере восстановления и используйте кнопку «Relocate all files to folder».

← На главную