sql server-sql作业代理数据库还原失败,错误#6107:只能终止用户进程



我们有一个SQL作业代理,它在"凌晨"运行,从生产备份中恢复本地数据库(FooData)。

首先,将数据库设置为SINGLE_USER模式,并终止所有打开的进程。第二,数据库被恢复。

但第三步偶尔会失败,出现错误6107:"只有用户进程才能被杀死"

这种情况大约每周发生一到两次,时间间隔看似随机。以下是偶尔发生故障的步骤3的代码:

USE master;
go
exec msdb.dbo.KillSpids FooData;
go
ALTER DATABASE FooData SET MULTI_USER;
go

有人知道是什么原因导致了这个错误吗?我在想,在第3步期间可能会启动一些自动流程,或者可能有用户试图在此期间登录?我不是DBA,所以我猜在这一点上,尽管我认为当DB处于SINGLE_user模式时,用户应该无法登录。

用户可能没有登录。系统可能正在执行某些任务。exec sp_whosp_who2的输出将显示哪些会话处于打开状态。任何低于50的SPID都是系统进程,不能用KILL杀死。停止它们的唯一方法是停止SQL Server服务或发出SHUTDOWN命令(执行相同的操作)。

我通过更改一行代码找到了问题的答案,这行代码运行起来很有魅力。

如原问题中所述,"KillSpids"行在作业的步骤1中使用。(与SET SINGLE USER一起)"KillSpids"在步骤1中是有意义的,因为数据库中可能仍有不需要的进程处于活动状态。

"KillSpids"行随后再次添加到步骤3中,但这是不必要的,也导致了6107错误。

我用下面显示的行替换了"杀人蜘蛛"行。将新恢复的数据库设置为单用户模式可以解决用户可能在所有作业步骤完成之前尝试登录的问题。这是更新后的代码:

USE master;
go
ALTER DATABASE [FooData] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
go
ALTER DATABASE FooData SET MULTI_USER;
go

最新更新