如何终止与 SQL Server 2005 数据库的所有当前连接?
-
08-06-2019 - |
题
我想重命名数据库,但不断收到数据库“无法获取独占锁”的错误,这意味着某些连接仍然处于活动状态。
如何终止与数据库的所有连接以便重命名它?
解决方案
该方法的原因是 亚当建议 不起作用的是,在您循环活动连接的过程中,可以建立新的连接,并且您会错过这些连接。我链接到的文章使用以下方法,没有这个缺点:
-- 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
离线需要一段时间,有时我会遇到一些问题。
我认为最可靠的方法:
分离右键单击数据库 -> 任务 -> 分离...检查“ Drop Connections”确定
重新连接右键单击数据库 -> 附加..添加...-> 选择您的数据库,然后将“附加为”列更改为您所需的数据库名称。好的
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 中的树顶部,右键单击并重新启动数据库服务器(因为它位于开发计算机上,这在生产中可能并不理想) )。这将关闭所有数据库连接。
在对象资源管理器的 MS SQL Server Management Studio 中,右键单击数据库。在随后的上下文菜单中选择“任务 -> 脱机”
另一种“用火杀死它”的方法是重新启动 MSSQLSERVER 服务。我喜欢从命令行做事。将其完全粘贴到 CMD 中即可:NET 停止 MSSQLSERVER 和 NET 启动 MSSQLSERVER
或者打开“services.msc”并找到“SQL Server(MSSQLSERVER)”并右键单击,选择“重新启动”。
这将“肯定,肯定”终止与该实例上运行的所有数据库的所有连接。
(与许多更改和更改回服务器/数据库上的配置的方法相比,我更喜欢这种方法)
以下是如何在 MS SQL Server Management Studio 2008 中可靠地执行此类操作(也可能适用于其他版本):
- 在对象资源管理器树中,右键单击根数据库服务器(带有绿色箭头),然后单击活动监视器。
- 打开活动监视器中的进程选项卡,选择“数据库”下拉菜单,然后按所需的数据库进行筛选。
- 在对象资源管理器中右键单击数据库并启动“任务 -> 脱机”任务。让它在后台运行,而您...
- 安全地关闭一切可以关闭的东西。
- 从进程选项卡中终止所有剩余进程。
- 让数据库重新联机。
- 重命名数据库。
- 让您的服务重新上线并将其指向新的数据库。
在这种情况下对我有用的选项如下:
- 对相关数据库启动“分离”操作。这将打开一个窗口(在 SQL 2005 中),显示阻止对数据库进行操作的活动连接。
- 终止活动连接,取消分离操作。
- 数据库现在应该可以用于恢复。
尝试这个:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
右键单击数据库名称,单击属性以获取属性窗口,打开选项选项卡并将“限制访问”属性从多用户更改为单用户。当您点击“确定”按钮时,它将提示您关闭所有打开的连接,选择“是”,然后您将设置重命名数据库......
这些对我不起作用(SQL2008 Enterprise),我也看不到任何正在运行的进程或连接到数据库的用户。重新启动服务器(在 Management Studio 中右键单击 Sql Server 并选择“重新启动”)允许我恢复数据库。
我使用的是 SQL Server 2008 R2,我的数据库已经设置为单个用户,并且有一个连接限制了对数据库的任何操作。因此推荐的 SQL威胁的 解决方案响应错误。 这是对我的案例有效的一个.
我使用 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 命令并终止使用您的数据库的所有进程,然后重命名您的数据库。