退出单用户模式

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

数据库'my_db'不可访问(ObjectExplorer)

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

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

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

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

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

我觉得好像单用户模式正在造成这种情况。

一般SSMS使用几个连接到幕后的数据库。

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

首先,确保对象资源pipe理器指向一个像master一样的系统数据库。

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

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

执行下面的代码。

 -- Start in master USE MASTER; -- Add users ALTER DATABASE [my_db] SET MULTI_USER GO 

看到我的博客文章pipe理数据库文件。 这是为了移动文件而写的,但用户pipe理是一样的。

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER

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

我试过这个工作

 ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE 

以下为我工作:

 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 

我有同样的问题,并使用此查询find要杀的session_id:

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

不知道这是否有助于任何人,但我有同样的问题,无法find阻止我的过程。 我closuresSSMS,并停止所有的服务打本地实例。 然后,一旦我回到运行exec sp_who2,它指出我的罪魁祸首。 我杀了进程,并能够得到Multi_User工作,然后重新启动服务。 我们让IIS每隔几分钟/秒查找一些包。

按下CTRL + 1

findlocking你的数据库的进程。 在你的数据库的dbname列中查看并记下spid。 现在你必须执行这个语句:

 kill <your spid> ALTER DATABASE <your db> SET MULTI_USER; 
  1. 在数据库部分右键单击您的数据库
  2. select“属性”
  3. select“选项”页面
  4. 向下滚动“其他选项”并更改“限制访问”字段

SQL Server的选项页面的屏幕截图

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

另一个select是:

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

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

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

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

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

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

加上Jespers的回答 ,更加有效:

 SET DEADLOCK_PRIORITY 10;-- Be the top dog. 

SET DEADLOCK_PRIORITY HIGH使用5的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 

使用这个脚本

 exec sp_who 

finddbname和spid列

现在执行

 kill spid go ALTER DATABASE [DBName] SET MULTI_USER;