3

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

首先,将数据库设置为 SINGLE_USER 模式并杀死所有打开的进程。二是恢复数据库。

但是第 3 步偶尔会失败,出现错误 6107:“只能杀死用户进程”

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

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

有没有人知道可能会发生什么导致此错误?我在想在第 3 步期间可能会启动一些自动化过程,或者可能有一些用户在此期间尝试登录?我不是 DBA,所以我在这一点上猜测,尽管我相信当 DB 处于 SINGLE_USER 模式时用户不应该能够登录。

4

2 回答 2

6

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

于 2014-04-21T20:45:36.550 回答
4

我通过改变一行代码找到了我的问题的答案,这就像一个魅力。

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

然后将“KillSpids”行再次添加到第 3 步,但这是不必要的,并且还会导致 6107 错误。

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

USE master;
go
ALTER DATABASE [FooData] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
go
ALTER DATABASE FooData SET MULTI_USER;
go
于 2014-04-24T22:56:20.497 回答