Выход из однопользовательского режима
в настоящее время, моя база данных находится в однопользовательском режиме. Когда я пытаюсь расширить базу данных, я получаю сообщение об ошибке:
база данных 'my_db' недоступна.(ObjectExplorer)
кроме того, когда я пытаюсь удалить базу данных, я получаю сообщение об ошибке:
изменения состояния или параметров базы данных 'my_db' не могут быть сделаны по адресу
эта пора. База данных находится в однопользовательском режиме, и пользователю
в настоящее время подключен к нему.
Как выхожу ли я из однопользовательского режима? У меня нет ни одного пользователя, использующего эту базу данных.
когда я пытаюсь просмотреть мой сайт с IIS, ошибка, которую я получаю:
необработанное исключение во время выполнения
текущего веб-запроса. Информация о происхождении и местонахождении
исключение можно определить с помощью трассировки стека исключений ниже.
Я чувствую, как будто однопользовательский режим вызывает это.
15 ответов:
SSMS обычно использует несколько соединений с базой данных за кулисами.
вам нужно будет убить эти соединения перед изменением режима доступа.
во-первых, убедитесь, что обозреватель объектов указывает на системную базу данных, такую как master.
во-вторых, выполните процедуру sp_who2 и найдите все соединения с базой данных 'my_db'. Убейте все соединения, сделав
KILL { session id }где идентификатор сеанса-этоSPIDперечисленыsp_who2.в-третьих, открыть новые окно запроса.
выполните следующий код.
-- Start in master USE MASTER; -- Add users ALTER DATABASE [my_db] SET MULTI_USER GOпосмотреть мои статья в блоге об управлении файлами базы данных. Это было написано для перемещения файлов, но управление пользователями то же самое.
во-первых, найти и
KILLвсе процессы, которые были запущены в данный момент.затем выполните следующие
T-SQLчтобы установить базу данных вMULTI_USERрежим.USE master GO DECLARE @kill varchar(max) = ''; SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; ' FROM master..sysprocesses WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>') EXEC(@kill); GO SET DEADLOCK_PRIORITY HIGH ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE GO
чтобы выйти из однопользовательского режима, попробуйте:
ALTER DATABASE [my_db] SET MULTI_USERчтобы переключиться в однопользовательский режим, вы можете использовать:
ALTER DATABASE [my_db] SET SINGLE_USER
для меня сработало следующее:
USE [master] SET DEADLOCK_PRIORITY HIGH exec sp_dboption '[StuckDB]', 'single user', 'FALSE'; ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
У меня была та же проблема, и session_id для убийства был найден с помощью этого запроса:
Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
нажмите CTRL + 1
найти процесс, который блокирует вашу базу данных. Посмотрите в столбце dbname для вашей БД и обратите внимание на spid. Теперь вы должны выполнить это заявление:
kill <your spid> ALTER DATABASE <your db> SET MULTI_USER;
Не уверен, что это кому-то помогает, Но у меня была та же проблема, и я не мог найти процесс, который меня задерживал. Я закрыл SSMS и остановил все службы, попавшие в локальный экземпляр. Затем, как только я вернулся и запустил exec sp_who2, он показал мне виновника. Я убил процесс и смог заставить Multi_User работать, а затем перезапустить службы. У нас были IIS, поражающие его каждые несколько минут / секунд, ища определенные пакеты.
Я столкнулся с той же проблемой сегодня утром. Это оказалось простой проблемой. У меня было открытое окно запроса, которое было настроено на однопользовательскую базу данных в обозревателе объектов. Хранимая процедура sp_who2 не показала тогда соединение. Как только я закрыл его, я смог установить его в
используйте этот скрипт
exec sp_whoнайдите столбец dbname и spid
теперь выполнить
kill spid go ALTER DATABASE [DBName] SET MULTI_USER;
другой вариант:
- отключите базу данных; в SMSS щелкните правой кнопкой мыши базу данных и выберите "Отключить", отметьте "удалить все соединения"
- выполнить
ALTER DATABASE [Your_Db] SET MULTI_USER
даже я сталкиваюсь с той же проблемой, не в состоянии найти активные соединения с my_db, чтобы убить его, но по-прежнему показывает ту же ошибку. Я в конечном итоге отключаю все возможные соединения SSMS для любой базы данных на сервере, создаю новое соединение с SSMS и изменяю его на многопользовательский.
-- Actual Code to change my_db to multi user mode USE MASTER; GO ALTER DATABASE [my_db] SET MULTI_USERПримечание: это, кажется, возможная ошибка в SQL Server 2005!
мы только что испытали это в SQL 2012. Процесс репликации подскочил, когда мы убили исходный сеанс, который установил его на одного пользователя. Но sp_who2 не показал, что новый процесс прикреплен к БД. Закрытие SSMS и повторное открытие позволили нам увидеть этот процесс в базе данных, а затем мы могли бы убить его и сразу переключиться в многопользовательский режим, и это сработало.
Я не могу понять логику этого, но это похоже на ошибку в SSMS и все еще проявляется сам в SQL 2012.
добавлять к Jespers ответ, чтобы быть еще более эффективным:
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
SET DEADLOCK_PRIORITY HIGHиспользуетDEADLOCK_PRIORITYиз 5.происходящее, что другие процессы получают трещину в базе данных и, если ваш процесс имеет более низкий
DEADLOCK_PRIORITY, то он проигрывает гонку.это исключает поиск и убийство другого spid (что может потребоваться сделать несколько раз).
возможно, что вам нужно будет запустить
ALTER DATABASEнесколько раз, (но Йеспер делает это). Измененный код:USE [master] SET DEADLOCK_PRIORITY HIGH exec sp_dboption '[StuckDB]', 'single user', 'FALSE'; ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

Comments