MSSQL Error 3101: Exclusive access could not be obtained — Решение
Ошибка 3101 возникает при выполнении операций RESTORE DATABASE, DROP DATABASE или ALTER DATABASE, требующих эксклюзивного (монопольного) доступа к базе, если к ней остаются подключены активные пользовательские сессии или фоновые процессы.
- Сообщение:
Exclusive access could not be obtained because the database is in use(Severity 16, State 1). - Невозможность выполнить восстановление бэкапа поверх существующей рабочей или тестовой базы 1С.
- Сбои автоматических ночных регламентных задач разворачивания копий баз.
1. Идентификация сессий, удерживающих базу данных
SELECT
s.session_id,
s.login_name,
s.host_name,
s.program_name,
req.status,
req.command
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests req ON s.session_id = req.session_id
WHERE s.database_id = DB_ID('YourDatabaseName');2. Принудительный перевод базы в SINGLE_USER со сбросом транзакций
Самый надежный способ получения монопольного доступа — немедленный откат всех активных транзакций:
USE [master];
GO
ALTER DATABASE [YourDatabaseName]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO3. Выполнение операции восстановления (Restore)
RESTORE DATABASE [YourDatabaseName]
FROM DISK = N'D:\Backups\YourDatabase.bak'
WITH REPLACE;
GO4. Возврат базы в многопользовательский режим
ALTER DATABASE [YourDatabaseName]
SET MULTI_USER;
GO5. Отключение соединений на стороне кластера 1С
Если база удерживается процессами rphost, отключите блокировку регламентных заданий и сбросьте сессии через консоль администрирования 1С или PowerShell скрипт RAS/RAC.
Частые вопросы (FAQ)
Почему после команды SINGLE_USER соединение захватывает чужой процесс?
Если пул приложений 1С или мониторинг успеет переподключиться раньше вас, они займут единственный доступный слот. Выполняйте ALTER DATABASE ... SINGLE_USER и RESTORE DATABASE в одном пакете (скрипте) в рамках одного SPID.
Что делает параметр WITH ROLLBACK IMMEDIATE?
Он принудительно обрывает все активные клиентские соединения и мгновенно откатывает их незафиксированные транзакции без ожидания штатного завершения.
Может ли агент SQL Server блокировать базу?
Да, если в этот момент запущен Job резервного копирования, сбора статистики или DBCC CHECKDB.
Как закрыть все сессии к базе с помощью хранимой процедуры sp_WhoIsActive?
Найдите блокирующие SPID через EXEC sp_WhoIsActive @filter_type = 'database', @filter = 'YourDB' и выполните команду KILL для каждого session_id.