如何终止到SQL Server 2005数据库的所有当前连接?

我想重命名一个数据库,但不断得到“无法获得数据库上的排他锁”的错误,这意味着仍有一些连接处于活动状态。

如何杀死数据库的所有连接以便重命名它?

433347 次浏览

在对象资源管理器上的MS SQL Server Management Studio中,右键单击数据库。在下面的上下文菜单中选择“任务->脱机”

亚当建议的方法不能工作的原因是,在循环活动连接期间,可以建立新的连接,而您将错过这些连接。你可以使用下面的方法,它没有这个缺点:

-- set your current connection to use master otherwise you might get an error


use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE


--do you stuff here


ALTER DATABASE YourDatabase SET MULTI_USER

脚本来完成这个任务,用数据库替换'DB_NAME'来杀死所有连接到:

USE master
GO


SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''


Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)


IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

使用SQL Management Studio Express:

在对象资源管理器树中,在管理下向下钻到“活动监视器”(如果你在那里找不到它,那么右键单击数据库服务器并选择“活动监视器”)。打开活动监视器,您可以查看所有进程信息。您应该能够找到您感兴趣的数据库的锁并关闭这些锁,这也将关闭连接。

您应该能够在此之后重命名。

试试这个:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

我总是用:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user
GO

当我试图恢复数据库时,我通常会遇到这种错误,我通常只需要在Management Studio中找到树的顶部,右键单击并重新启动数据库服务器(因为它在开发机器上,这在生产环境中可能不理想)。这将关闭所有数据库连接。

杀他,用火杀他。

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

下面是如何在MS SQL Server Management Studio 2008(可能也适用于其他版本)中可靠地执行这类事情:

  1. 在对象资源管理器树中,右键单击根数据库服务器(使用绿色箭头),然后单击活动监视器。
  2. 在活动监视器中打开processes选项卡,选择'databases'下拉菜单,并根据所需的数据库进行筛选。
  3. 在对象资源管理器中右键单击DB并启动“任务->脱机”任务。让这个在后台运行,而你…
  4. 安全地关闭你能关闭的任何东西。
  5. 从process选项卡中杀死所有剩余的进程。
  6. 使DB重新联机。
  7. 重命名DB。
  8. 使您的服务重新联机,并将其指向新的DB。

右键单击数据库名称,单击属性进入属性窗口,打开选项选项卡,将“限制访问”属性从多用户更改为单用户。当你点击OK按钮时,它会提示你关闭所有打开的连接,选择“是”,你就可以将数据库重命名为....

下线需要一段时间,有时我会遇到一些问题。

在我看来最可靠的方法是:

< >强分离 右键单击DB -> Tasks -> Detach… 检查“删除连接” 好的< / p >

< >强再植 右键单击数据库->附加.. 添加……->选择您的数据库,并将Attach As列更改为所需的数据库名称。 好的< / p >

另一种“以毒殉毒”的方法是重新启动MSSQLSERVER服务。 我喜欢从命令行做一些事情。把它粘贴到CMD中就可以了: NET STOP MSSQLSERVERNET START MSSQLSERVER

. NET

或者开放“服务”。找到“SQL Server (MSSQLSERVER)”,单击右键,选择“restart”。

这将“肯定,肯定”杀死该实例上运行的所有数据库的所有连接。

(比起许多在服务器/数据库上反复更改配置的方法,我更喜欢这种方法)

在这种情况下,适合我的选项如下:

  1. 在相关数据库上启动“Detach”操作。这将打开一个窗口(在SQL 2005中),显示阻止对DB执行操作的活动连接。
  2. 终止活动连接,取消分离操作。
  3. 现在应该可以恢复数据库了。
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'


Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select '  ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp

使用'master'数据库并运行此查询,它将杀死数据库中的所有活动连接。

这些对我不起作用(SQL2008 Enterprise),我也看不到任何正在运行的进程或连接到DB的用户。重新启动服务器(右键单击Management Studio中的Sql server并选择重新启动)允许我恢复DB。

我使用的是SQL Server 2008 R2,我的数据库已经设置为单个用户,并且有一个连接限制了数据库上的任何操作。因此,推荐的SQLMenace的解决方案响应错误。这是一个对我有用的方法

ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE


ALTER DATABASE [Test]
SET ONLINE

您可以使用SP_Who命令杀死所有使用您的数据库的进程,然后重命名您的数据库。

我使用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
< p > 结果 < br > 您可以在KillCommand列中使用command命令来终止您想要的进程
SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;