SQL Server Kill命令
我有一个SQL脚本,它备份一个数据库,然后通过另一个数据库进行恢复。我遇到的问题是,被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死连接的用户,它运行良好,但我需要这个过程每天晚上自动运行。是否有一个杀戮命令,我每天晚上都有时间执行?或者在恢复选项中是否有相同的操作 有什么想法吗SQL Server Kill命令,sql,sql-server,Sql,Sql Server,我有一个SQL脚本,它备份一个数据库,然后通过另一个数据库进行恢复。我遇到的问题是,被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死连接的用户,它运行良好,但我需要这个过程每天晚上自动运行。是否有一个杀戮命令,我每天晚上都有时间执行?或者在恢复选项中是否有相同的操作 有什么想法吗 谢谢如果客户端重新连接,KILL并不总是有效的 我会考虑将数据库脱机或DBO,然后恢复。这样将防止进一步的重新连接 ALTER DATABASE TargetDB SET OFFLINE WITH ROLLB
谢谢如果客户端重新连接,KILL并不总是有效的 我会考虑将数据库脱机或DBO,然后恢复。这样将防止进一步的重新连接
ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE
或
同意@gbn,您也可以使用以下代码成功恢复数据库
USE master
GO
ALTER DATABASE YourDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE YourDatabaseName SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
但是,您可以使用以下脚本终止与选定数据库的连接
-- Create the sql to kill the active database connections
DECLARE @execSql VARCHAR(4000),
@databaseName VARCHAR(100)
-- Set the database name for which to kill the connections
SET @databaseName = '[yourdatabase]'
SET @execSql = ''
SELECT @execSql = @execSql + 'kill ' + CONVERT(CHAR(10), spid) + ' '
FROM master.dbo.sysprocesses
WHERE DB_NAME(dbid) = @databaseName
AND DBID <> 0
AND spid <> @@spid
EXEC ( @execSql
)
使用“master”数据库并运行此查询,它将终止您数据库中的所有活动连接。那么此脚本是否会简单地终止所有连接的进程,并允许我立即恢复数据库?我是否只需要替换“testdb”条目?是的,这将终止特定数据库的所有进程。使用要还原的数据库的名称更改DB_ID函数中的数据库。
-- Create the sql to kill the active database connections
DECLARE @execSql VARCHAR(4000),
@databaseName VARCHAR(100)
-- Set the database name for which to kill the connections
SET @databaseName = '[yourdatabase]'
SET @execSql = ''
SELECT @execSql = @execSql + 'kill ' + CONVERT(CHAR(10), spid) + ' '
FROM master.dbo.sysprocesses
WHERE DB_NAME(dbid) = @databaseName
AND DBID <> 0
AND spid <> @@spid
EXEC ( @execSql
)
DECLARE @pid AS INTEGER
DECLARE mycursor CURSOR FOR
select spid
from sys.sysprocesses
WHERE dbid = DB_ID('yourdatabasename')
OPEN mycursor
FETCH NEXT FROM mycursor INTO @pid
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE ('KILL '+@pid)
FETCH NEXT FROM mycursor INTO @pid
END
CLOSE mycursor
DEALLOCATE mycursor
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