我想重命名数据库,但不断收到数据库中“无法获得独占锁定”的错误,这意味着某些连接仍处于活动状态。
如何终止与数据库的所有连接以便重命名?
答案 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)
以下是如何在MS SQL Server Management Studio 2008中可靠地处理这类事情(也可能适用于其他版本):
答案 10 :(得分:4)
在对象资源管理器上的MS SQL Server Management Studio中,右键单击数据库。在随后的上下文菜单中选择'任务 - &gt;离线'
答案 11 :(得分:4)
另一种“用火杀死它”的方法是重新启动MSSQLSERVER服务。 我喜欢从命令行做一些事情。将其精确地粘贴到CMD中就可以了: NET STOP MSSQLSERVER&amp; NET START MSSQLSERVER
或者打开“services.msc”并找到“SQL Server(MSSQLSERVER)”并右键单击,选择“重新启动”。
这将“肯定,肯定”杀死与该实例上运行的所有数据库的所有连接。
(我比许多改变和更改服务器/数据库配置的方法更喜欢这个)
答案 12 :(得分:3)
在这种情况下为我工作的选项如下:
答案 13 :(得分:2)
右键单击数据库名称,单击“属性”以获取属性窗口,打开“选项”选项卡,然后将“限制访问”属性从“多用户”更改为“单个用户”。当您点击OK按钮时,它会提示您关闭所有打开的连接,选择“是”并设置为重命名数据库....
答案 14 :(得分:2)
我正在使用SQL Server 2008 R2,我的数据库已经为单个用户设置,并且有一个连接限制了对数据库的任何操作。因此,推荐的SQLMenace's解决方案会出错。 Here is one that worked in my case
答案 15 :(得分:2)
这些对我不起作用(SQL2008 Enterprise),我也看不到任何正在运行的进程或连接到数据库的用户。重新启动服务器(右键单击Management Studio中的Sql Server并选择Restart)允许我恢复数据库。
答案 16 :(得分:2)
试试这个:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
答案 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命令并终止使用您的数据库的所有进程,然后重命名您的数据库。