При попытке восстановить резервную копию базы данных MS SQL Server, которая используется (или планируется к использованию) в 1С:Предприятие, администраторы часто сталкиваются с критической ошибкой: «Исключительный доступ не может быть получен потому, что база данных используется». Эта ошибка возникает из-за того, что сервер SQL не может монопольно захватить ресурсы базы для перезаписи данных, так как с ней в этот момент взаимодействует другой процесс.
Давайте разберем пошагово, как проанализировать ситуацию и успешно восстановить базу.
Прежде чем приступать к восстановлению, рассмотрим, кто или что может удерживать соединение с базой:
SQL Server Agent или регламентные задачи обслуживания могут временно блокировать базу..mdf, .ldf) может приводить к блокировке на уровне файловой системы.Частой причиной ошибки является попытка восстановить данные поверх существующей базы без указания параметров перезаписи. В 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-скрипты для архивации).
Если вы хотите гарантированно отключить всех пользователей перед восстановлением, используйте команду принудительного отката транзакций. Это один из самых эффективных способов освободить ресурсы.
Выполните следующий запрос в SQL Server Management Studio:
ALTER DATABASE [ИмяВашейБазы]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
После того как база перейдет в режим SINGLE_USER, все активные сессии будут принудительно разорваны. Теперь вы можете запустить процесс восстановления. По завершении не забудьте вернуть базу в многопользовательский режим:
ALTER DATABASE [ИмяВашейБазы]
SET MULTI_USER;
Многие ошибки возникают из-за неправильной очередности действий в 1С и SQL. Рассмотрим оптимальный алгоритм работы, который исключает конфликт блокировок:
SQL Server Management Studio и создайте пустую базу данных с нужным именем. Убедитесь, что пути к файлам данных и логов (.mdf и .ldf) заданы корректно и соответствуют вашим требованиям.WITH REPLACE и проверьте вкладку «Files» (в интерфейсе восстановления), чтобы убедиться, что файлы перенаправлены в нужную папку (опция «Relocate all files»).Этот метод предпочтителен, так как он полностью разделяет процессы управления базой на уровне СУБД и процессы регистрации базы в кластере 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».