Подтвердить что ты не робот

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

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

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

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

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

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

Когда я пытаюсь просматривать мой сайт с помощью IIS, возникает ошибка:

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

Мне кажется, что однопользовательский режим вызывает это.

4b9b3361

Ответ 1

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

См. статью статьи в блоге об управлении файлами базы данных. Это было написано для перемещения файлов, но управление пользователями одинаковое.

Ответ 2

Сначала найдите и 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

Ответ 3

Чтобы выйти из режима одиночного пользователя, попробуйте:

ALTER DATABASE [my_db] SET MULTI_USER

Чтобы вернуться в режим одиночного пользователя, вы можете использовать:

ALTER DATABASE [my_db] SET SINGLE_USER

Ответ 4

  1. Щелкните правой кнопкой мыши свою базу данных в разделе баз данных
  2. Выберите "Свойства"
  3. Выберите страницу "Опции"
  4. Прокрутите вниз "Другие параметры" и измените поле "Ограничить доступ"

screenshot of options page of sql server

Ответ 5

Я пробовал, что работает

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

Ответ 6

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

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

Ответ 7

У меня была та же проблема, и session_id для kill был найден с использованием этого запроса:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

Ответ 8

Нажмите CTRL + 1

найдите процесс блокировки базы данных. Посмотрите в столбце dbname для вашего db и обратите внимание на spid. Теперь вы должны выполнить это утверждение:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

Ответ 9

Не уверен, что это кому-то помогает, но у меня была такая же проблема, и я не мог найти процесс, который меня удерживал. Я закрыл SSMS и остановил все службы, попав в локальный экземпляр. Затем, как только я вернулся и запустил exec sp_who2, он показал мне преступника. Я убил процесс и смог заставить Multi_User работать, а затем перезапустить службы. У меня IIS ударил его каждые несколько минут/секунд в поисках определенных пакетов.

Ответ 10

Другой вариант:

  • отключить базу данных; в SMSS, щелкните правой кнопкой мыши базу данных и выберите "Вступить в автономный режим", отметьте "Отбросить все соединения"
  • run ALTER DATABASE [Your_Db] SET MULTI_USER

Ответ 11

На всякий случай, если кто-то наткнется на этот поток, вот пуленепробиваемое решение для SQL Server, застрявшее в РЕЖИМЕ ОДНОГО ПОЛЬЗОВАТЕЛЯ

- Получите идентификатор процесса (spid) соединения, которое нужно прервать.
- Замените "DBName" на фактическое имя БД

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

В качестве альтернативы вы также можете использовать команду 'sp_who', чтобы получить 'spid' открытого соединения:

- Или используйте этот SP вместо

exec sp_who

- Затем выполните следующее и замените [spid] и [DBName] правильными значениями

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Ответ 12

Я столкнулся с тем же вопросом сегодня утром. Это оказалось простой проблемой. У меня было открыто окно запроса, которое было настроено на однопользовательскую базу данных в проводнике объектов. Хранимая процедура sp_who2 не показывала соединение. Как только я его закрыл, я смог установить его на

Ответ 13

Используйте этот Script

exec sp_who

Найдите столбец dbname и spid

выполните

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

Ответ 14

Добавление в Jespers answer, чтобы быть еще более эффективным:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH использует DEADLOCK_PRIORITY из 5.

Что происходит, так это то, что другие процессы получают трещину в базе данных, а если ваш процесс имеет меньший DEADLOCK_PRIORITY, то он теряет гонку.

Это устраняет обнаружение и уничтожение другого spid (что может потребоваться несколько раз).

Возможно, вам нужно будет запускать ALTER DATABASE более одного раза (но Jesper делает это). Измененный код:

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

Ответ 15

Сегодня я столкнулся с той же проблемой, когда моя база данных была изменена с многопользовательского на однопользовательский режим, и это в конечном итоге остановило меня для публикации базы данных.

Чтобы решить эту проблему, мне пришлось закрыть все экземпляры Visual Studio и запустить следующую команду в окне запроса Sql Server -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

Эта команда изменила БД с однопользовательского на многопользовательский, и после этого мне удалось опубликовать.

Ответ 16

Даже я сталкиваюсь с той же проблемой, не могу найти активные подключения к my_db, чтобы убить ее, но все же показывает ту же ошибку. Я в конечном итоге отключу все возможные SSMS-подключения для любой базы данных на сервере, создаю новое соединение из SSMS и меняю его на Multi user.

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

Примечание. Это похоже на возможную ошибку в SQL Server 2005!

Ответ 17

Мы просто испытали это в SQL 2012. Процесс репликации вскочил, когда мы убили исходный сеанс, который установил его для одного пользователя. Но sp_who2 не показывал, что новый процесс подключен к БД. Закрытие SSMS и повторное открытие затем позволяли нам видеть этот процесс в базе данных, а затем мы могли убить его и сразу перейти в режим multi_user, и это сработало.

Я не могу решить эту логику, но, похоже, это ошибка в SSMS и все еще проявляется в SQL 2012.

Ответ 18

использовать мастер

GO

выберите d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame из системных процессов p внутреннее объединение системных баз данных d для p.dbid = d.dbid, где d.name = "имя базы данных"

убить 568 - убить спида

Имя базы данных ALTER DATABASE '

SET MULTI_USER идти