通过管理工作室将数据库设置为multi_user

时间:2015-03-14 21:39:55

标签: sql-server database multi-user single-user

我不得不将我的数据库设置为single_user模式以允许dbcc checkdb修复,现在我无法将数据库恢复到multi_user。我在针对master数据库的查询窗口中尝试了以下命令,但它没有按照另一个堆栈溢出帖子的建议工作:

USE [master]; 
GO 

ALTER DATABASE mydb SET MULTI_USER WITH ROLLBACK IMMEDIATE; 
GO

我收到以下错误:

  

消息5064,等级16,状态1,行2改变状态或选项   数据库'mydb'目前无法制作。数据库在   单用户模式,用户当前已连接到它   消息5069,   级别16,状态1,行2 ALTER DATABASE语句失败。

如果我右键单击数据库并尝试选择属性,则会显示错误,表明它已在使用中。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

尝试终止现有连接并在同一批次中设置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

答案 1 :(得分:1)

要获取与我运行的数据库绑定的会话:

SELECT request_session_id FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID('mydb')

这产生了55

的processid 然后我跑了:

杀死55 去

我能够使用之前无效的alter multi_user行

答案 2 :(得分:0)

出现此错误的最可能的原因是,您仍然具有用于将数据库设置为单用户的原始会话。如果您在将数据库设置为单用户的同一会话中执行上述SQL,那么它将起作用。

答案 3 :(得分:-2)

首先尝试选择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