退出单用户模式

Lio*_*cer 190 sql-server sql-server-2008-r2

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

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

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

目前无法更改数据库'my_db'的状态或选项.数据库处于单用户模式,用户当前已连接到该用户.

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

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

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

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

CRA*_*DBA 350

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
Run Code Online (Sandbox Code Playgroud)

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

  • 找到SPID,使用以下命令:Kill 100. 100是会话编号(SPID). (3认同)
  • 当我使用“sp_who2”命令时,我没有看到任何连接到“my_db”的 DBName 我没有终止任何这些连接。运行命令后,我收到相同的错误 =[ : '此时无法更改数据库 'my_db' 的状态或选项。数据库处于单用户模式,当前有一个用户连接到它。消息 5069,级别 16,状态 1,第 1 行 ALTER DATABASE 语句失败' (2认同)
  • 您确定自己是master,sp_who2没有显示任何带有database = my_db的行,并且您的对象资源管理器不在my_db上. (2认同)
  • 另外,下载我的 usp_who2 脚本(http://craftydba.com/wp-content/uploads/2011/09/usp-who2.txt)。执行它。它将实用程序放置在 msdb.dbo.usp_who2 中。它将 sp_who2 的结果保存到您的用户 ID 下的 tempdb 中的表中,并按数据库名称进行过滤。发布错误的图片以帮助我们获得更多帮助。祝你好运。 (2认同)

Sat*_*ish 38

首先,查找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
Run Code Online (Sandbox Code Playgroud)


rsb*_*rro 24

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER

  • 右键单击左窗格中的服务器,然后单击"断开连接".确保在数据库上只打开一个SSMS选项卡(右键单击并选择"断开其他连接"),然后执行该语句.每个选项卡和对象资源管理器都是一个连接; 你只能有一个连接打开数据库(因此,'单用户模式').单个用户应该是'单一连接':)祝你好运 (2认同)

Tom*_*mas 17

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

sql server选项页面的截图

  • 此解决方案在 SQL Server 2016 上对我不起作用。尝试访问属性显示数据库处于单用户模式并且已连接用户的错误。 (3认同)

Ela*_*amy 14

我试过这个工作

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)


Jes*_*nen 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
Run Code Online (Sandbox Code Playgroud)


Ger*_*hef 7

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

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Run Code Online (Sandbox Code Playgroud)


gre*_*121 6

按CTRL + 1

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

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)


小智 5

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


tes*_*ern 5

另一种选择是:

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


Roy*_*ham 5

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

SET DEADLOCK_PRIORITY 10;-- Be the top dog.
Run Code Online (Sandbox Code Playgroud)

SET DEADLOCK_PRIORITY HIGHDEADLOCK_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
Run Code Online (Sandbox Code Playgroud)


小智 5

使用这个脚本

exec sp_who
Run Code Online (Sandbox Code Playgroud)

查找 dbname 和 spid 列

现在执行

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)


小智 5

以防万一有人偶然发现此线程,那么这里有一个针对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'
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用命令“ sp_who”来获取打开连接的“ spid”:

-或改用此SP

exec sp_who
Run Code Online (Sandbox Code Playgroud)

-然后执行以下操作,并用正确的值替换[spid]和[DBName]

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)