1

我有一个必须安排的任务列表,比如 cron。这是用于 sql server 上的备份。

数据库将以多种组合方式执行 FULL、DIFF、LOGS 备份。

所以:

  • 每天早上 8:00 吃饱
  • 每小时差
  • 每 10 分钟记录一次

但是,我有这个问题:

  • 如果服务器在上午 8:15 醒来,则不执行 FULL 任务。
  • 如果 FULL 失败,则执行 DIFF & LOG 没有意义
  • 如果服务器在周六早上 8:15 醒来,LOG 开始 8:20 启动,那么完整必须等待下周一。
  • 如果 LOG 占用太多(上午 9:01 未完成),则 DIFF 在 LOG 尚未完成时开始。我不想那样!

我用quartz.net做这个,但那是切线的-我愿意更改lib,删除它等等-。所以我的主要目标是任务顺序/执行的可靠性。

在顺序代码中,这很容易做到:

  • DO_FULL 那么
  • DO_DIFF 那么
  • DO_LOG

但是,使用调度程序这是不可能的(至少使用石英)。

问题在于时间的管理。当任务被标记为每小时开始时,必须更多的是提示而不是硬规则,因为前一个可能没有完成。此外,做 FULL 是开始循环的必要条件。

我想知道算法必须在这里应用。

4

2 回答 2

0

最简单的解决方案是编写一个 Windows 服务(根据设计,它可以连续运行)。

  1. Windows 服务在 8:00 唤醒其线程 (T0) 之一。
  2. T0 执行必要的验证并在失败时发出警报并中止,否则生成完整备份线程 T1。
  3. 只有当所有验证都很好时才会执行 T1,所以只需继续备份。
  4. 如果 T1 成功完成,服务将唤醒其差异线程 (T2) 和日志线程 (T3)。
  5. T2 和 T3 检查 T1 的最后一次成功运行。如果 T1 失败,T2 和 T3 也会中止。
  6. T2 每小时执行一次,执行 diff 并休眠。
  7. T3 每 15 分钟执行一次。它必须检查 T2 是否正在运行,如果是,则再次休眠(x 秒)并重试。如果 T2 没有运行 T3,则应履行其职责。
  8. 在一天结束的某个预定时间,如果需要,所有线程都应该被重置或中止。
于 2012-08-11T00:12:53.143 回答
0

您将需要跟踪执行的任务。例如,要运行 DIFF,必须先执行 FULL。为此,请启动任务并将 FULL 的状态设置为 false。当 FULL 完成其工作时,将状态设置为 true。当 DIFF 有时间运行时,它会检查 FULL 是否准备好(基于 FULL 生成的真或假值)。如果不是,则 DIFF 只是等待,直到 FULL 发送它已完成其工作的信号(真)。LOG 运行也是如此。这是实现顺序行为的一种简单方法。

于 2012-08-11T00:35:05.580 回答