Встановіть базу даних з режиму SINGLE USER на MULTI USER


189

Мені потрібна допомога з встановленням бази даних, яка була відновлена ​​в SINGLE_USERрежимі MULTI_USER. Щоразу бігаю

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Я отримую цю помилку:

Наразі зміни стану або параметрів бази даних "BARDABARD" неможливо внести.

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

SINGLE_USERЩоб переключити його на інший режим, він повинен знаходитись у нережимі , але я не можу встановити базу даних у будь-якому іншому SINGLE_USERрежимі.

Відповіді:


114

"Користувач зараз підключений до нього", можливо, саме вікно студії управління SQL Server. Спробуйте вибрати головну базу даних та запустити ALTERзапит ще раз.


1
Додавання до цього: Здається, що вікно запитів може бути додано до бази даних, навіть якщо якась інша база даних (наприклад master) обрана у спадному меню Панелі доступних баз даних , коли активне вікно запитів. Якщо це неприємно болить, закрийте всі інші вікна запитів і виберіть деяку невинну базу даних системи, як-от masterабо tempdbв спадному меню в одному вікні, яке ви залишили.
CVn

Спробуйте відключити БД і знову підключитися в студії управління Microsoft SQL сервера. Потім знову запустіть команду.
Ісуру Мадусанка

Перший коментар є дуже корисним і насправді може бути доданий до відповіді. Я не зміг запустити запит, перш ніж закрити всі інші запити.
user2216

88

Це повідомлення про помилку, як правило, означає, що до БД підключені інші процеси. Спробуйте запустити це, щоб побачити, які з’єднані:

exec sp_who

Це поверне вам процес, і тоді ви зможете запустити:

kill [XXX]

Де [xxx] - spidпроцес, який ви намагаєтеся вбити.

Тоді ви можете запустити вищезгадане твердження.

Удачі.


kill [xxx] позбавляється від процесу, але коли я намагаюся запустити свою команду, вона повертається!
колмед

74

Ви можете додати можливість повернення змін негайно.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
Що ROLLBACK IMMEDIATEсаме робить?
дакаб

3
@dakab змушує всі транзакції, що очікують, негайно відкидатись з моменту початку ALTER DATABASEтранзакції оператора, на відміну від того, WITH ROLLBACK X SECONDSякий очікує завершення транзакцій перед тим, як змусити їх відкатати або чекати нескінченно до тих пір, поки не буде відкладених транзакцій (я вважаю, що це за замовчуванням, але наразі не може бути знайдено у документі). Це еквівалент "припини все, що ти робиш зараз, і роби це".
шматочки бекону

39

SQL Server 2012:

клацніть правою кнопкою миші на DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_userі натисніть кнопку ОК.

Вуаля!


5
Не справді, це те, що я отримав, коли спробував ваше рішення: / "База даних" XXX "вже відкрита і може мати лише одного користувача за один раз. (Microsoft SQL Server, помилка: 924)"
Krzysztof Wolny

1
Додатково підтверджено в SQL 2008R2.
codo-sapien

Найкраща відповідь, працюючи навіть у випадках, коли ви не маєте дозволу використовувати виписку KILL
Marco Marsala

22

У мене була така ж проблема, і вона виправлена ​​такими кроками - посилання: http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and.html

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 56 --=> kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

13

Це добре працювало для мене.

Крок 1. Клацніть правою кнопкою миші на двигуні бази даних, натисніть на монітор активності та подивіться, який процес має з'єднання. Вбийте цього конкретного користувача та виконайте запит негайно.

Крок 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

та оновити базу даних.


9

Насправді у мене виникла проблема, коли мій db був сильно заблокований процесами та умовами перегонів з ними, до моменту я оновив одну команду оновленою, і вони знову її заблокували ... Мені довелося запускати наступні команди назад до спини в SSMS і отримав мене в режимі офлайн, а звідти я відновив і повернувся в Інтернет просто чудово, два запити, де:

Перший біг:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

Потім відразу після (у другому вікні запиту):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

Зробив те, що мені потрібно, а потім повернув це в Інтернет. Дякую всім, хто написав ці твори для мене, щоб поєднати та вирішити мою проблему.


7

Можливо, найкраще увійти на сервер безпосередньо, замість використання SQL Management Studio

Переконайтеся, що обліковий запис, у який ви входите, як dbowner для бази даних, яку ви хочете встановити на MULTI_USER. Увійдіть як sa (використовуючи автентифікацію SQL-сервера), якщо можете

Якщо ваша база даних використовується IIS, зупиніть веб-сайт та пул додатків, які ним користуються - це може бути пов’язаний процес, який перешкоджає встановленню на MULTI_USER

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

Зверніться сюди, якщо у вас все ще виникають проблеми:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

ЯК ОСТАНИЙ АЛЬТЕРНАТИВ - Якщо ви спробували все вище, і ви відчайдушно можете спробувати зупинити екземпляр сервера SQL і запустити його знову


5

Я щойно виправив за допомогою наступних кроків. Це може вам допомогти.

Крок 1

клацніть правою кнопкою миші на єдиній базі даних користувачів


Крок: 2

приймати офлайн


Крок: 3

Перервіть з'єднання та перейдіть в режим офлайн


Крок: 4

Візьміть онлайн


Крок: 5

Потім запустіть наступний запит.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Насолоджуйтесь ...!


2

Код нижче працює для мене, коли я не знав конкретного SPID, який використовувався для переходу в singleuserрежим.

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

1
  1. Спробував, що все не вийшло
  2. Увійдіть на цей сервер віддалено, оскільки ми знищимо всі з'єднання
  3. запустіть наведений нижче код не раз, поки він не повернеться завершеним і більше не буде тестувати "процес убивства"
  4. знову активуйте його, використовуючи наведений нижче код

