Вихід з режиму для одного користувача


208

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

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

Крім того, коли я намагаюся видалити базу даних, я отримую помилку:

Наразі зміни стану або параметрів бази даних "my_db" неможливо внести. База даних знаходиться в режимі однокористування, і користувач наразі підключений до неї.

Як вийти з режиму однокористування? У мене немає жодного користувача, який використовує цю базу даних.

Коли я намагаюся переглядати свій сайт за допомогою IIS, я отримую помилку:

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

Я відчуваю, ніби однокористувацький режим викликає це.

Відповіді:


381

SSMS взагалі використовує кілька підключень до бази даних за кадром.

Перед тим, як змінити режим доступу, вам потрібно буде перервати ці з'єднання.

По-перше, переконайтеся, що провідник об’єктів вказаний на системну базу даних, наприклад, на головну.

По-друге, виконайте 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" наразі неможливо зробити. База даних знаходиться в режимі однокористування, і користувач наразі підключений до неї. Msg 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. Якщо я запитую майстер..системи, я бачу, що з’являється кілька рядків, але потім рядки замінюються повідомленням про помилку про те, що дана база даних знаходиться в режимі єдиного користувача тощо.
youcantryreachingme

@youcantryreachingme, введіть тут повідомлення про помилку, яке ви отримували на SQL Server 2016, щоб я / хтось інший міг допомогти вам вирішити це питання.
Сатіш

те саме, що в ОП: Зміни стану або параметрів бази даних "my_db" наразі не можна вносити. База даних знаходиться в режимі однокористування, і користувач наразі підключений до неї.
youcantryreachingme

25

Щоб вимкнути режим "Єдиний користувач", спробуйте:

ALTER DATABASE [my_db] SET MULTI_USER

Щоб повернутися до режиму одиночного користувача, ви можете використовувати:

ALTER DATABASE [my_db] SET SINGLE_USER


1
Я отримую помилку: "Зміни стану або параметрів бази даних" my_db "наразі неможливо зробити. База даних знаходиться в режимі однокористування, і користувач наразі підключений до неї. Msg 5069, Рівень 16, Стан 1, Рядок 1 СТВЕРДЖУВАННЯ ПОНЯТЬ ДАТАБАЗУ.
Liondancer

1
Чи можете ви зупинити та перезапустити базу даних (очевидно, якщо це не виробнича система, яка вплине на інших користувачів), а потім повторити команду? І як заявив @CRAFTYDBA, команда повинна виконуватися з головної бази даних.
rsbarro

1
Я розширив 'Системні бази даних' і клацнув правою кнопкою миші 'майстер' і вибрав 'Новий запит' і спробував у ваших і в командах @ CRAFTYDBA. Та сама помилка = [
Liondancer

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

2
Клацніть правою кнопкою миші на сервері в лівій області та натисніть «Відключити». Переконайтеся, що у вашій базі даних відкрита лише одна вкладка SSMS (клацніть правою кнопкою миші та виберіть "Відключити інші з'єднання"), а потім виконайте оператор. Кожна вкладка та провідник об’єктів - це з'єднання; у вас може бути відкрите лише одне підключення до бази даних (отже, «однокористувацький режим»).
Одному

20
  1. Клацніть правою кнопкою миші вашу базу даних у розділі баз даних
  2. Виберіть "Властивості"
  3. Виберіть сторінку "Параметри"
  4. Прокрутіть вниз "Інші параметри" та змініть поле "Обмежити доступ"

скріншот сторінки параметрів сервера sql


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


8

У мене була така ж проблема, і session_id to kill був знайдений за допомогою цього запиту:

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

Це було ідеально. Знайшли прискіпливий SPID та повернули БД в Інтернет. Дуже дякую!
Russell Speight

8

Натисніть CTRL + 1

знайти процес, який блокує вашу базу даних. Подивіться у колонці dbname свого db та відзначте 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, що застряг у режимі SINGLE USER

- Отримайте ідентифікатор процесу (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

Додавши до відповіді Джеспера , щоб бути ще ефективнішим:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHвикористання DEADLOCK_PRIORITY5.

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

Це ухиляється від знаходження та вбивства іншого павука (що може знадобитися зробити кілька разів).

Цілком можливо, що вам доведеться бігати 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

3

Скористайтеся цим сценарієм

exec sp_who

Знайдіть колонку dbname та spid

тепер виконати

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

Сьогодні я зіткнувся з тією ж проблемою, коли мою базу даних було змінено з режиму "Багатокористувацький" на "Однокористувацький", і це врешті-решт зупинило мене публікувати базу даних.

Щоб виправити цю проблему, мені довелося закрити всі екземпляри Visual Studio і запустити команду нижче у вікні запиту сервера Sql -

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

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


0

використовувати майстер

ПОВЕРНУТИСЯ

виберіть d.name, d.dbid, spid, login_time, nt_domain, nt_username, логін із системних процесів p внутрішнє з'єднання системних баз d на p.dbid = d.dbid, де d.name = 'ім'я бази даних'

убивати 568 - вбивати павука

АЛЬТЕР Ім'я бази даних '

SET MULTI_USER йти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.