4

我必须将我的数据库设置为 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 语句失败。

如果我右键单击数据库并尝试选择属性,那么它会出错,说它已经在使用中。

任何帮助将不胜感激。

4

4 回答 4

5

尝试在同一批次中终止现有连接并设置 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
于 2015-03-14T23:52:12.537 回答
3

为了获得与我运行的数据库相关的会话:

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

这产生了 55 的 processid

然后我跑了:

杀 55 去

而且我能够使用以前不起作用的 alter multi_user 行

于 2015-03-15T01:42:31.300 回答
0

您收到此错误的最可能原因是您仍然打开了用于将数据库设置为单个用户的原始会话。如果您在将数据库设置为单用户的同一会话中执行上述 SQL,它将起作用。

于 2019-03-21T13:16:45.913 回答
-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
于 2015-03-14T21:46:17.997 回答