【问题标题】:Run a SQL Server job until it succeeds运行 SQL Server 作业,直到成功
【发布时间】:2017-07-27 05:30:59
【问题描述】:

我有一个运行了将近 2 年的 SQL Server 作业。

它连接到一个不断断开连接的坏 Oracle 数据库,因此它总是失败。当我在 10 或 15 分钟后再次运行它时,它可以成功运行。我已经厌倦了每天检查它......

有没有办法让作业运行以连接到该 Oracle 源直到它成功,或者另一个作业查看这个作业状态并且如果它失败了,那么它会再次运行它直到它成功?

【问题讨论】:

  • 尝试排除连接故障。如果您想一次又一次地尝试调用作业以获得成功,您可以相应地配置重试尝试。
  • 我会尝试解决连接不良的问题。没有必要那样做。任何其他解决方案都只是破解和粘贴膏药。
  • 您可以为该步骤设置重试次数和重试间隔,查看更多:docs.microsoft.com/en-us/sql/ssms/agent/…

标签: sql sql-server jobs


【解决方案1】:

我们正在使用的解决方案是这样的:

将您的 Oracle 查询包装在一个 SSIS 包中,并在查询之后让该包更新一个 SQL 表,该表保留了执行历史记录,或者仅记录了上次成功运行作业的单行。简而言之,如果 Oracle 查询成功,则在表中放入一些内容,说明查询今天运行成功。如果没有成功,那么今天就不要在桌子上放任何东西。

然后在包的开头,在Oracle查询之前,检查一下今天查询是否运行成功。如果它已经成功运行,则什么也不做并退出包。如果它今天没有成功运行,那么继续尝试运行它,按照上面描述的查询后步骤。如果您有任何关于何时运行包的其他条件(例如“仅在上午 10 点之后”或类似的情况),您可以在此处包含该逻辑。

最后,安排调用包的作业,安排每 15 分钟运行一次,或者您喜欢的频率。它会每 15 分钟尝试一次,直到成功运行,之后它会停止执行任何操作,直到第二天。

作为奖励,您可以使用相同的包和作业来启动您希望以相同方式处理的所有任务。您只需将所有这些任务的元数据保存在历史记录/元数据表中即可。

【讨论】:

    【解决方案2】:

    另一种方法是创建作业步骤并将其保留为未计划,并创建一个 ssis 作业作为所有作业的主作业,它每分钟运行一次,检查配置表中今天尚未成功的所有作业步骤,并且找到的任何内容都使用 sp_start_job 执行。

    如果它们确实运行成功,则将统计信息记录到日志表中,这样可以防止它们在第二天再次启动。这可以防止您的所有作业需要每 15 分钟安排一次等,它们会尽快启动,并且您可以添加额外的逻辑来处理依赖关系、并行运行数量、重要性级别等、开始时间、最晚开始时间、最大数量到 retty 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多