Изоляция базы MSSQL: SINGLE_USER WITH ROLLBACK IMMEDIATE при восстановлении
- Ошибка
RESTORE cannot process database 'db_name' because it is in use by this session(Error 3101). - Фоновые задания сервера 1С:Предприятие мгновенно перехватывают освободившееся соединение при попытке выполнить RESTORE.
- Зависание команды
ALTER DATABASE SET SINGLE_USERв бесконечном ожидании освобождения активных блокировок.
1. Принудительный перевод базы в SINGLE_USER с мгновенным сбросом сессий
USE [master];
GO
-- Принудительный сброс всех открытых сессий и перевод в однопользовательский режим
ALTER DATABASE [Enterprise1C]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO2. Выполнение операции восстановления
RESTORE DATABASE [Enterprise1C]
FROM DISK = N'D:\Backups\Enterprise1C_Fresh.bak'
WITH REPLACE, RECOVERY;
GO3. Обязательный возврат базы в многопользовательский режим
ALTER DATABASE [Enterprise1C]
SET MULTI_USER;
GO4. Скрипт экстренного завершения всех сессий конкретной базы перед RESTORE
USE [master];
GO
DECLARE @kill VARCHAR(8000) = '';
SELECT @kill = @kill + 'KILL ' + CAST(session_id AS VARCHAR(5)) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('Enterprise1C') AND session_id != @@SPID;
EXEC(@kill); Частые вопросы (FAQ)
Что произойдет, если после перевода в SINGLE_USER соединение перехватит другой процесс?
Если сторонний процесс (например, служба кластера 1С) успеет подключиться раньше вашего скрипта восстановления, ваш сеанс получит ошибку 'Changes to the state of the database failed because database is in single-user mode'.
Как гарантировать, что именно текущая сессия займет монопольный доступ в SINGLE_USER?
Выполняйте команду ALTER DATABASE ... SET SINGLE_USER и последующий RESTORE внутри единого скрипта или транзакционного блока без закрытия текущего соединения.
В чем разница между WITH ROLLBACK IMMEDIATE и WITH ROLLBACK AFTER N SECONDS?
ROLLBACK IMMEDIATE немедленно прерывает и откатывает все активные транзакции других пользователей. ROLLBACK AFTER ожидает указанное число секунд перед принудительным сбросом.
Можно ли перевести базу в RESTRICTED_USER вместо SINGLE_USER?
Да, режим RESTRICTED_USER разрешает доступ только членам ролей db_owner, dbcreator и sysadmin, что снижает риск случайного перехвата базы обычными пользователями.