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


208

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

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

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

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

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

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

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

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

Ответы:


381

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
Когда я использовал команду «sp_who2», я не увидел ни одного DBName, связанного с «my_db», ни одного из этих соединений. После того, как я запустил команды, я получаю ту же ошибку = [: 'Изменения состояния или параметров базы данных' my_db 'не могут быть сделаны в это время. База данных находится в однопользовательском режиме, и пользователь в настоящее время подключен к ней. Сообщение 5069, Уровень 16, Состояние 1, Строка 1 Не удалось
выполнить

2
Убедитесь, что вы в master, sp_who2 не показывает никаких строк с базой данных = my_db, а ваш обозреватель объектов отсутствует в my_db.
CRAFTY DBA

1
Попробуйте, отключив и подключив SSMS. Что-то должно быть связано с этой базой данных. Другой вариант - подключиться к выделенной консоли администратора (DAC). Это предполагает, что вы сисадмин. Тогда убей обидчика.
CRAFTY DBA

1
Также загрузите мой скрипт usp_who2 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Выполните это. Помещает утилиту в msdb.dbo.usp_who2. Он сохраняет результаты sp_who2 в таблицу в базе данных tempdb под вашим идентификатором пользователя и фильтрует по имени базы данных. Разместите изображение ошибки, чтобы помочь нам больше. Удачи.
CRAFTY DBA

3
Найдите SPID, используйте следующее: Убить 100. 100 - это номер сеанса (SPID).
CRAFTY DBA

45

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

Это решение не будет работать для меня в SQL Server 2016. Если я запрашиваю master..sysprocesses, я вижу несколько строк, но затем строки заменяются сообщением об ошибке, что данная база данных находится в однопользовательском режиме и т. Д.
youcantryreachingme

@youcantryreachingme, пожалуйста, предоставьте здесь сообщение об ошибке, которое вы получили в SQL Server 2016, чтобы я / кто-то другой мог помочь вам решить его.
Сатиш

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

25

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER


1
Я получаю сообщение об ошибке: «В настоящее время невозможно внести изменения в состояние или параметры базы данных« my_db ». База данных находится в однопользовательском режиме, и пользователь в настоящее время подключен к ней. Сообщение 5069, уровень 16, состояние 1, строка 1: оператор ALTER DATABASE не выполнен. '
Liondancer

1
Можете ли вы остановить и перезапустить базу данных (очевидно, если это не производственная система, которая повлияет на других пользователей), а затем повторить команду? И как указано @CRAFTYDBA, команда должна выполняться из основной базы данных.
rsbarro

1
Я развернул «Системные базы данных», щелкнул правой кнопкой мыши на «master», выбрал «New Query» и попробовал ввести как ваши, так и @ CRAFTYDBA запятые. Та же ошибка = [
Liondancer

1
Вы пытались остановить и перезапустить базу данных, чтобы уничтожить существующее соединение? Вы также можете посмотреть здесь другие способы уничтожения соединений с базой данных: stackoverflow.com/questions/11620/…
rsbarro

2
Щелкните правой кнопкой мыши по серверу на левой панели и выберите «Отключить». Убедитесь, что в вашей базе данных открыта только одна вкладка SSMS (щелкните правой кнопкой мыши и выберите «Отключить другие подключения»), а затем выполните инструкцию. Каждая вкладка и проводник объектов - это соединение; вы можете иметь только одно соединение с базой данных (следовательно, «однопользовательский режим»). Для одного пользователя должно быть «одно соединение» :) Удачи
tommy_o

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

скриншот страницы настроек сервера sql


1
Это решение не будет работать для меня в SQL Server 2016. Попытка доступа к свойствам показывает ошибку, что база данных находится в однопользовательском режиме и уже имеет подключенного пользователя.
youcantryreachingme


8

У меня была та же проблема, и сессионный идентификатор для уничтожения был найден с помощью этого запроса:

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

Это было прекрасно. Нашел надоедливый SPID и вернул БД в оперативный режим. Большое спасибо!
Рассел Спейт

8

Нажмите CTRL + 1

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

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

CTRL + 1 - очень удобный ярлык, о котором я не знал!
Тайлер Форсайт

7

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

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

Другим вариантом является:

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

Мой не позволил мне взять его в автономном режиме, он просто продолжал говорить, что это в однопользовательском режиме и что пользователь подключен! (да, я поставил галочку "сбросить все соединения"). Я закончил тем, что отделил базу данных вместо этого!
TabbyCool

Мне пришлось использовать эту опцию, так как не было подключено ни одного пользователя, и команда KILL не будет работать на соединении sa.
Дерек К

6

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

- Получите ID процесса (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

Спасибо за дополнительную информацию, сделал большую разницу!
Даниил

5

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


3

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


3

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

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH использования DEADLOCK_PRIORITY 5.

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

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

Вполне возможно, что вам нужно будет запускаться 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

3

Используйте этот скрипт

exec sp_who

Найти имя db и столбец spid

сейчас выполнить

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

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

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

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

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


1

Даже я сталкиваюсь с той же проблемой, не в состоянии найти активные подключения к 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!


1

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

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


0

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

ИДТИ

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

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

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

SET MULTI_USER перейти

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.