目前,我的数据库处于单用户模式。当我试图扩展我的数据库,我得到一个错误:
数据库my_db不可访问。
此外,当我试图删除数据库时,我得到错误:
无法更改数据库'my_db'的状态或选项 这一次。数据库为单用户模式,用户为 当前连接到它。
如何退出单用户模式?我没有任何用户使用这个数据库。
当我尝试用IIS浏览我的网站时,我得到的错误是:
类的执行期间生成了未处理的异常 当前的web请求。关于起源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
我觉得这是单用户模式造成的。
目前,我的数据库处于单用户模式。当我试图扩展我的数据库,我得到一个错误:
数据库my_db不可访问。
此外,当我试图删除数据库时,我得到错误:
无法更改数据库'my_db'的状态或选项 这一次。数据库为单用户模式,用户为 当前连接到它。
如何退出单用户模式?我没有任何用户使用这个数据库。
当我尝试用IIS浏览我的网站时,我得到的错误是:
类的执行期间生成了未处理的异常 当前的web请求。关于起源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
我觉得这是单用户模式造成的。
当前回答
SSMS通常在幕后使用到数据库的多个连接。在改变访问模式之前,你需要杀死这些连接:
首先,确保对象资源管理器指向像master这样的系统数据库。 其次,执行sp_who2并找到到数据库'my_db'的所有连接。 通过Kill {session id}杀死所有的连接,其中session id是sp_who2列出的SPID。 第三,打开一个新的查询窗口。
在这3个步骤之后,执行以下代码。
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
请参阅我关于管理数据库文件的博客文章。这是为移动文件编写的,但用户管理是相同的。
其他回答
要切换出单用户模式,请尝试:
设置数据库的多用户
要切换回单用户模式,您可以使用:
修改数据库[my_db
SSMS通常在幕后使用到数据库的多个连接。在改变访问模式之前,你需要杀死这些连接:
首先,确保对象资源管理器指向像master这样的系统数据库。 其次,执行sp_who2并找到到数据库'my_db'的所有连接。 通过Kill {session id}杀死所有的连接,其中session id是sp_who2列出的SPID。 第三,打开一个新的查询窗口。
在这3个步骤之后,执行以下代码。
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
请参阅我关于管理数据库文件的博客文章。这是为移动文件编写的,但用户管理是相同的。
首先,查找并终止当前正在运行的所有进程。
然后,运行下面的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
在Jespers的回答中,为了更有效地补充:
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
SET DEADLOCK_PRIORITY HIGH使用DEADLOCK_PRIORITY为5。
发生的事情是,其他进程在数据库中受到了破坏,如果您的进程具有较低的DEADLOCK_PRIORITY,那么它就会输掉这场比赛。
这避免了寻找和杀死另一只蜘蛛(这可能需要做几次)。
您可能需要运行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
下面的方法对我很有效:
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