Выход из однопользовательского режима



в настоящее время, моя база данных находится в однопользовательском режиме. Когда я пытаюсь расширить базу данных, я получаю сообщение об ошибке:




база данных 'my_db' недоступна.(ObjectExplorer)




кроме того, когда я пытаюсь удалить базу данных, я получаю сообщение об ошибке:




изменения состояния или параметров базы данных 'my_db' не могут быть сделаны по адресу
эта пора. База данных находится в однопользовательском режиме, и пользователю
в настоящее время подключен к нему.




Как выхожу ли я из однопользовательского режима? У меня нет ни одного пользователя, использующего эту базу данных.



когда я пытаюсь просмотреть мой сайт с IIS, ошибка, которую я получаю:




необработанное исключение во время выполнения
текущего веб-запроса. Информация о происхождении и местонахождении
исключение можно определить с помощью трассировки стека исключений ниже.




Я чувствую, как будто однопользовательский режим вызывает это.

3474   15  

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

Я пробовал это работает

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
  1. щелкните правой кнопкой мыши базу данных в разделе Базы данных
  2. Выберите "Свойства"
  3. выберите "Параметры" страницы
  4. прокрутите вниз "другие параметры "и измените поле" ограничить доступ"

screenshot of options page of sql server

для меня сработало следующее:

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

    Ничего не найдено.