【问题标题】:SQL Job Agent DB Restore fails with error #6107: Only user processes can be killedSQL 作业代理数据库还原失败并出现错误 #6107:只能终止用户进程
【发布时间】:2014-04-21 18:52:58
【问题描述】:

我们有一个在“凌晨”运行的 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 模式时用户应该无法登录。

【问题讨论】:

标签: sql-server database-restore single-user


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如原始问题中所述,“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2023-04-11
      • 2013-11-27
      • 2010-10-04
      相关资源
      最近更新 更多