Установить базу данных в 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