Сбой восстановления SQL с ошибкой «База данных уже открыта и может одновременно иметь только одного пользователя»
Summary: Статья базы знаний (KB), в которой описывается решение проблемы сбоя восстановления базы данных SQL при обращении пользователей к базе данных.
Symptoms
Восстановление базы данных SQL в исходное расположение завершается сбоем с ошибками, подобными следующим:
avsql Error <40258>: sqlconnectimpl_smo::get_database_data_names Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlException: Database 'Avamar1' is already open and can only have one user at a time.
Cause
Один или несколько пользователей или подключений обращаются к базе данных, в которую выполняется восстановление. Исходная база данных не может быть перезаписана, если к базе данных обращаются пользователи или подключения.
Resolution
Измените состояние базы данных с многопользовательского на однопользовательский режим.
Использование SQL Server Management Studio
Чтобы перевести базу данных в однопользовательский режим, выполните следующие действия.
-
В обозревателе объектов подключитесь к экземпляру компонента SQL Server Database Engine, а затем разверните этот экземпляр.
-
Щелкните правой кнопкой мыши базу данных, которую необходимо изменить, и выберите пункт Свойства.
-
В диалоговом окне «Свойства базы данных» откройте страницу «Параметры».
-
В параметре Ограничить доступ выберите Одиночный.
-
Если другие пользователи подключены к базе данных, появится сообщение Открытые подключения. Чтобы изменить свойство и закрыть все остальные подключения, нажмите кнопку Да.
Использование Transact-SQL
Чтобы перевести базу данных в однопользовательский режим, выполните следующие действия.
-
Подключитесь к компоненту Database Engine.
-
На панели "Стандартные" нажмите кнопку Новый запрос.
-
Скопируйте и вставьте следующий пример в окно запроса и нажмите кнопку «Выполнить». В данном примере для базы данных задается значение
SINGLE_USERдля получения монопольного доступа. Затем в примере устанавливается состояние базы данных Avamar1 в следующееREAD_ONLYи возвращает доступ к базе данных всем пользователям. Вариант завершенияWITH ROLLBACK IMMEDIATEуказывается в первомALTER DATABASEутверждение. Это приводит к откату всех незавершенных транзакций и немедленному отключению всех других подключений к базе данных Avamar1.
SQLCopy
USE master; GO ALTER DATABASE Avamar1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO ALTER DATABASE Avamar1 SET READ_ONLY; GO ALTER DATABASE Avamar1 SET MULTI_USER; GO
См.:
https://docs.microsoft.com/en-us/sql/relational-databases/databases/set-a-database-to-single-user-mode?view=sql-server-2017После этого повторите попытку восстановления базы данных SQL в исходном расположении.