我想重命名数据库,但不断收到数据库上"无法获得独占锁定"的错误,这意味着仍有一些连接处于活动状态.
如何杀死数据库的所有连接以便我可以重命名它?
请参阅终止所有活动连接到数据库.
Adam提出的方法不起作用的原因是,在循环活动连接期间,可以建立新的方法,并且您将错过这些方法.我链接的文章使用以下方法,没有这个缺点:
-- 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
杀了它,并用火杀死它:
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:
在对象资源管理器树中,在"管理"下向下钻取"活动监视器"(如果在那里找不到它,则右键单击数据库服务器并选择"活动监视器").打开活动监视器,您可以查看所有进程信息.您应该能够找到您感兴趣的数据库的锁并杀死这些锁,这也将终止连接.
你应该能够在那之后重命名.
我一直用:
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
离线需要一段时间,有时我会遇到一些问题..
我认为最坚实的方式:
分离 右键单击DB - >任务 - >分离...选中"删除连接"确定
重新连接 右键单击数据库 - >附加..添加... - >选择您的数据库,并将附加为列更改为所需的数据库名称.好
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中找到树的顶部并右键单击并重新启动数据库服务器(因为它位于开发机器上,这在生产中可能不太理想).这是关闭所有数据库连接.