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

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

Вопрос:

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

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

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

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

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

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

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

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

Лучший ответ:

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

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

Ответ №1

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

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER

Ответ №3

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

Ответ №4

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

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE Ответ №5

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

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 Ответ №6

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

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID(‘BI_DB_Rep’); Ответ №7

Нажмите CTRL + 1

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

kill <your spid> ALTER DATABASE <your db> SET MULTI_USER; Ответ №8

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

Ответ №9

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

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

Ответ №10

На всякий случай, если кто-то наткнется на этот поток, вот пуленепробиваемое решение для 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 Ответ №11

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

Ответ №12

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

exec sp_who

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

выполните

kill spid go ALTER DATABASE [DBName] SET MULTI_USER; Ответ №13

Добавление в 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 Ответ №14

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

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

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

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

Ответ №15

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

Ответ №16

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

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

Ответ №17

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

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
идти

Оцените статью
Добавить комментарий