MS SQL: Не удаляется/не восстанавливается база данных 1С (There is 1 other session using the database)
Природа блокировок соединений в MS SQL
Ошибка «Cannot drop database because it is currently in use» (или «There is 1 other session using the database» при попытке RESTORE) возникает, когда администратор пытается удалить (DROP), отсоединить (DETACH) или перезаписать из бэкапа базу данных, к которой в данный момент существуют активные или спящие (SLEEPING) подключения. В архитектуре клиент-серверной 1С рабочие процессы (rphost.exe) постоянно удерживают пул соединений к СУБД MS SQL для оптимизации производительности. Даже если в консоли кластера 1С нет активных пользователей, rphost может держать фоновые соединения открытыми. Бизнес-риски: невозможность оперативно накатить бэкап при аварии, простой разработки при обновлении копий баз.
Типы блокирующих сессий
| Источник сессии (Program Name) | Статус (Status) | Причина удержания БД |
|---|---|---|
1CV8 Server (rphost) | sleeping | Пул соединений кластера 1С. Сессия не активна, но физический коннект к TCP-порту SQL не закрыт. |
Microsoft SQL Server Management Studio | runnable | У администратора открыто окно запроса (Query Window), в контексте которого выбрана данная БД (USE [Имя_Базы]). |
SQLAgent - TSQL JobStep | background | Выполняется регламентное задание SQL Server (например, обслуживание индексов). |
Методы принудительного отключения сессий
Сценарий 1: Перевод базы в однопользовательский режим (SINGLE_USER)
Самый быстрый и надежный способ отрубить все сторонние подключения и немедленно откатить их незавершенные транзакции. Выполняется в SSMS.
Переключение контекста на системную базу (важно!)
USE master;
GO
Принудительное закрытие всех соединений с откатом транзакций
ALTER DATABASE [Имя_Вашей_Базы_1С] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
Теперь можно выполнять DROP или RESTORE
DROP DATABASE [Имя_Вашей_Базы_1С];
GOСценарий 2: Поиск и завершение конкретной сессии (KILL)
Если переводить базу в SINGLE_USER нельзя, можно точечно "убить" зависший процесс.
1. Вывод всех сессий с фильтрацией по имени базы
EXEC sp_who2;
-- Или более удобный запрос:
SELECT spid, status, program_name, hostname
FROM sys.sysprocesses
WHERE dbid = DB_ID('Имя_Вашей_Базы_1С');
2. Завершение сессии по её номеру (SPID)
KILL 54; -- Где 54 - это найденный SPIDТиповые ошибки администраторов
- Оставленное окно в SSMS: Администратор пишет скрипт
RESTORE DATABASE [DB]..., но в выпадающем списке баз данных слева сверху выбрана именно эта база[DB]. SSMS сама блокирует базу. Перед восстановлением всегда выполняйтеUSE master;. - Блокировка сервером 1С: Попытка удалить базу в SQL без её предварительного удаления (или снятия галочки "Блокировка начала сеансов") в Консоли кластера 1С. Сервер 1С будет моментально пересоздавать соединения.
ITSTM автоматизирует процессы CI/CD для 1С. Мы напишем PowerShell-скрипты на базе SqlServer модуля, которые корректно гасят сеансы в кластере 1С, очищают кэши и восстанавливают SQL-базы по ночам без участия человека.
Частые вопросы (FAQ)
Что значит WITH ROLLBACK IMMEDIATE?
Эта команда принудительно обрывает коннекты и заставляет SQL Server немедленно откатить (Rollback) любые незавершенные транзакции прерванных сессий. Без неё сервер будет ждать нормального завершения работы пользователей.
Как вернуть базу обратно в многопользовательский режим?
Если вы не удаляли базу, а просто отключали пользователей, выполните команду: ALTER DATABASE [Имя_Вашей_Базы_1С] SET MULTI_USER;
Почему команда KILL SPID долго висит со статусом KILLED/ROLLBACK?
Если прерванный процесс (например, перепроведение документов в 1С) успел изменить миллионы строк, SQL Server не может просто убить его. Он обязан откатить эти изменения, читая Transaction Log, что может занять столько же времени, сколько работал сам процесс.
Можно ли разорвать соединения через графический интерфейс SSMS?
Да. При выполнении задачи (Tasks) -> Restore (Восстановление) на вкладке Options поставьте галочку 'Close existing connections to destination database' (Закрыть существующие подключения). SSMS выполнит ALTER DATABASE под капотом.