如何杀死当前与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中可靠地处理这种事情的方法(也可能适用于其他版本):
- 在对象资源pipe理器树中,右键单击根数据库服务器(带有绿色箭头),然后单击活动监视器。
- 在活动监视器中打开“进程”选项卡,select“数据库”下拉菜单,然后按需要过滤数据库。
- 右键单击对象资源pipe理器中的数据库,然后启动“任务 – >脱机”任务。 离开这个在后台运行,而你…
- 安全地closures任何你可以。
- 从进程选项卡中删除所有剩余的进程。
- 把DB重新联机。
- 重命名数据库。
- 将您的服务重新在线并将其指向新的数据库。
在这种情况下为我工作的选项如下:
- 在有问题的数据库上启动“分离”操作。 这将打开一个窗口(在SQL 2005中),显示阻止数据库操作的活动连接。
- 杀死活动连接,取消分离操作。
- 数据库现在应该可用于恢复。
尝试这个:
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命令并杀死所有使用您的数据库的进程,然后重命名您的数据库。