我想重命名数据库,但不断收到数据库上“无法获得排他锁”的错误,这意味着有一些连接仍然处于活动状态。
如何终止与数据库的所有连接以便重命名它?
我想重命名数据库,但不断收到数据库上“无法获得排他锁”的错误,这意味着有一些连接仍然处于活动状态。
如何终止与数据库的所有连接以便重命名它?
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:
在对象资源管理器树中,在 Management 下向下钻取到“Activity Monitor”(如果在其中找不到它,则右键单击数据库服务器并选择“Activity Monitor”)。打开活动监视器,您可以查看所有进程信息。您应该能够找到您感兴趣的数据库的锁并终止这些锁,这也会终止连接。
之后您应该可以重命名。
我一直用:
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
使用“主”数据库并运行此查询,它将终止数据库中的所有活动连接。
当我尝试恢复数据库时,我通常会遇到该错误我通常只是转到 Management Studio 中树的顶部,然后右键单击并重新启动数据库服务器(因为它在开发机器上,这在生产中可能并不理想)。这是关闭所有数据库连接。
在对象资源管理器上的 MS SQL Server Management Studio 中,右键单击数据库。在随后的上下文菜单中选择“任务 -> 脱机”
以下是如何在 MS SQL Server Management Studio 2008 中可靠地执行此类操作(也可能适用于其他版本):
另一种“用火杀死它”的方法是重新启动 MSSQLSERVER 服务。我喜欢从命令行做事。将其准确粘贴到 CMD 中即可:NET STOP MSSQLSERVER & NET START MSSQLSERVER
或者打开“services.msc”,找到“SQL Server (MSSQLSERVER)”并右键单击,选择“重新启动”。
这将“肯定,肯定”终止与该实例上运行的所有数据库的所有连接。
(我比许多更改和更改服务器/数据库上的配置的方法更喜欢这个)
在这种情况下为我工作的选项如下:
试试这个:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
右键单击数据库名称,单击属性以获取属性窗口,打开选项选项卡并将“限制访问”属性从多用户更改为单用户。当你点击确定按钮时,它会提示你关闭所有打开的连接,选择“是”,你就可以重命名数据库了……
这些对我不起作用(SQL2008 Enterprise),我也看不到任何正在运行的进程或连接到数据库的用户。重新启动服务器(右键单击 Management Studio 中的 Sql Server 并选择重新启动)允许我恢复数据库。
我正在使用 SQL Server 2008 R2,我的数据库已经设置为单用户,并且有一个连接限制了对数据库的任何操作。因此,推荐的 SQLMenace 的解决方案以错误响应。这是在我的情况下工作的一个。
我使用 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 命令并杀死所有使用您的数据库的进程,然后重命名您的数据库。