退出单用户模式

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

数据库my_db不可访问。

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

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

.当前连接到它

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

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

命令执行过程中产生了一个未处理的异常 当前的web请求。关于起源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常

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

395697 次浏览

要切换出单用户模式,请尝试:

ALTER DATABASE [my_db] SET MULTI_USER

要切换回单用户模式,您可以使用:

ALTER DATABASE [my_db] SET SINGLE_USER

SSMS通常在幕后使用到数据库的多个连接。在改变访问模式之前,你需要杀死这些连接:

  1. 首先,确保对象资源管理器指向像master这样的系统数据库。
  2. 其次,执行sp_who2并找到到数据库'my_db'的所有连接。 通过执行KILL { session id }终止所有连接,其中会话id是sp_who2列出的SPID .
  3. 第三,打开一个新的查询窗口。

在这3个步骤之后,执行以下代码。

-- Start in master
USE MASTER;


-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

请参阅管理数据库文件的博客文章。这是为移动文件编写的,但用户管理是相同的。

不确定这是否对任何人都有帮助,但我也有同样的问题,找不到阻碍我的过程。我关闭了SSMS并停止了所有访问本地实例的服务。然后,当我返回并运行exec sp_who2时,它显示了罪魁祸首。我杀死了进程,并能够让Multi_User工作,然后重新启动服务。我们让IIS每隔几分钟/秒就会搜索特定的包。

我试过了,有效果

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

即使我遇到同样的问题,无法找到my_db的活动连接来杀死它,但仍然显示同样的错误。我最终断开了服务器上任何数据库的所有可能的SSMS连接,从SSMS创建一个新连接,并将其更改为多用户。

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

注意:这似乎是SQL Server 2005中的一个可能的错误!

今天早上我遇到了同样的问题。这原来是一个简单的问题。我打开了一个查询窗口,它被设置为对象资源管理器中的单用户数据库。sp_who2存储过程没有显示该连接。一旦我把它合上,我就能把它设置成

下面的方法对我很有效:

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
我们刚刚在SQL 2012中经历了这个。 当我们终止将其设置为单个用户的原始会话时,复制进程跳入。但是sp_who2没有显示附加到DB的新进程。 关闭SSMS并重新打开可以让我们在数据库上看到这个进程,然后我们可以立即杀死它并切换到multi_user模式,这是有效的

我不知道这背后的逻辑,但它确实是SSMS中的一个错误,并且仍然在SQL 2012中表现出来。

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

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

首先,找到并KILL当前正在运行的所有进程。

然后,运行下面的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

按CTRL + 1

找到锁定数据库的进程。在dbname列中查找您的db并注意spid。现在你必须执行这个语句:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

另一种选择是:

  • 使数据库脱机;在短信服务中,右键单击数据库,选择脱机,勾选“删除所有连接”
  • 运行ALTER DATABASE [Your_Db] SET MULTI_USER
  1. 右键单击数据库部分中的数据库
  2. 选择“属性”
  3. 选择“选项”页
  4. 向下滚动“其他选项”并更改“限制访问”字段

截图of options page of sql server

添加到jesper回答,以便更有效:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH使用5的DEADLOCK_PRIORITY

正在发生的事情是,其他进程在数据库中有一个漏洞,如果你的进程有一个较低的DEADLOCK_PRIORITY,那么它就会输掉比赛。

这避免了寻找和杀死另一只蜘蛛(这可能需要做几次)。

你可能需要运行ALTER DATABASE不止一次,(但Jesper会这样做)。修改代码:

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

使用脚本

exec sp_who

找到dbname和spid列

现在执行的

kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;

今天我遇到了同样的问题,我的数据库从多用户模式改为单用户模式,这最终阻止了我发布数据库。

为了解决这个问题,我不得不关闭所有Visual Studio实例,并在Sql Server查询窗口中运行以下命令-

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

这个命令将数据库从单用户更改为多用户,之后,我成功地能够发布。

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

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

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

使用主

select d.s ame, d.s dbid, spid, login_time, nt_domain, nt_username, loginame 从p.dbid sysprocesses p内连接sysdatabases d = d.dbid d.name =“数据库名称”< / p >

杀死568 -杀死蜘蛛

修改数据库名称

< p > MULTI_USER设置 去< / p >

对我来说最简单的答案是使用SSMS来获取DBOffline(检查kill current connections复选框),然后在使用之前将其恢复在线:

USE MASTER;
ALTER DATABASE <DBName> SET MULTI_USER
GO
USE [master];
GO
ALTER DATABASE [database-Name] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO