【问题标题】:How can I automatically restart a stopped stored procedure in SQL Server 2008?如何在 SQL Server 2008 中自动重新启动已停止的存储过程?
【发布时间】:2012-06-29 10:16:54
【问题描述】:

我有一个必须不断运行的存储过程。有时,由于目前未知的原因,它会停止。如果发生这种情况,我怎样才能让它自动重启 SP? Google 搜索并没有多大帮助,因为所有结果都是关于重新启动服务器,而不是存储过程。感谢您提供的任何帮助。

这是一个 SQLCLR 存储过程,如果这有什么不同的话。

【问题讨论】:

  • 你的意思是一个存储过程,一旦它开始,就永远不会结束——它只是不停地跑掉,还是一个重复运行的过程,一旦一个运行停止,它就会在一个无限循环中重新启动?因为存储过程从来都不是长时间运行的进程,这就是它的读取方式。
  • 不断运行是什么意思?它永远不会终止?如果它永远不会停止并不断累积导致死锁的锁,则服务器可能会决定杀死它以解决死锁
  • @DavidStratton 如果存储过程不打算长时间运行,还有其他方法可以让 SQLCLR 程序集持续运行吗?这就是 SP 所做的一切,它调用程序集
  • @PanagiotisKanavos 我很确定它不会累积任何锁,所以我认为这不是问题。
  • 编写应用程序或服务来调用程序集。我什至不会想到您的解决方案,不确定我是否会考虑实施它。 PS你知道它为什么会停止吗?

标签: sql-server sql-server-2008 stored-procedures sqlclr clrstoredprocedure


【解决方案1】:

您无法自动重新启动它。这样的功能不存在内置,因为它不是程序的真正目的。

我会设置一个 SQL Server 代理作业,它每 N 秒(N = 1 或 15 左右)执行一次,并在需要时重新启动该过程。

您需要一种方法来检测它是否仍在运行。您可以通过让存储过程在一个特殊的标记表上持有一个排他锁来做到这一点。检查程序可以从该表中读取WITH (READPAST)。如果没有行返回,sproc 仍然持有锁,因此它必须处于活动状态。

【讨论】:

  • 听起来不错,但你说这不是程序的目的。有没有其他东西是是的目的,我可以用它来代替SP?
  • 使用代理作业来调用您的过程。
  • 我猜你可以有一个窗口服务。这些是长期运行的,它们可以自动重启。
【解决方案2】:

编写另一个 sp 检查第一个是否正在运行,如果没有则启动它。好奇心让我心烦意乱,这玩意儿有什么作用?

【讨论】:

  • 我想过这个问题,但是如果另一个发生了什么事呢? sp 是从 C# Telnet 接口构建的 SQLCLR 程序集。它连接到一个精美的条形码扫描仪,并将其中的数据传递到数据库中的一个表中。
  • 从内置的 windows 或 sql server scheduler (agent) 服务触发检查过程。它不必一直运行,只要经常检查就不会错过数据。
  • 嗯,这是个好主意。我知道它应该读取的频率,所以我可以将触发频率设置得比这更快。但是,这会使用更多的处理器能力吗?
【解决方案3】:

只要你有一台 Rube Goldberg 机器,不妨让它变得更有趣。

这样重写proc:

  1. 从服务代理队列中弹出消息。 “为什么”稍后会变得很明显。
  2. 将消息放入服务代理队列。不管是什么。
  3. 无论 proc 现在做什么。

现在,将存储过程设置为队列的激活存储过程,设置 max_queue_readers = 1 即可开始比赛。

【讨论】:

  • 我什至没有意识到我正在做的是一个鲁布戈德堡。我对 SQL 还是很陌生。现在我知道了,我有点想找到更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2019-03-06
相关资源
最近更新 更多