SQL Server Kill命令

时间:2011-06-23 08:49:33

标签: sql sql-server

我有一个SQL脚本备份数据库,然后将其还原到另一个数据库。我遇到的问题是被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死附加的用户,它运行正常,但我需要这个过程每晚自动运行。是否有一个杀戮命令我每晚都可以执行?或者还原选项中有什么东西可以做同样的事情吗?

有什么想法吗?

由于

4 个答案:

答案 0 :(得分:6)

如果客户重新连接

,则KILL并不总是有效

我会考虑使数据库脱机(或仅限dbo)然后恢复。因此将阻止进一步的重新连接。

ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE 

ALTER DATABASE TargetDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE 

答案 1 :(得分:1)

同意@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
    )  

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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'数据库并运行此查询,它将终止数据库中的所有活动连接。