Установить базу данных в multi_user через студию управления

Я должен был установить свою базу данных в режиме single_user, чтобы учесть dbcc checkdb восстановить, и теперь я не могу вернуть свою базу данных в multi_user. Я попробовал следующую команду в окне запроса к основной базе данных, но она не сработала, как это было предложено в другой публикации по переполнению стека:

USE [master]; 
GO 

ALTER DATABASE mydb SET MULTI_USER WITH ROLLBACK IMMEDIATE; 
GO

Я получаю следующую ошибку:

Сообщение 5064, Уровень 16, Состояние 1, Строка 2 В настоящее время невозможно изменить состояние или параметры базы данных "mydb". База данных находится в однопользовательском режиме, и пользователь в настоящее время подключен к ней.
Сообщение 5069, уровень 16, состояние 1, строка 2: оператор ALTER DATABASE не выполнен.

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

Любая помощь будет принята с благодарностью.

3 ответа

Решение

Чтобы получить сеанс, который был привязан к базе данных, я запустил:

ВЫБЕРИТЕ request_session_id FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID('mydb')

Это привело к процессу 55

Я тогда побежал:

убить 55 го

И я смог использовать строку alter multi_user, которая раньше не работала

Попробуйте убить существующее соединение и установить MULTI_USER в том же пакете:

USE master; 
GO
DECLARE @sql nvarchar(MAX);
SELECT @sql = ' KILL ' + CAST(session_id as varchar(5))
    FROM sys.dm_exec_sessions
    WHERE database_id = DB_ID(N'mydb');
SET @sql = @sql + N' ALTER DATABASE mydb SET MULTI_USER;';
EXEC sp_executesql @sql;
GO

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

Сначала попробуйте выбрать базу данных master и выполните команду alter.

Если это не работает, существует несколько открытых соединений с базой данных, и вы можете проверить и убить процессы

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
Другие вопросы по тегам