Установите базу данных из режима SINGLE USER в MULTI USER - программирование
Подтвердить что ты не робот

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

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

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

exec sp_who

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

kill [XXX]

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

Затем вы можете запустить вышеуказанный оператор.

Удачи.

Ответ 3

Вы можете добавить возможность немедленного отменить изменения.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Ответ 4

SQL Server 2012:

щелкните правой кнопкой мыши по DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_user и нажмите "ОК".

Voila!

Ответ 5

У меня была такая же проблема, и она исправлена ​​следующими шагами - ссылка: 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

Ответ 6

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

Шаг 1. Щелкните правой кнопкой мыши механизм базы данных, выберите монитор активности и посмотрите, какой процесс имеет соединение. Убейте этого конкретного пользователя и немедленно выполните запрос.

Шаг 2.

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

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

Ответ 7

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

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

Ответ 8

Лучше всего войти на сервер напрямую, а не с помощью 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-сервера и запустить его снова.

Ответ 9

Код ниже работал у меня, когда я не знал конкретного 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

Ответ 10

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

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

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

while (@spid не равно null) begin     print 'Killing process' + cast (@spid как varchar) + '...'     set @sql = 'kill' + cast (@spid как 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; GO

Ответ 11

Это сработало отлично для меня

  • Сделайте резервную копию
  • Создайте новую базу данных и восстановите резервную копию.
  • Затем Properties > Options > [Scroll down] State > RestrictAccess > выберите Multi_user и нажмите OK
  • Удалить старую базу данных

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

Ответ 12

Если вышеуказанное не работает, найдите имя пользователя spid и отключите его в Security - Logins

Ответ 13

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

  • Щелкните правой кнопкой мыши имя базы данных, переименуйте ее

  • После изменения щелкните правой кнопкой мыши по имени базы данных → properties → options → в нижней части прокрутки RestrictAccess (SINGLE_USER до MULTI_USER)

  • Теперь вы можете переименовать базу данных как свое старое имя.

Ответ 14

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

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

Примечание: если он не работает для вас, затем снова запустите резервное копирование и восстановление Db и снова выполните над методом

* Одно = SINGLE_USER

Несколько = MULTI_USER

Restricted = RESTRICTED_USER

Ответ 15

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

Единственное, что я получил, это перезапустить службу Windows SQL Server. Это позволило мне подключиться к базе данных и внести необходимые изменения или удалить базу данных и начать с нее.

Ответ 16

Я пробовал все вышеперечисленные ответы, ничего не работало для меня, кроме:

USE [master]
GO

/****** Object:  Database [DBNAME]    Script Date: 11/28/2017 13:02:27 ******/
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'DBNAME')
DROP DATABASE [DBNAME]
GO

Ответ 17

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

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

Чтобы решить эту проблему, я должен был написать операторы kill, изменение операторов User-Mode и операции Restore все в одном окне запроса, и когда я запустил их все за один раз, вуаля !!! это сработало.

Надеюсь, что это помогает другим.

Ответ 18

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

Ответ 19

У меня были проблемы с локальной БД.

Я смог решить эту проблему, остановив SQL-сервер, а затем запустив SQL-сервер, а затем с помощью пользовательского интерфейса SSMS изменил свойства БД на Multi_User.

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

Остановите SQL Server, запустите SQL Server, затем запустите приведенные выше сценарии или используйте пользовательский интерфейс.

Ответ 20

Я только что исправил с помощью следующих шагов, это может помочь вам.

Шаг: 1

right click on single user database


Шаг: 2

take offline


Шаг: 3

Drop connection and take offline


Шаг: 4

Take online


Шаг: 5

Затем выполните следующий запрос.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

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

Ответ 21

Некоторое время я гуглял в поисках решения и, наконец, нашел решение, приведенное ниже:

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

Это должно работать. Удачного кодирования !!

Спасибо!!

Ответ 22

Если вы делаете резервную копию из существующего db (A) на сервере, а затем пытаетесь восстановить его на другом db ( B) на сервере

Затем следует убедиться, что пути B правильно установлены с помощью путей mdf и ldf базы данных B.

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

Итак, нажмите на кнопки elips и задайте правильный путь mdf и ldf. база B (Пути красного и синего должны быть разными).