退出单用户模式
目前,我的数据库处于单用户模式。 当我尝试扩展数据库时,出现错误:
数据库'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;
- 在数据库部分右键单击您的数据库
- select“属性”
- select“选项”页面
- 向下滚动“其他选项”并更改“限制访问”字段
今天早上我遇到了同样的问题。 原来是一个简单的问题。 我有一个查询窗口打开,设置为对象资源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;