244

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

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

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

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

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

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

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

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

4

19 回答 19

440

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

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

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

其次,执行 asp_who2并查找到数据库“my_db”的所有连接。KILL { session id }通过执行where session id isSPID列出的来终止所有连接sp_who2

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

执行以下代码。

-- Start in master
USE MASTER;

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

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

于 2013-09-23T18:19:41.973 回答
58

首先,查找和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
于 2016-08-26T10:42:49.850 回答
31

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER

于 2013-09-23T18:14:20.323 回答
30
  1. 右键单击数据库部分中的数据库
  2. 选择“属性”
  3. 选择“选项”页面
  4. 向下滚动“其他选项”并更改“限制访问”字段

sql server 选项页面截图

于 2016-11-14T06:15:07.127 回答
17

我试过这是有效的

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
于 2014-07-09T12:38:25.487 回答
10

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

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
于 2016-08-22T13:10:04.680 回答
9

以防万一有人偶然发现这个线程,那么这里有一个针对 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
于 2019-02-19T14:20:02.597 回答
9

按 CTRL + 1

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

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
于 2016-09-22T14:00:38.177 回答
8

以下对我有用:

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
于 2015-10-29T10:12:50.887 回答
8

另一种选择是:

  • 使数据库脱机;在 SMSS 中,右键单击数据库并选择脱机,勾选“删除所有连接”
  • ALTER DATABASE [Your_Db] SET MULTI_USER
于 2016-10-20T11:32:04.277 回答
5

不确定这是否对任何人有帮助,但我遇到了同样的问题,找不到阻碍我的过程。我关闭了 SSMS 并停止了所有访问本地实例的服务。然后,一旦我返回并运行 exec sp_who2,它就向我展示了罪魁祸首。我终止了该进程并能够让 Multi_User 工作,然后重新启动服务。我们让 IIS 每隔几分钟/几秒就会点击一次以查找某些包。

于 2014-03-05T01:43:51.870 回答
5

使用此脚本

exec sp_who

查找 dbname 和 spid 列

现在执行

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;
于 2017-10-31T06:24:57.750 回答
4

添加到Jespers answer,更有效:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH5的用途DEADLOCK_PRIORITY

正在发生的事情是其他进程在数据库中出现了裂缝,如果你的进程有一个较低的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
于 2017-01-29T12:25:35.973 回答
3

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

于 2015-05-12T12:20:35.190 回答
2

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

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

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

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

于 2019-01-04T11:48:39.833 回答
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 中的一个可能的错误!

于 2014-09-15T10:47:30.023 回答
1

我们刚刚在 SQL 2012 中经历过这种情况。当我们终止将其设置为单个用户的原始会话时,复制过程开始了。但是 sp_who2 没有显示附加到数据库的新进程。关闭 SSMS 并重新打开,然后我们可以在数据库上看到这个进程,然后我们可以杀死它并立即切换到 multi_user 模式,这样就可以了。

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

于 2016-04-19T16:49:13.007 回答
0

对我来说最简单的答案是使用 SSMS 获取 DBOffline(选中 kill current connections 复选框),然后在使用之前将其重新联机:

USE MASTER;
ALTER DATABASE <DBName> SET MULTI_USER
GO
于 2021-12-09T10:10:49.053 回答
0

使用大师

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 = 'database name'

杀死 568 -- 杀死 spid

ALTER DATABASE 数据库名称'

SET MULTI_USER 去

于 2019-10-17T11:01:10.693 回答