використовувати master GO оголосити @sql як varchar (20), @spid як int

виберіть @spid = min (spid) з master..sysprocess де dbid = db_id ("DB_NAME") та spid! = @@ spid

поки (@spid не є нульовим) починають друкувати "Процес вбивства" + литий (@spid як varchar) + '...' встановити @sql = 'убити' + кинути (@spid як varchar) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

потім повернути його живим

АЛЬТЕР ДАТАБАСУ НАСТРОЙКА DB_NAME MULTI_USER; ПОВЕРНУТИСЯ


1

Це добре працювало для мене

  1. Візьміть резервну копію
  2. Створіть нову базу даних і відновіть її резервну копію
  3. Потім Властивості> Опції> [Прокрутити вниз] Стан> Обмежитидоступ> виберіть Мультикористувач і натисніть кнопку ОК
  4. Видаліть стару базу даних

Сподіваюся, ця робота для всіх Дякую Рамеш Кумар


1

Якщо вищезгадане не працює, знайдіть ім'я логіна spid та відключіть його в Security - Logins


1

Ви не можете зробити цю базу даних в одному режимі. Перш за все добре, але ви повинні знати, що: коли ви відкрили студію управління sql, вона не знає жодного користувача в базі даних, але при натисканні на базу даних вона вважає вас єдиним користувачем, і ваша команда не працює. Просто зробіть це: закрийте студію управління та відкрийте її знову. нове вікно запиту, не вибираючи жодної бази даних, написати командний сценарій.

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

зробіть f5 wolla все гаразд!


0

Я вирішив проблему легко

  1. Клацніть правою кнопкою миші на ім'я бази даних, перейменуйте її

  2. Після зміни натисніть правою кнопкою миші на ім'я бази даних -> властивості -> параметри -> перейдіть до нижньої частини прокрутки RestrictAccess (від SINGLE_USER до MULTI_USER)

  3. Тепер знову можна перейменувати базу даних як ваше старе ім'я.


0

Більше 3-х випадків, працюючи з SQL Server 2014, мені довелося перетворити базу даних в режим єдиного користувача, не змінюючи нічого. Це, мабуть, сталося під час створення бази даних. Усі вищевказані методи ніколи не працювали, оскільки я завжди отримував помилку, що база даних перебуває в режимі єдиного користувача та не може бути підключена до неї.

Єдине, над чим я працював - це перезапуск служби Windows SQL Server. Це дозволило мені підключитися до бази даних та внести необхідні зміни або видалити базу даних і почати спочатку.


0

просто перейдіть до властивостей бази даних та змініть режим SINGLE USER на MULTI USER

введіть тут опис зображення

ПРИМІТКА: якщо це не працює для вас, тоді створіть резервну копію і відновіть знову Db і повторіть вищевказаний метод

* Одномісний = SINGLE_USER

Кілька = MULTI_USER

Обмежений = RESTRICTED_USER


Чим це відрізняється від запиту OP?
Squazz

так, обидва будуть працювати однаково, це те саме, що замість того, щоб використовувати CREATE Табличний запит, ми використовували sql-сервер GUI Designer Table для створення таблиці, BTS обидва будуть працювати однаково, один - метод запиту, а інший - метод GUI. користуйтеся тим, що вам подобається.
Хасан Саїд

OP чітко заявляє, що запит hes призводить до помилки. Як ви говорите, це саме те саме, що і за допомогою запиту, на який ви взагалі не даєте відповіді, ви просто захаращуєте і додаєте тут багато неправильних відповідей
Squazz,

0

Після переходу в режим однокористувача клієнт може встановити лише ОДНЕ з'єднання з SQL сервером, пам’ятайте, що «Провідник об’єктів» приймає (окреме) з'єднання, тож якщо ви намагаєтеся запустити запит для кількох користувачів у запиті Ви побачите помилку, що в режимі Однокористувача ви не можете встановити інше з'єднання.

Для мене це не проблема, хоча, в моєму випадку, було декілька автоматизованих процесів, які постійно (кожні кілька секунд) встановлювали з'єднання, тому щойно я перевів БД в режим однокористувача і відключив себе, один із процеси встановили / зайняли з'єднання (до того, як я міг розпочати операцію відновлення). Як тільки я вбиваю ці з'єднання - вони знову підключаться, і коли я запускаю команду Restore, я отримаю помилку, що з'єднання вже зайняте.

Щоб вирішити це, мені довелося писати killзаяви, зміни User-Modeвисловлювань та Restoreоперацій, все в одному вікні запитів, і коли я запускав їх усі за один раз, вуаля !!! це спрацювало.

Сподіваюся, що це допомагає іншим.


0

У мене виникли проблеми з місцевою БД.

Мені вдалося вирішити цю проблему, зупинивши SQL-сервер, а потім запустивши SQL-сервер, а потім використовуючи інтерфейс SSMS для зміни властивостей БД на Multi_User.

Коли я намагався відновити резервну копію, БД перейшов у режим "Єдиний користувач". Я не створив резервну копію цільової бази даних перед спробою відновлення (SQL 2017). це буде отримувати вас щоразу.

Зупиніть SQL Server, запустіть SQL Server, а потім запустіть вищевказані сценарії або скористайтеся інтерфейсом користувача.


0

Я деякий час погукав за рішенням і, нарешті, придумав наступне рішення,

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

Перед тим, як змінити режим доступу, вам потрібно буде перервати ці з'єднання. (Я це зробив за допомогою EXEC (@kill); в шаблоні коду нижче.)

Тоді,

Запустіть наступний 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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Це має спрацювати. Щасливе кодування !!

Дякую!!

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