我要重命名的数据库,但不断收到错误“无法获取排它锁”的数据库,这意味着有一定的联系(S)依然活跃。
我怎么能杀死所有与数据库的连接,这样我可以重新命名呢?
我要重命名的数据库,但不断收到错误“无法获取排它锁”的数据库,这意味着有一定的联系(S)依然活跃。
我怎么能杀死所有与数据库的连接,这样我可以重新命名呢?
请参阅杀死所有活动连接数据库 。
究其原因是,该方法亚当建议是行不通的是,在您遍历活动连接新的可以建立,你会想念那些时间。 文章中,我连接到使用以下方法不具有这样的缺点:
-- 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管理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
脱机需要一段时间,有时我遇到一些问题的..
在我看来,最可靠的方法:
拆下右击数据库- >任务- >分离...勾选“删除连接”好
重新连接右键单击数据库- >附加..添加... - >选择你的数据库,并更改附加为列到你所需的数据库名称。 好
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中,右键单击数据库。 在下面选择上下文菜单“任务 - >脱机”
另一种“用火杀死它”的方法是刚刚重新启动MSSQLServer服务。 我喜欢在命令行做的东西。 粘贴此正是进入CMD将做到这一点:NET STOP MSSQLSERVER和NET START MSSQLSERVER
或者打开“SERVICES.MSC”,找到“SQL服务器(MSSQLSERVER)”,并单击鼠标右键,选择“重新启动”。
这将“肯定的,肯定”杀该实例上运行的所有数据库的所有连接。
(我喜欢这个比发生变化,改回配置服务器/数据库上很多方法更好)
以下是如何可靠地这样的事情在MS SQL Server Management Studio中2008年(可能适用于其他版本的工作太):
在这种情况下,我工作的选项如下:
试试这个:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
右键单击数据库名称,单击属性来获得属性窗口中,打开选项选项卡和“限制访问”属性从多用户到单用户改变。 当你点击确定按钮,它会提示你关闭所有打开的连接,选择“是”,你都设置为重命名数据库....
这些并没有为我(SQL2008企业)工作,我也看不到连接到数据库的任何正在运行的进程或用户。 重新启动服务器(右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并杀死使用您的数据库,然后重命名你的数据库中的所有过程。