При обслуживании и тестировании клиент-серверных баз 1С часто возникает задача развернуть резервную копию рабочей базы в существующую тестовую. Нередко в процессе восстановления через среду SQL Server Management Studio (SSMS) процесс останавливается с ошибкой: «не удалось получить монопольный доступ, так как база данных используется» (Exclusive access could not be obtained because the database is in use). При этом в консоли «Администрирование серверов 1С:Предприятия» список сеансов и соединений к этой информационной базе может быть абсолютно чистым.
Разберем детально, почему так происходит и какими способами можно гарантированно освободить базу для успешного наката бэкапа.
Проанализируем техническую сторону взаимодействия платформы 1С и СУБД MS SQL Server. Существует три основных источника скрытых блокировок:
rphost) удерживают физические TCP-соединения с MS SQL даже после того, как все пользователи вышли, а сеансы завершились. Пул соединений предназначен для оптимизации производительности, чтобы не тратить ресурсы на повторную авторизацию при новых запросах. С точки зрения MS SQL эти коннекты являются активными, что препятствует получению монопольного доступа.USE test), среда сама удерживает монопольную блокировку. Также блокировать базу может развернутое дерево таблиц в обозревателе объектов (Object Explorer).Если восстановление выполняется через графический интерфейс Management Studio, рассмотрим параметры, позволяющие сбросить коннекты автоматически:
Посмотрим на более надежный и быстрый способ, исключающий необходимость вручную искать сессии через sp_who и сбрасывать их командой KILL. Переведем базу в монопольный режим одной командой с немедленным откатом незавершенных транзакций (WITH ROLLBACK IMMEDIATE).
Откроем новое окно запроса (убедившись, что контекстом выбрана база master) и выполним следующий сценарий:
USE master;
GO
-- Принудительно отключаем все процессы от базы test
ALTER DATABASE [test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- Выполняем восстановление с перезаписью файлов
RESTORE DATABASE [test]
FROM DISK = 'C:\Backup\work_db.bak'
WITH REPLACE, RECOVERY;
GO
-- Возвращаем многопользовательский режим
ALTER DATABASE [test] SET MULTI_USER;
GO
Конструкция ROLLBACK IMMEDIATE мгновенно разрывает открытые пулы соединений рабочих процессов 1С и любые зависшие сеансы, после чего процедура накатывания бэкапа проходит без ошибок монопольного доступа.
Разберем, как корректно разорвать соединения на стороне сервера приложений 1С, если нет возможности вмешиваться в скрипты СУБД:
Блокировка начала сеансов включена и Блокировка регламентных заданий включена.rphost продолжает удерживать порт, выполним перезапуск службы агента сервера 1С (1C:Enterprise Server Agent) через оснастку служб Windows. Перезапуск службы гарантированно освободит все удерживаемые таблицы и файлы СУБД.Проанализируем сопутствующие настройки, о которых важно помнить после успешного восстановления:
sa, после перезаписи идентификаторы безопасности (SID) разойдутся. Чтобы восстановить сопоставление пользователя с логином уровня сервера, выполним команду:
USE [test];
ALTER USER [db_user_1c] WITH LOGIN = [db_user_1c];