退出单用户模式

时间:2013-09-23 18:10:34

标签: sql-server sql-server-2008-r2

目前,我的数据库处于单用户模式。当我尝试扩展数据库时,出现错误:

  

无法访问数据库'my_db'。(ObjectExplorer)

此外,当我尝试删除数据库时,出现错误:

  

无法对数据库'my_db'的状态或选项进行更改   这次。数据库处于单用户模式,用户是   目前已连接到它。

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

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

  

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

我觉得好像单用户模式导致了这种情况。

18 个答案:

答案 0 :(得分:316)

SSMS通常在幕后使用几个与数据库的连接。

在更改访问模式之前,您需要终止这些连接。

首先,确保对象资源管理器指向系统数据库,如master。

其次,执行sp_who2并找到数据库'my_db'的所有连接。 通过KILL { session id }执行所有连接,其中会话ID是SPID列出的sp_who2

第三,打开一个新的查询窗口。

执行以下代码。

-- Start in master
USE MASTER;

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

有关管理数据库文件的信息,请参阅我的blog article。这是为移动文件编写的,但用户管理是相同的。

答案 1 :(得分:31)

首先,找到并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

答案 2 :(得分:21)

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER

答案 3 :(得分:14)

  1. 右键单击数据库部分中的数据库
  2. 选择“属性”
  3. 选择“选项”页面
  4. 向下滚动“其他选项”并更改“限制访问权限”字段
  5. screenshot of options page of sql server

答案 4 :(得分:13)

我试过这是有效的

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

答案 5 :(得分:8)

我遇到了同样的问题,使用此查询找到了要杀死的session_id:

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

答案 6 :(得分:7)

以下对我有用:

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

答案 7 :(得分:6)

按CTRL + 1

找到锁定数据库的进程。查看db的列dbname并记下spid。现在你必须执行该语句:

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

答案 8 :(得分:5)

不确定这是否对任何人都有帮助,但我遇到了同样的问题而无法找到阻碍我的过程。我关闭了SSMS并停止了所有服务到达本地实例。然后,当我回到并运行exec sp_who2时,它向我展示了罪魁祸首。我杀死了这个进程,并且能够使Multi_User工作,然后重新启动服务。我们每隔几分钟/秒就让IIS点击一下,寻找某些包裹。

答案 9 :(得分:3)

今天早上我遇到了同样的问题。事实证明这是一个简单的问题。我打开了一个查询窗口,该窗口设置为对象资源管理器中的单个用户数据库。 sp_who2存储过程未显示连接。一旦我关闭它,我就可以将其设置为

答案 10 :(得分:3)

另一种选择是:

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

答案 11 :(得分:3)

使用此脚本

exec sp_who

找到dbname和spid列

现在执行

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

答案 12 :(得分:2)

添加到Jespers answer,更有效:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH使用DEADLOCK_PRIORITY的5。

正在发生的事情是其他进程在数据库中出现问题,如果您的进程有较低的DEADLOCK_PRIORITY,那么它将失去竞争。

这可以避免发现并杀死其他spid(可能需要多次执行)。

您可能需要多次运行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

答案 13 :(得分:2)

今天,我遇到了同样的问题,即我的数据库从“多用户”模式更改为“单用户”模式,这最终使我无法发布数据库。

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

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

此命令已将数据库从单用户更改为多用户,此后,我就能够成功发布。

答案 14 :(得分:2)

以防万一有人跌入该线程,这是针对停留在“单用户模式”下的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

答案 15 :(得分:1)

即使我遇到同样的问题,也无法找到与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中可能存在的错误!

答案 16 :(得分:1)

我们刚刚在SQL 2012中体验过这一点。 当我们终止将其设置为单个用户的原始会话时,复制过程会跳入。但是sp_who2没有显示附加到DB的新进程。 关闭SSMS并重新打开然后允许我们在数据库上看到这个过程然后我们可以杀死它并立即切换到multi_user模式并且这样做有效。

我无法弄清楚这背后的逻辑,但它似乎确实是SSMS中的一个错误,并且仍然在SQL 2012中表现出来。

答案 17 :(得分:0)

使用母版

GO

选择d.name,d.dbid,spid,login_time,nt_domain,nt_username,loginame 来自sysprocesses p内部连接sysdatabases d位于p.dbid = d.dbid,其中d.name ='数据库名称'

杀死568-杀死spid

ALTER DATABASE数据库名称'

SET MULTI_USER