代码改变世界

8.5 SQL Server 代理

2018-08-01 09:52  笑一笑十年少!!!  阅读(1556)  评论(0编辑  收藏  举报

8.5 SQL Server 代理
本节探讨如何使用Microsoft SQL Server代理服务自动化SQL Server任务。SQL Server 代理服务作为依赖于SQL Server服务的Windows服务运行。SQL Server的每一个实例都将
会有自己的代理服务来管理作业、计划、操作员和膂报。您将了解到用于单个和多个服务
器管理配置的代理服务的基本组成部分。
SQL Server代理的主要目标是让数据库管理员的工作更轻松。理想情况中,可以配置
服务器并让它们运行,而从来不用担心丢失数据或数据库掉线。但是,这只是理想情况。
而且,因为您不可能每时每刻都盯着每个服务器,所以可以利用SQL Server代理来帮助完 成一些无法完成的工作。
注意:
SQL Server 2008速成版中没有SQL Server代理服务。
8.5.1 配置SQL Server代理服务
在第2 章中,我们学习了如何安装SQL Server,以及如何定义SQL Server服务和SQL
Server代理服务将使用的帐户、通常的配置是为两种服务使用相同的帐户,但并不是必须 这么做。实际上,由于特定的作业或管理要求,可能需要对这两种服务使用完全不同的凭
据。不管是否使用了同样的帐户,SQL Server代理必须是sysadmin固定服务器角色的成员, 而且在安装服务器的Windows操作系统中必须具有如下权限: • 为进程调整内存配额
• 作为操作系统的一部分运行
• 忽略遍历检查
• 作为批处理作业登录
• 作为服务登录
• 替换进程级标记
这些权限可以由编辑本地安全策略的管理员授予。如果SQL Server代理要和本地系统之 外的服务和功能进行交互,那么需要使用一个活动目录域帐户。这样SQL Server代理就可以 使用一个经过身份验证的帐户连接到一个远程文件系统、Web服务或另一个SQL Seiver。 如果对SQL Server采用默认安装,则不会后动SQL Server代理服务,而是要求手动控 制该服务的启动和停止。不要这样做!如果是为了自动化或膂报功能而使用SQL Server代 理,那么它必须运行。如果停止SQL Server代理,那么所有已计划的作业就都不能运行, 也没有操作员会收到表明一个作业运行成功或者失败的通知消息。安装SQL Server时,域
好把SQL Server代理配置为在Windows启动时自动运行。
然而,如果没有把SQL Server代理配置为fl动启动,那么就需要知道如何手动启动它。 就启动和停止SQL Server代理服务而言,实际上可以使用4 种不同的方式。 其中一种就是在Windows命令提示符下使用NET START命令:

NET START SQLSERVERAGENT
要停止此服务,可以使用NET STOP命令:
NET STOP SQLSERVERAGENT
还可以使用“管理工具”或 者 “计算机管理”控制台中的“服务”管理单元。使用这
个工具,可以配置运行该服务的帐户、更改启动行为、选择服务恢复选项,以及查看服务
的依赖关系。在第3 章中,我们学习了如何使用SQL Server配置管理器。同样,也可以用 它来配置SQL Server代理服务所使用的帐户、启动行为,以及错误报告选项。最后,可以
使 用 SQL Server Management Studio配 置 SQL Server代理服务的行为和属性。
本节将深入探讨如何配置此服务的各种属性,使您能够通过熟悉的工具了解每一个可
配置的元素。在 “对象资源管理器”中,可以右击“SQL Server代理”节点,然后根据需 要停止或是启动该服务。要配置此服务,可从上F文菜单中选 择 “属性”命令。
1. “常规”属性
在 “常规”属性页(如图8-17所示)上,可以看到服务的当前状态,并且可以配置SQL
Server和 SQL Server代理在意外停止时自动重新启动。还可以更改错误日志的位置,并选 择在日志中包含执行追踪消息以进行高级査错。另外还有一个 使 用 OEM(Original
Equipment Manufacturer,原始设备制造商)文件的选项。这样日志信息就可以以非Unicode
格式存储数据,从而节省系统上的空间。然而,如果错误日志包含任何Unicocie数据,就 可能比较难以读取或解释。最后,“Net Send收件人”部分指定了一个操作员,他可以收到
SQL Server写入日志文件的消息。
注意:
Windows Server 2003和 2008中默认禁用信使服务,所以INET SEND命令可能不可用。

 

2. “高级”属性
在 “高级”属性贞(如图8-18所示)中,可以启用事件转发,这 将 把 SQL Server事件 重定向到其他服务器。要配置这个选项,选 中 “将事件转发到其他服务器”复选框,然
后在下拉列表中选择一个可用的服务器或实例。配置完成之后,还可以决定转发什么类
型的事件。“未处理的事件”是没 有 由 SQL Server代理系统定义荠报的事件,或者可以选 择 “所有事件”。也可以决定转发严重性最低的事件。严重级别值将在本章稍后详述。
在这个窗口中,也可以定义CPU闲置阈值。如果有作业计划定义了作业(如备份事务
日志),要求在CPU闲置时执行,这就相当有用。在这种情况下,默认值表明必须将CPU
使用率低于10%保 持 10分钟。必要时可以调整这个值以满足性能需求。

3. “警报系统”属性
在 “警报系统”属性页(如图8-19所示)上,可 以首先定义是否启用SQL Server代理的 邮件服务。如果希望操作员通过电子邮件接收警报通知,则应该启用这个功能。也可以决
定是否使用数据库邮件功能或SQLMail功能。注意,SQLMail仅是为了向后兼容而存在, 不应与新的应用程序一起使用,因为它将会被淘汰。如果是从以前版本的SQL升级,那么
应该尽快把应用程序转换为使用数据库邮件。 •

一旦选择了邮件系统(最好是数据库邮件),就可以选择一个合适的配置文件。如果使
用 的 是 SQLMail,则 可 以 测 试 MAPI连接性,然 后 允 许 在 Microsoft Outlook配 置文件的“已 发送邮件”文件夹中保存已发送消息。
如果需要寻呼操作员,则可以在消息的“收件人”行、“抄送”行 和 “主题”栏里配
置地址格式的选项,还可以选择在页面中包含电子邮件消息的正文。除此之外,可以定义
一个防故障操作员以及通知该操作员的方法。防故障操作员的角色会在本章稍后详述。
最后,还有一个选项是“为膂报的所有作业响应替换标记”。标记是本章稍后将讨论
的作业步骤的一个功能(同变fi相似)。现在只需要明白这个选项为警报系统执行的任何作 业启用了标记替换,把变量替换为实际值。
4. “作业系统”属性
在 “作业系统”属性页(如图8-20所示)中可以为作业指定超时值。这个选项配置了在
强制终止作业之前,SQLServei•代理会等待多久让其自己完成。默 认 值 是 15秒 ,但应该知 道一些特定作业(由于其本身的复杂姓)可能需要的时间或执行的操作类型。

还有一个选项可以将非管理员帐P 配置为作业步骤的代理帐户。这个选项只有在使用
SQL Server Management Studio管理旧版本的SQL Server及其相应的代理服务时才适用。可
以通过提供用户名、密码和域名来指定帐户的身份验证信息。8.5.3—节将介绍为SQL Server 2008作业步骤配置代理帐户的内容。
5. “连接”属性
如果需要连接到一个使用非标准连接属性的SQL Server实例,可以输入一个SQL Server 使用的别名,使代理服务建立和保持•个连接(如图8-21所示)。也可以指定是否要求SQL
Server代理服务使用Windows身份验证或SQL Server身份验证。如果选择使用SQL Server身
份验证,必须为属于sysadmin固定服务器角色的成员的帐户提供一个有效的登录名和密码。

6. “历史记录”属性
最后,“历史记录”属性页可以为msdb数据库中的作业日志配置保留设置。默汄情况 下,sysjobhistory表中最多可以存储1000行,而每个作业AT以使用的不超过100行。可以 使用这个窗U删除或更改对作业历史记录表的人小限制(如图8-22所示)。

也可以让SQL Server代理服务自动清除sysjobhistory表中的旧作业历史记录行。这一 功能默认禁用。但是如果启用了它,就可以指定多少天、周或月之前的作业历史记录是必
须从数据库中清除的。如果需要无限期地维护作业历史记录,或者需要有更大的控制权来
决定清除哪些作业历史记录,可以考虑创建一个自定义作业来满足需求。
8.5.2 SQL Server代理安全性
在计划使用SQL Server代理服务或允许其他用户访问它时,需要确保已授予了合适的 访问权限。默汄情况下,只有sysadmin固定服务器角色的成员才具有SQL Server代理服务 的完全访问权限。在 msdb数据库中,其他角色是用不同级别的权限创建的,但是在向这 些角色显式添加用户以前,它们都是空的。本节将介绍这些角色以及指派给它们的权限。
1. SQLAgentUserRole
SQLAgentUserRole是 3 种 SQL Server代理角色中最受限制的角色。作为该角色的成
员的用户可以创建新的作业和计划,但是只能管理自己创建的作业和计划。而且,他们不
能查看系统中其他作业的属性,也不能定义操作员或代理。如果他们需要把一个操作员或
代理指派给一个作业步骤,则该操作员或代理必须是已经定义好的。这个角色的成员也不
能删除作业历史记录信息,即使是自己拥有的作业,除非他们被授T* sp_purge_jobhistory 存储过程的EXECUTE权限。对该角色的另-个重要限制是它不能创建或管理多服务器作
业。这意味着该角色成员创建的任意作业被局限于创建该角色的服务器上。
2. SQLAgentReaderRole
SQLAgentReaderRole可以使用P 创建木地作业和计划,并只管理他们自己所创建的本 地作业和计划。除了这些权限之外,他们也可以杏看其他本地作业和多服务器作业的属性。
这使得他们可以审核服务器上其他作业的配置,但没有任何权限可以更改这些设置。这个
角色的成员也不能创建多服务器作业,但是可以査看所有本地和远程作业的作业历史记录。
这个角色的成员也不能删除他们所拥有的作业的历史记录,除非他们获得了
sp_purge」obhistory 存储过程的 EXECUTE 权限。
3. SQLAgentOperatorRole
这个角色的成员可以创建本地作业,以及管理和修改他们拥有的作业。他们还可以查
看和删除所有本地作业的作业历史记录信息。在有限的范围内,他们还可以启用或禁用其
他用户的作业和计划。不过,他们仍然不能创建和管理操作员和代理。他们还只限于只读
访问多服务器作业。除了 sysadmin固定服务器角色之外,这个角色被授予的针对SQL Server 代理服务中作业系统的权限是最多的。
8 .5 .3 创建作业
作业是SQL Server代理服务的真正核心。它是通过一系列步骤执行的操作,包括运行 Transact-SQL脚本、启动命令行应用程序、ActiveX脚本任务、复制任务以及其他多种任

务。每个任务被定义为一个单独的作业步骤。作业系统设计的一部分是建立毎个任务,以
便在作业步骤之间建立依赖关系和工作流。一个很简单的例子就是一个夜间运行的备份作
业,该作业完成后会通过电子邮件通知管理员。作业的简单和复杂程度取决于想要它完成
什么任务。有时,由于前面提到的超时设置,您需要创建多项作业,而不是一个单一的、
过于复杂的作业。
试一试 创建一个新作业
首先在SQL Server Management Studio中创建•个新作业。在这个例子中,将只在“常
规”属性页上填充有关该作业的最基本的信息。可以在这个练习中自由浏览其他属性页,
但要知道本章稍后才会介绍那些页面中的可配置选项。
(1) 在 “对象资源管理器”中,展 开 “SQL Server代理”节点。 (2) 右 击 “作业”节点,选 择 “新建作业”命令。
(3) 在 “新建作业”对话框(如图8-23所示)中,输入Simple Backup作为作业名。 (4) “所有者”栏保持默汄值。
(5) 在 “类别”下拉列表中选择“数据库维护”列表项。
(6) 在 “说明”框中输入 “Simple Backup Job. Test 1 ”。
(7) 取消选中“已启用”复选框。
(8) 单 击 “确定”按钮。

这就创建了一项新的作业,并且在关闭“新建作业”窗口之后就停止其运行。因为该
作业还没有步骤,让其运行不可能有多大的危害,似是还是应该养成这样的刃惯,直到测
试完作业,确保它们像预期的那样工作。
现在看一下如何使用T-SQL创建-个新作业。sp_add_job存储过程允许创建一个新作 业,并设置作业的可配置选项。表 8-7列出了 sp_ add Jo b 的所有选项。

现在可以看一下如何使用sp_addjob存储过程创建一个仅有 一 些 基 本 元 素的新作业。 在创建了其他诸如计划、操作员和警报等元素之后,将把它们添加到本节所创建的作业中。
在这个例子中,将创建-个新作业,用来进行数据检索任务。
DECLARE @jobid uniqueidentifier; EXECUTE msdb.dho.sp_add_j ob @job_name = 1 Poor Performers Report’, ^description =*Monthly task to indicate which sales team members have less than remarkable sales figures over previous year *, @job_id =@job—id OUTPUT;
SELECT @job_id
关 于 job_id参数,需要注意它使用imiqueidentifiei•数据类型。这种数据类型也被称作
全局唯一标识符(Globally Unique Identifier, GUID)。如果作业或计划被用于多服务器作业,
它们都会使用GUID。本章稍后会介绍多服务器作业。
如 果 使 用 sp addjob存储过程添加一个作业,那么还需要确保可使用sp addjobserver 存储过程使作业在服务器上运行。如果作业要在本地服务器b运行,就需要通过job_id或 job name定义作业,如下例所示:
EXECUTE msdb.dbo. sp一add_j observer @job一name='Poor Performers Report *;
现 在 SQL Server代理服务已经有两个新作业可用。它们都没有定义步骤,所以运行它 们不会有任何结果,只会收到一个失败消息。在将步骤添加到作业中之前,看一下如何管
理作业类别。
1 . 类别
管 理 作 业 类 别 的 最 简 单 ,也 是 首 选 的 方 法 是 使 用 SQL Server Management Studio。 虽 然可以直接编辑syscategories表 ,但是不推荐这样做。可以添加新的类别,并删除用 户创建的类别。但要注意,不能删除内置类别。在这个例+中,将增加一个新的类别,叫
做 AW-Performance Tasks。
试一试 创建一个新类别
⑴ 在 “对象资源管理器”中展幵服务器,然 后 展 开 “SQL Server代理”节点。 (2)右 击 “作业”节点,选 择 “管理作业类别”命令。
⑶ 在 “管理作业类别”窗口(如图8-24所示)中,单 击 “添加”按钮。
(4) 输入 AW-Performance Tasks 作为类别名。
(5) 选 中 “显示所有作业”复选框。
(6) 选 中 Poor Performers Report作业行中的复选梢。
(7) 单 击 “确定”按钮。
(8) 单 击 “取消”按 钮 关 闭 “管理作业类别”窗口。

这样就成功创建了 AW-Performance Tasks类别,并 把 Poor Performers Report作业添加
到了该类别中。现在您创建的任何作业都可以使用此类别。
2 .创建作业步骤
现在已有一些可以使用的作业,需要把一呰简单的步骤添加到这些作业中。在此之前,
看一下可以定义的各种类型的作业步骤,如 表 8-8所示。

对每-个作业步骤类型來说,如果作业所有者或运行作业的登录名没有权限执行该类
型的任务,则可以标识一个或多个代理帐户来执行这一步骤类型。这可以让用户运行那些
包含了在他们自己的凭据下无法运行的步骤的作业。本章稍后将介绍如何创建和管理代理
帐户。

 

第一个例子使用SQL Server Management Studio编 辑 Simple Backup作业的属性。您将 添加一个Transact-SQL步骤,将 AdventureWorks2008数据库完整备份到本地磁盘上。在此
之前,应当在C 盘上创建一个dbBackups文件夹。 (1) 在 “对象资源管理器”中,展开服务器,再展开“SQL Server代理”节点。 (2) 展 开 “作业”节点。
(3) 右 击 Simple Backup作业,选 择 “属性”命令。 (4) 在 “选择页”列表下选择“步骤”页。
(5) 单 击 “新建”按钮。
(6) 在 “步骤名称”框中,输入 AdventureWorks2008 Backup。 (7) 在 “类型”下拉列表中,选择Transact-SQL。
(8) 对 “运行身份”不做改动。
(9) 确保选中master数据库。
(10) 在命令窗口中输入如下代码:
BACKUP DATABASE AdventureWorks2008 TO DISK = 1C :\dbBackups\AWFull.bkf';
(11) 单 击 “确定”按钮关闭“新建作业步骤”窗口。
(12) 单 击 “确定”按钮关闭“作业属性”窗口。
(13) 在 SQL Server Management Studio注意中,它提醒最后一步 将 从 “转到下一步”
改为“成功后退出”。单击“是”按钮。
现在已经创建了一个简单的作业步骤。右击该作业,在弹出的上下文菜单中选择“启
用”命令,就可以启用该作业。即使作业被禁用,也可以随时手动运行该作业,方法是右
击并选择“启动作业”命令。该作业应当可以成功执行。
如果冋到作业步骤属性并查看“髙级”屈性页,可以注意到有配置作业在这一步骤完
成时如何回应的选项。如果作业成功执行,可以让它执行如下任务之一:
• 转到下一步
• 退出报告成功的作业
• 退出报告失败的作业
• 转到步骤:(序号)
注意:
转到某一特定序号的步骤的选项只有在该作业中有多个步骤时才可用。要小心创建循
环作业(其中作业步骤1转到下一步骤,而作业步骤2返回到作业步骤1).
在这一页上,也可以指定重试次数,以及服务器在两次重试之间等待的时间(分钟)。
如果作业步骤不能成功完成,还可以定义作业的行为。在定义步骤失败后的行为时,可以
使用的选项与步骤成功时相同。
另外,根据执行的步骤类型的不同,可以定义其他选项或参数。例如,对于Transact-SQL 步骤,可以指定一个输出文件,将输出记录到表,以及在历史记录中包含步骤输出。可以
指定应该作为哪个用户运行该步骤。

sp_add」obstep
可以使用sp_addjobstep存储过程将步骤添加到一个现有的作业中。使用该过程可以 将步骤附加到一个现有的作业上,或在两个现有的步骤之间插入一个新的步骤。表 8-9是
sp addjobstep参数的一个详细列表。

注 意 :
在 SQL Server联机丛书中还有其他一些参数,它们被标识为“保留的”.由于它们未 被配置,所以此列表中没有包括它们。
现在为Poor Performers Report作业创建两个作业步骤。第一个步骤将生成一个电子邮 件消息,标识了今年的销售业绩没有超出前一年200 000美元的销售人员。第二个步骤将
通过电子邮件向管理员说明作业已经成功:
- - Create the First Step
EXECUTE msdb.dbo.sp_add_jobstep
@job_name = * Poor Performers Report *, @step_id =1, @step_name = * Send Report1, ^subsystem =*TSQL*, @command =•DECLARE QtableHTML NVARCHAR(MAX); SET QtableHTML = N''<Hl>Lowest Sales Increase</Hl>" + N* *<table border=l>" + N* *<tr><th>First Name</thxth>Last Name</th>" +

N* *<th>Current Year Sales</th>" + N* *<th>Previous Year Sales</th>H + CAST ((SELECT td = pC.FirstName, •… , td =pC.LastName, •••*, td -sP.SalesYTD, ■… , td =sP.SalesLastYear, ' 1 * * FROM AdventureWorks2008.Sales.Salesperson AS sP INNER JOIN AdventureWorks2008.HumanResources.Employee AS hrE ON sP.BusinessEntitylD =hrE.BusinessEntitylD INNER JOIN AdventureWorks2008.Person.Person AS pC ON hrE.BusinessEntitylD =pC.BusinessEntitylD AND hrE.BusinessEntitylD =pC.BusinessEntitylD WHERE (sP.SalesYTD - sP.SalesLastYear) < 200000 FOR XML PATH(* *tr'*), TYPE ) AS NVARCHAR(MAX) ) +
N*'</table>••;
EXECUTE msdb.dbo.sp_send_dbmail @recipients = * 1 Gregory.House@adventureworks.com'*, ^subject = 1 * First to go...'', @body =@tableHTML, @body_format = ••HTML1 *; 1;
- - Create Step 2 EXECUTE msdb.dbo.sp_add_jobstep @job一name = 1 Poor Performers Report1, @step_id =2, @step一name = *Notify Administrator*, ^subsystem = 1TSQL1, ^command = * EXEC msdb.dbo.sp_send dbmail ^recipients =••administrator@adventureworks.com* *, ^subject = * * Message Sent", Qbody = 1 *The Monthly Sales Report has been sent", @body_format = •* HTML1 •;';
现在,必须使之前创建的步骤在第一步完成后转到下一步。为此,可以使用
sp updatejobstep存储过程,如下所示:
EXECUTE msdb.dbo.sp_update jobstep @job_name = 1 Poor Performers Report *, @step_id =1, @on_success_action =3;
在 on success action设置为3 时,这一步骤将转到下一步。
3 .标记替换
SQL Server 2008在作业步骤中使用标记作为参数占位符。这些标记允许SQL Server

代理服务在运行时使用一个实际值来替换标记(当在SQL Server Management Studio中作为
査询执行时,不会替换这个标记)。这就像在脚本或应用程序中使用变量一样。当编写作业
时,可以考虑使用-些标记提供准确的作业状态报告。这些标记还可以使作业变得更加灵
活。表 840列出了 SQL Server代理服务支持的标记。

4 .在作业步骤中使用标记
SQL Server 2005 Service Pack 1显著改变了标记在作业步骤中的使用方式。在这之前,
只能像变量一样使用标记,如下所示:
PRINT »The database backup of $ (A-DBN) is now complete.▼
如果作业备份了 AdventureWorks2008数据库,作业步骤将返冋卜列输出:
* The database backup of AdventureWorks2008 is now complete.'

SQL Server 2008中的作业步骤要求使用转义宏来成功替换标记。转义宏用来防止替换 标记的数据中存在无效字符而导致的分析错误。例如,如果把SQL Server安装在一个名为
C: \Finance Department’ s Database的文件夹里,并尝试使用$ (SQLDIR)标记,那么作业步
骤可能会失败,因为它会认为值以department结束。表 8-11 列出了转义宏及其用途。

因此,正确使用标记的方法是在调用标记时使用适当的转义宏。例如,下面的例子防
止了一个包含了单引号(这是可能的)的数据库名称造成命令过早结束:
PRINT 'The database backup of $ (ESCAPE_SQUOTE(A-DBN)) is now complete.*
在 SQL Server 2008中,由于对Windows事件日志有写权限的用户可以访问SQL Server
代理警报或W MI事件激活的作业的步骤,所以在由警报启动的作业中使用的标记默认是
禁用的。要启用这些标记,可启用SQL Server代理属性的“警报系统”页中的“为替报的 所有作业响应替换标记”选项。