我正在使用 SQL Server 代理来安排非数据库任务 - 这是一个坏主意吗?

Sql*_*yan 13 sql-server sql-server-agent windows-server scheduled-tasks

由于我是一名 DBA(并且在许多情况下,事实上的系统管理员),SQL Server 安装在我必须定期使用的几乎每台服务器上。我最近意识到我在几乎所有情况下都使用 SQL 代理作为作业调度程序,而不是本机 Windows 任务调度程序。

从我的角度来看,SQL Agent 比原生的 Windows 任务计划程序有很多优势:

  • 远程(从我的工作站)启动/停止/监控任务
  • 共享计划(而不是每个任务单独执行)
  • 多个步骤和控制流程
  • 不同类型的任务
  • 失败/完成警报
  • 可以配置为不同的用户
  • (适度)描述性错误消息,而不仅仅是错误代码

但是,我无法逃避这是一种不好的做法 - SQL 代理应该只保留用于与数据库相关的任务,并且我应该让操作系统级别的任务在 Windows 任务计划程序中运行,尽管我不喜欢它的可用性。

这样依赖SQL Agent可以吗?如果没有,我是否应该考虑使用第三方 Windows 任务调度程序来获得我正在寻找的某些功能?

Aar*_*and 9

在我之前的工作中,我正是这样做的,主要是因为这些工作都是从我们的中央主集群运行的,这是最明显的服务器。我可以在一个地方看到我们所有的计划任务,而不必去检查一堆服务器上的命令行内容。

虽然这在很大程度上是主观的(并且很难以这种格式得出“正确”的答案),但我认为这种方法除了成为单点故障之外没有任何本质上的错误。

如果所有任务都与正在启动的数据库服务器和正在运行的 SQL Server 服务(在我们的例子中,确实如此)交互或依赖,那么这可能无关紧要。

哦,您需要在任务尝试运行的服务器未启动的情况下添加错误处理 - 如果任务设置在该服务器上,您就不必这样做。


Bac*_*its 7

我个人认为最大的警告是难以组织工作清单。据我所知,您无法创建文件夹来组织作业,因此数量过多会很麻烦。不过,我不是 100% 确定这一点,因为我的服务器都没有超过十几个工作。Server 2008 和更高版本的任务计划程序允许更轻松的组织,IMO,并且通常比以前的版本具有更好的功能。我相信第三方应用程序做得更好。如果我必须使用 Server 2003 的任务调度程序或at.exe.

我能想到的第二个警告可能是在 SQL 服务器上施加了过多的负载。Agent 是一个小程序,但是运行一个很长或很复杂的任务很容易消耗大量资源。这些资源将不可用于 SQL 引擎。由于 SQL 引擎被编程为占用大约 80% 的可用系统内存,这可能是一个问题。

第三,备份可能是一个问题。您不仅需要备份文件系统,还需要备份 msdb 数据库以允许恢复作业(或使用某些东西将任务脚本写入文本文件)。这给灾难恢复增加了一层复杂性。

最后,您不希望仅仅为了运行 SQL Server 代理而支付 SQL Server 许可证费用。如果数据库停用,您需要制定迁移 SQL Server 代理的计划。