我想重命名一个数据库,但不断得到“无法获得数据库上的排他锁”的错误,这意味着仍有一些连接处于活动状态。
如何杀死数据库的所有连接以便重命名它?
我想重命名一个数据库,但不断得到“无法获得数据库上的排他锁”的错误,这意味着仍有一些连接处于活动状态。
如何杀死数据库的所有连接以便重命名它?
当前回答
在这种情况下,适合我的选项如下:
在相关数据库上启动“Detach”操作。这将打开一个窗口(在SQL 2005中),显示阻止对DB执行操作的活动连接。 终止活动连接,取消分离操作。 现在应该可以恢复数据库了。
其他回答
我使用的是SQL Server 2008 R2,我的数据库已经设置为单个用户,并且有一个连接限制了数据库上的任何操作。因此,推荐的SQLMenace解决方案响应错误。这是一个对我有用的方法。
我使用sp_who来获取数据库中所有进程的列表。这样更好,因为您可能需要检查要终止哪个进程。
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
结果 您可以使用KillCommand列中的命令来终止您想要的进程。
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
当我试图恢复数据库时,我通常会遇到这种错误,我通常只需要在Management Studio中找到树的顶部,右键单击并重新启动数据库服务器(因为它在开发机器上,这在生产环境中可能不理想)。这将关闭所有数据库连接。
您可以使用SP_Who命令杀死所有使用您的数据库的进程,然后重命名您的数据库。
杀他,用火杀他。
USE master
go
DECLARE @dbname sysname
SET @dbname = 'yourdbname'
DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END