Answers:
通常,SSMS在后台使用与数据库的多个连接。
更改访问模式之前,您将需要终止这些连接。
首先,确保对象资源管理器指向诸如master之类的系统数据库。
其次,执行一个sp_who2并找到与数据库“ my_db”的所有连接。通过KILL { session id }
在SPID
列出会话ID的地方终止所有连接sp_who2
。
第三,打开一个新的查询窗口。
执行以下代码。
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
请参阅我有关管理数据库文件的博客文章。这是为移动文件而编写的,但是用户管理是相同的。
首先,找到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 [my_db] SET MULTI_USER
要切换回单用户模式,可以使用:
ALTER DATABASE [my_db] SET SINGLE_USER
我试过这是工作
ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
我遇到了同样的问题,使用以下查询找到了要杀死的session_id:
Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
以下为我工作:
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
以防万一有人偶然发现此线程,那么这里有一个针对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
添加到Jespers答案中,将更加有效:
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
SET DEADLOCK_PRIORITY HIGH
用途 DEADLOCK_PRIORITY
5.的
发生的情况是其他进程在数据库上出现了漏洞,并且,如果您的进程具有较低的级别, 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
查找dbname和spid列
现在执行
kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;