Вопрос:
В настоящее время моя база данных находится в режиме одиночного пользователя. Когда я пытаюсь расширить базу данных, я получаю сообщение об ошибке:
База данных ‘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
- Щелкните правой кнопкой мыши свою базу данных в разделе баз данных
- Выберите “Свойства”
- Выберите страницу “Опции”
- Прокрутите вниз “Другие параметры” и измените поле “Ограничить доступ”
Ответ №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
идти