退出单用户模式


208

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

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

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

目前无法更改数据库“ my_db”的状态或选项。数据库处于单用户模式,并且当前有用户连接到该数据库。

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

当我尝试使用IIS浏览站点时,出现的错误是:

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

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

Answers:


381

通常,SSMS在后台使用与数据库的多个连接。

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

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

其次,执行一个sp_who2并找到与数据库“ my_db”的所有连接。通过KILL { session id }SPID列出会话ID的地方终止所有连接sp_who2

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

执行以下代码。

-- Start in master
USE MASTER;

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

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


2
当我使用'sp_who2'命令时,我没有看到连接到'my_db'的任何DBName,也没有杀死任何这些连接。运行命令后,我得到相同的错误= [:'此时无法更改数据库'my_db'的状态或选项。数据库处于单用户模式,并且当前有用户连接到该数据库。消息5069,级别16,状态1,第1行,ALTER DATABASE语句失败'
Liondancer

2
您是否确定自己在master中,sp_who2没有显示任何数据库= my_db的行,并且对象资源管理器不在my_db上。
CRAFTY DBA 2013年

1
尝试,断开和连接SSMS。必须将某些内容连接到该数据库。另一个选项是与专用管理控制台(DAC)连接。这假定您是系统管理员。然后杀死令人讨厌的间谍。
CRAFTY DBA 2013年

1
另外,下载我的usp_who2脚本(craftydba.com/wp-content/uploads/2011/09/usp-who2.txt)。执行它。它将实用程序放置在msdb.dbo.usp_who2中。它将sp_who2的结果保存到tempdb中的用户标识下的表中,并按数据库名称进行过滤。发布错误图片,以帮助我们更多。祝好运。
CRAFTY DBA 2013年

3
找到SPID,使用以下命令:Kill100。100是会话号(SPID)。
CRAFTY DBA 2013年

45

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

该解决方案将不适合我的SQL Server 2016上。如果我查询master..sysprocesses,我看到几行出现,但随后的行与一条错误消息,给定的数据库处于单用户模式等所取代
youcantryreachingme

@youcantryreachingme,请在此处提供您在SQL Server 2016中遇到的错误消息,以便我/其他人可以帮助您解决它。
Sathish

与OP中的相同:目前无法更改数据库'my_db'的状态或选项。数据库处于单用户模式,并且当前有用户连接到该数据库。
youcantryreachingme '19

25

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER


1
我收到错误消息:“此时无法更改数据库'my_db'的状态或选项。数据库处于单用户模式,并且当前有用户连接到该数据库。消息5069,级别16,状态1,第1行的ALTER DATABASE语句失败。
Liondancer 2013年

1
您是否可以停止并重新启动数据库(显然,如果这不是会影响其他用户的生产系统),然后重试该命令?正如@CRAFTYDBA所述,该命令应从master数据库执行。
rsbarro 2013年

1
我扩展了“系统数据库”,然后右键单击“主机”,然后选择了“新查询”,并在您的@CRAFTYDBA的逗号中进行了尝试。同样的错误= [
Liondancer 2013年

1
您是否尝试停止并重新启动数据库以终止现有连接?您还可以看看这里的更多的方式来杀死到数据库的连接:stackoverflow.com/questions/11620/...
rsbarro

2
在左窗格中的服务器上单击鼠标右键,然后单击“断开连接”。确保在数据库上仅打开一个SSMS选项卡(右键单击并选择“断开其他连接”),然后执行该语句。每个选项卡和对象资源管理器都是一个连接。您只能打开一个与数据库的连接(因此为“单用户模式”)。单个用户应为“单一连接” :)祝您好运
tommy_o 2013年

20
  1. 右键单击数据库部分中的数据库
  2. 选择“属性”
  3. 选择“选项”页面
  4. 向下滚动“其他选项”,然后更改“限制访问”字段

sql server选项页面的屏幕截图


1
该解决方案在SQL Server 2016上对我不起作用。尝试访问属性会显示错误,表明数据库处于单用户模式并且已经连接了用户。
youcantryreachingme


8

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

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

太完美了 找到讨厌的SPID,并使数据库重新联机。非常感谢!
罗素·斯派特

8

按CTRL + 1

查找锁定数据库的过程。在dbname列中查找您的数据库并记下spid。现在,您必须执行该语句:

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

CTRL + 1是我不知道的非常方便的快捷方式!
泰勒·福赛斯

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

另一种选择是:

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

我的不会让我脱机,它只是说它处于单用户模式,并且用户已连接!(是的,我确实勾选了“删除所有连接”)。我最终分离了数据库!
TabbyCool

我必须使用此选项,因为没有用户连接,并且KILL命令在sa连接上不起作用。
德里克·K

6

以防万一有人偶然发现此线程,那么这里有一个针对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

感谢您提供其他信息,取得了很大的不同!
丹尼尔(Daniel)

5

不知道这是否对任何人都有用,但是我遇到了同样的问题,找不到阻碍我的过程。我关闭了SSMS,并停止了所有对本地实例的服务。然后,一旦我返回并运行了执行程序sp_who2,它就向我显示了罪魁祸首。我终止了该进程,并能够使Multi_User工作,然后重新启动服务。IIS每隔几分钟/秒就会使它命中,以查找某些软件包。


3

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


3

添加到Jespers答案中,将更加有效:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH 用途 DEADLOCK_PRIORITY5.的

发生的情况是其他进程在数据库上出现了漏洞,并且,如果您的进程具有较低的级别, 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


2

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

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

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

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


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中的可能错误!


1

我们只是在SQL 2012中经历过这一点。当我们终止将其设置为单用户的原始会话时,复制过程跳入了。但是sp_who2没有显示该新进程已附加到数据库。关闭SSMS并重新打开,然后我们就可以在数据库上看到此过程,然后我们可以杀死它并立即切换到multi_user模式,此方法可以正常工作。

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


0

使用主人

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

杀死568-杀死spid

ALTER DATABASE数据库名称'

SET MULTI_USER去

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.