目前,我的数据库处于单用户模式。当我试图扩展我的数据库,我得到一个错误:

数据库my_db不可访问。

此外,当我试图删除数据库时,我得到错误:

无法更改数据库'my_db'的状态或选项 这一次。数据库为单用户模式,用户为 当前连接到它。

如何退出单用户模式?我没有任何用户使用这个数据库。

当我尝试用IIS浏览我的网站时,我得到的错误是:

类的执行期间生成了未处理的异常 当前的web请求。关于起源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

我觉得这是单用户模式造成的。


当前回答

下面的方法对我很有效:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

其他回答

使用主

GO

选择d.s ame, d.s dbid, spid, login_time, nt_domain, nt_username, loginame 从sysprocesses p内部连接sysdatabases d在p.dbid = d.dbid where d.name = '数据库名'

杀死568 -杀死蜘蛛

修改数据库名称

设置MULTI_USER 去

首先,查找并终止当前正在运行的所有进程。

然后,运行下面的T-SQL将数据库设置为MULTI_USER模式。

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

以防万一,如果有人无意中发现了这个线程,那么这里有一个防弹的解决方案,SQL Server卡在单用户模式

——获取需要终止的连接的进程ID (spid) —将'DBName'替换为数据库的实际名称

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

作为一种替代方法,你也可以使用命令" sp_who "来获取打开连接的" spid ":

或者用这个SP代替

exec sp_who

—然后执行以下命令,将[spid]和[DBName]替换为正确的值

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

我也遇到了同样的问题,使用下面的查询找到了session_id来kill:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

另一种选择是:

使数据库脱机;在短信服务中,右键单击数据库,选择脱机,勾选“删除所有连接” 运行ALTER DATABASE [Your_Db] SET MULTI_USER