我不得不将我的数据库设置为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语句失败。
如果我右键单击数据库并尝试选择属性,则会显示错误,表明它已在使用中。
非常感谢任何帮助。
答案 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