如何杀死当前与SQL Server 2005数据库的所有连接?

我想重命名一个数据库,但不断得到错误,“不能独占locking”的数据库,这意味着有一些连接(S)仍然活跃。

我怎样才能杀死所有连接到数据库,以便我可以重命名它?

请参阅杀死数据库的所有活动连接 。

亚当所build议的方法将不起作用的原因是,在循环活动连接的时候,可以build立新的连接,并且你会错过这些连接。 我链接到的文章使用下面的方法,没有这个缺点:

-- 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 

脚本来完成这一点,用数据库replace“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 

杀死它,并用火杀死它:

 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 

使用SQL Management Studio Express:

在对象资源pipe理器树中,在pipe理下钻取到“活动监视器”(如果在那里找不到它,请右键单击数据库服务器并select“活动监视器”)。 打开Activity Monitor,你可以查看所有的进程信息。 您应该能够find您感兴趣的数据库的锁,并杀死这些锁,这也将终止连接。

之后你应该可以重新命名。

我一直使用:

 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 
 ALTER DATABASE [Test] SET OFFLINE WITH ROLLBACK IMMEDIATE ALTER DATABASE [Test] SET ONLINE 

离线需要一段时间,有时我遇到了一些问题..

我认为最坚实的方法是:

分离右键单击数据库 – >任务 – >分离…检查“拖放连接”好吧

重新连接右键单击数据库 – >附加..添加… – >select您的数据库,并将附加为列更改为所需的数据库名称。 好

 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'数据库并运行这个查询,它将会终止数据库中的所有活动连接。

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

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

另一个“用火杀死”的方法是重新启动MSSQLSERVER服务。 我喜欢从命令行做东西。 完全粘贴到CMD中将执行此操作:NET STOP MSSQLSERVER&NET START MSSQLSERVER

或者打开“services.msc”,find“SQL Server(MSSQLSERVER)”,右键单击,select“重启”。

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

(我喜欢这比改变和改变服务器/数据库configuration的许多方法更好)

以下是在MS SQL Server Management Studio 2008中可靠地处理这种事情的方法(也可能适用于其他版本):

  1. 在对象资源pipe理器树中,右键单击根数据库服务器(带有绿色箭头),然后单击活动监视器。
  2. 在活动监视器中打开“进程”选项卡,select“数据库”下拉菜单,然后按需要过滤数据库。
  3. 右键单击对象资源pipe理器中的数据库,然后启动“任务 – >脱机”任务。 离开这个在后台运行,而你…
  4. 安全地closures任何你可以。
  5. 从进程选项卡中删除所有剩余的进程。
  6. 把DB重新联机。
  7. 重命名数据库。
  8. 将您的服务重新在线并将其指向新的数据库。

在这种情况下为我工作的选项如下:

  1. 在有问题的数据库上启动“分离”操作。 这将打开一个窗口(在SQL 2005中),显示阻止数据库操作的活动连接。
  2. 杀死活动连接,取消分离操作。
  3. 数据库现在应该可用于恢复。

尝试这个:

 ALTER DATABASE [DATABASE_NAME] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

右键单击数据库名称,单击属性以获取属性窗口,打开选项选项卡,并将多用户的“限制访问”属性更改为单用户。 当你点击确定button,它会提示你closures所有打开的连接,select“是”,并设置为重命名数据库….

这些不适合我(SQL2008 Enterprise),我也看不到任何正在运行的进程或连接到数据库的用户。 重新启动服务器(右键单击Management Studio中的Sql Server并select重新启动)允许我恢复数据库。

我正在使用SQL Server 2008 R2,我的数据库已经设置为单个用户,并有一个连接,限制对数据库的任何操作。 因此推荐的SQLMenace的解决scheme反应错误。 这是一个在我的情况下工作 。

我使用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; 

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