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

时间:2008-08-14 19:54:25

标签: sql-server sql-server-2005

我想重命名数据库,但不断收到数据库中“无法获得独占锁定”的错误,这意味着某些连接仍处于活动状态。

如何终止与数据库的所有连接以便重命名?

19 个答案:

答案 0 :(得分:374)

请参阅Kill All Active Connections To A Database

Adam suggested不起作用的方法的原因是,在循环活动连接期间,可以建立新的连接,并且您将错过这些连接。我链接的文章使用了以下没有这个缺点的方法:

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

答案 1 :(得分:110)

要完成此操作的脚本,请将“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

答案 2 :(得分:53)

杀死它并用火杀死它:

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

答案 3 :(得分:27)

使用SQL Management Studio Express:

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

之后您应该可以重命名。

答案 4 :(得分:24)

我一直用:


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 

答案 5 :(得分:21)

ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

答案 6 :(得分:14)

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

我认为最坚实的方式:

<强>分离 右键单击DB - &gt;任务 - &gt;分离... 检查“丢弃连接” 确定

<强>重新附加 右键单击数据库 - &gt;连接.. 添加... - &gt;选择您的数据库,并将Attach As列更改为所需的数据库名称。 确定

答案 7 :(得分:6)

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

答案 8 :(得分:5)

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

答案 9 :(得分:4)

另一种“用火杀死它”的方法是重新启动MSSQLSERVER服务。 我喜欢从命令行做一些事情。将其精确地粘贴到CMD中就可以了: NET STOP MSSQLSERVER&amp; NET START MSSQLSERVER

或者打开“services.msc”并找到“SQL Server(MSSQLSERVER)”并右键单击,选择“重新启动”。

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

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

答案 10 :(得分:4)

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

  1. 在对象资源管理器树中,右键单击根数据库服务器(使用绿色箭头),然后单击活动监视器。
  2. 打开活动监视器中的进程选项卡,选择'数据库'下拉菜单,然后按所需的数据库进行筛选。
  3. 右键单击对象资源管理器中的数据库并启动“任务 - &gt;脱机'任务。当你...
  4. 时,让它在后台运行
  5. 尽可能安全地关闭。
  6. 从流程选项卡中删除所有剩余的流程。
  7. 将数据库重新联机。
  8. 重命名数据库。
  9. 将您的服务重新联机并将其指向新的数据库。

答案 11 :(得分:4)

在对象资源管理器上的MS SQL Server Management Studio中,右键单击数据库。在随后的上下文菜单中选择'任务 - &gt;离线'

答案 12 :(得分:3)

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

  1. 对相关数据库启动“分离”操作。这将打开一个窗口(在SQL 2005中),显示阻止对DB执行操作的活动连接。
  2. 终止活动连接,取消分离操作。
  3. 现在可以使用数据库进行还原。

答案 13 :(得分:2)

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

答案 14 :(得分:2)

试试这个:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

答案 15 :(得分:2)

我正在使用SQL Server 2008 R2,我的数据库已经为单个用户设置,并且有一个连接限制了对数据库的任何操作。因此,推荐的SQLMenace's解决方案会出错。 Here is one that worked in my case

答案 16 :(得分:2)

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

答案 17 :(得分:0)

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

答案 18 :(得分:-1)

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