我有一个运行了近2年的SQL Server作业。
它连接到一个不断断开连接的坏Oracle数据库,它总是因此而失败。当我在10或15分钟后再次运行它时,它会成功运行。我每天都无聊地检查它...
是否有一种方法可以使作业连接到该Oracle源,直到成功,或者另一个查看此作业状态的作业,如果失败,那么它会再次运行直到成功为止?
我们使用的解决方案是这样的:
将您的Oracle查询包装在SSIS包中,在查询之后,让包更新一个SQL表,该表保留执行历史记录,或者只保留一行跟踪上次成功运行作业的行。简而言之,如果Oracle查询成功,那么在表中添加一些内容,说明查询今天成功运行。如果没有成功,那么今天不要在表格中放任何东西。
然后在包的开头,在Oracle查询之前,检查查询是否已成功运行。如果它已成功运行,则不执行任何操作并退出程序包。如果它今天没有成功运行,那么按照上述的查询后步骤继续尝试运行它。如果你有关于什么时候运行包的任何其他条件(比如“仅在上午10点之后”或类似的东西),你可以在这里包含这个逻辑。
最后,安排工作来调用包,并安排每15分钟运行一次,或者经常你喜欢。它将每15分钟尝试一次,直到它成功运行,之后它将停止做任何事情,直到第二天。
作为奖励,您可以使用相同的包和作业来启动您想要以相同方式处理的所有任务。您只需要在历史记录/元数据表中保留有关所有这些任务的元数据。
另一种方法是创建作业步骤并将其保留为未计划,并创建一个ssis作业,作为所有作业的主人,它每分钟运行一次从配置表检查所有作业步骤,这些步骤今天尚未成功且任何找到使用sp_start_job执行。
如果它们成功运行,则将统计信息记录到日志表中,这可以防止它们在第二天再次启动。这可以防止你的所有工作需要每15分钟安排一次等,它们会尽快启动,你可以添加额外的逻辑来处理依赖关系,数字并行运行,重要性等级,开始时间,最新开始时间,最大数量到retty等