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

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

有帮助吗?

解决方案

终止与数据库的所有活动连接.

该方法的原因是 亚当建议 不起作用的是,在您循环活动连接的过程中,可以建立新的连接,并且您会错过这些连接。我链接到的文章使用以下方法,没有这个缺点:

-- 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 中可靠地执行此类操作(也可能适用于其他版本):

  1. 在对象资源管理器树中,右键单击根数据库服务器(带有绿色箭头),然后单击活动监视器。
  2. 打开活动监视器中的进程选项卡,选择“数据库”下拉菜单,然后按所需的数据库进行筛选。
  3. 在对象资源管理器中右键单击数据库并启动“任务 -> 脱机”任务。让它在后台运行,而您...
  4. 安全地关闭一切可以关闭的东西。
  5. 从进程选项卡中终止所有剩余进程。
  6. 让数据库重新联机。
  7. 重命名数据库。
  8. 让您的服务重新上线并将其指向新的数据库。

在这种情况下对我有用的选项如下:

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

尝试这个:

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 命令并终止使用您的数据库的所有进程,然后重命名您的数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top