Установить базу данных из режима ОДНОГО ПОЛЬЗОВАТЕЛЯ в МУЛЬТИ ПОЛЬЗОВАТЕЛЬ


189

Мне нужна помощь с настройкой базы данных, которая была восстановлена ​​в SINGLE_USERрежиме MULTI_USER. Каждый раз, когда я бегу

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Я получаю эту ошибку:

Изменения состояния или параметров базы данных «BARDABARD» не могут быть сделаны в это время.

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

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

Ответы:


114

«Пользователь в настоящее время подключен к нему» может быть само окно SQL Server Management Studio. Попробуйте выбрать базу данных master и ALTERснова выполнить запрос.


1
Добавление к этому: Похоже, что окно запроса может быть присоединено к базе данных, даже если какая-либо другая база данных (например, master) выбрана в раскрывающемся меню панели Доступные базы данных , когда окно запроса активно. Если это по-прежнему вызывает у вас головную боль, закройте все остальные окна запросов и выберите невинную системную базу данных, например, masterили tempdbв раскрывающемся списке в одном из оставленных вами окон.
CVn

Попробуйте отключить БД и снова подключиться в Microsoft SQL Server Management Studio. Затем снова запустите команду.
Исуру Мадусанка,

Первый комментарий очень полезен и может быть добавлен к ответу. Я не мог выполнить запрос, пока не закрыл все остальные запросы.
user2216

88

Это сообщение об ошибке обычно означает, что есть другие процессы, связанные с БД. Попробуйте запустить это, чтобы увидеть, какие из них связаны:

exec sp_who

Это вернет вам процесс, и тогда вы сможете запустить:

kill [XXX]

Где [xxx] - это spidпроцесс, который вы пытаетесь убить.

Тогда вы можете запустить ваше заявление выше.

Удачи.


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

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)»
Кшиштоф Вольны,

1
Дополнительно подтверждено в SQL 2008R2.
Кодо-Сапиен

Лучший ответ, работающий даже в тех случаях, когда у вас нет разрешения использовать утверждение KILL
Марко Марсала

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

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

использовать мастер GO объявить @sql как varchar (20), @spid как int

выберите @spid = min (spid) из master..sysprocesses, где dbid = db_id ('DB_NAME') и spid! = @@ spid

в то время как (@spid не является нулевым) начать печатать 'Killing process' + cast (@spid as varchar) + '...' set @sql = 'kill' + cast (@spid as varchar) exec (@sql)

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

затем вернуть его живым

ALTER DATABASE DB_NAME SET MULTI_USER; ИДТИ


1

Это работало нормально для меня

  1. Сделайте резервную копию
  2. Создать новую базу данных и восстановить в нее резервную копию
  3. Затем Свойства> Параметры> [Прокрутите вниз] Состояние> RestrictAccess> выберите Multi_user и нажмите OK
  4. Удалить старую базу данных

Надеюсь, что эта работа для всех Спасибо Рамеш Кумар



1

Вы не можете сделать это, потому что база данных в одиночном режиме. Прежде всего, но вы должны знать, что: когда вы открывали SQL Server Management Studio, он не знает ни одного пользователя в базе данных, но когда вы щелкаете по базе данных, он считает вас единственным пользователем, и ваша команда не работает. Просто сделайте это: закройте студию управления и снова откройте ее. В новом окне запроса без выбора базы данных напишите командный скрипт.

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 Server Windows. Это позволило мне подключиться к базе данных и внести необходимые изменения или удалить базу данных и начать заново.


0

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

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

ПРИМЕЧАНИЕ: если это не работает для вас, то сделайте резервную копию базы данных и восстановите ее снова, а затем повторите описанный выше метод.

* Single = SINGLE_USER

Многократное = MULTI_USER

Restricted = RESTRICTED_USER


Чем это отличается от запроса, который использует OP?
Squazz

да, оба будут работать одинаково, это то же самое, что вместо того, чтобы использовать запрос CREATE Table, мы использовали конструктор таблиц SQL Server GUI для создания таблицы, BTS оба будут работать одинаково, один - метод запроса, а другой - метод GUI. используйте то, что вам нравится.
Хасан Саид

ОП четко заявляет, что его запрос приводит к ошибке. Поскольку вы говорите, что это то же самое, что при использовании запроса, на который вы вообще не даете ответа, вы просто загромождаете и добавляете сюда множество неправильных ответов
Squazz

0

После перехода в однопользовательский режим клиент может установить только ОДНО соединение с SQL Server, помните, что «Обозреватель объектов» принимает (отдельное) соединение, поэтому, если вы пытаетесь запустить многопользовательский оператор в запросе окно, вы получите ошибку, что в однопользовательском режиме вы не можете установить другое соединение.

Для меня это не было проблемой, хотя, в моем случае, было немного автоматизированных процессов, которые постоянно (каждые несколько секунд) устанавливали соединения, поэтому, как только я перешел в БД в однопользовательском режиме и отключил себя, один из процессы установили / заняли соединение (прежде чем я смог начать операцию восстановления). Как только я разорвал эти соединения - они переподключились, и когда я запустил команду Восстановить, я получил бы ошибку, что соединение уже занято.

Чтобы решить эту проблему, я должен был написать 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.