SQL Server代理是所有实时数据库的核心。代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的。这系列文章会通俗介绍它的很多用法。
SQL Server代理作业有一系列的一个或多个作业步骤组成。一个作业步骤会分配给特定的作业子系统,用来标识将要进行的作业步骤工作种类。每个作业步骤在各自安全上下文运行,尽管每个作业有可以决定谁可以修改作业的拥有者。这篇文章会聚焦组成SQL Server代理作业的作业步骤和子系统。
认为SQL Server代理作业的最好方式是关联一系列需要进行指定任务的组件的容器。作业的主要组件是作业步骤,计划,警报和通知。
当作业被创建时,拥有者会分配给作业。如第一篇提到的,默认的拥有者会是创建作业的用户(不管使用T-SQL,通过sp_add_job系统存储过程或使用SSMS)。SQL Server代理的大部分功能假设你是sysadmin服务器角色成员。如果是的话,一旦作业创建后,那么你或任何其他sysadmin服务器角色成员可以修改作业。如果你想非sysadmin服务器角色成员可以修改作业,那么你应该修改作业拥有者为登录的用户。注意sysadmin成员可以修改任何作业,不管作业拥有者是谁。
如第一篇提到的,SQL Server代理里的作业至少要有一个作业步骤组成。当大多数人想SQL Server代理进行一些工作时,他们真正的意思是作业步骤。作业步骤是你定义的想要进行的行动类型,包括一下能运行的作业子系统:
我们来创建一个作业,至少需要一个作业步骤,备份Mater数据库。创建一个新的作业,如插图1所示,我命名它为"备份Master数据库"。
插图1——创建新的作业
现在点击【步骤】标签来查看作业步骤,点击【新建】弹出【新建作业步骤】对话框(插图2)。
在我们进行备份前,我在这个作业步骤里进行master数据库的完整性检查。我可以在一个步骤里完成所有操作,但这里我想向你展示下步骤间的作业流。我取我的作业名称为“检查Mater数据库的完整性”,类型设置为T-SQL。数据库上下文是mater,我在文本框里输入了一个简单的命令:
1 DBCC CHECKDB
插图2——创建新的作业步骤
对这个对话框做一些简单解释。下拉框类型是用来选择SQL Server代理子系统。可选的子系统在下面会解释。对于T-SQL作业步骤没有安全代理账号,因此作业步骤会在作业拥有者的上下文里运行。安全代理账号可以让作业步骤以不同用户安全上下文运行,通常给作业使用而不是sysadmin组成员。
你选择的作业子系统会改变对话框的剩余内容。对于T-SQL的作业步骤,一个简单的文本框会给你输入你的T-SQL,如我这里所做的。每个作业步骤会有不同相关的子系统。
接下来,点击作业步骤里的【高级】。你会看到如插图3所示的界面。【成功要执行的步骤】定义一旦作业步骤成功执行将发什么的事。默认选项是【转到下一步】,意味着如果作业里有多个作业步骤,这步完成后,执行下一步。如果点击下拉框,你会看到其他选项——包括现存的作业(成功或失败的提醒),或跳转下另一步。注意这个最后选项,跳到另一个步骤,不会显示,知道作业里你有第二个步骤。
插图3——新建作业步骤高级选项
如果作业因某些原因失败,你可以选择作业步骤的【重试次数】。你也可以指定每个尝试成功完成作业步骤间的延迟(分钟为单位)。下面是失败的操作(例如作业不能完成或在错误代码里结束)。这个选项和成功的操作一样,有不同的默认值(如你所预料)。
因为这是个T-SQL的作业步骤类型,你可以有来自T-SQL命令记录的命令输出(就和sql命令里 -o参数)。你也可以将结果写入表(MSDB里的sysjobsteps表)。
点击【确定】,点击【新建】增加第2个作业到作业。假设步骤1没有生成错误,这个下一步作业步骤备份master数据库。这里我系统里的命令:
1 BACKUP DATABASE [master] TO DISK = 2 N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\master.bak' 3 WITH INIT
插图4——备份master数据库的第2个步骤
因为这个事作业的结束,点击【高级】,选择【成功要执行的操作】为:退出报告成功的作业。好了——你可以点击【确定】了,完成后的作业步骤如插图5所示。
插图5——完成的作业。
选择点击【确定】完成作业定义,并运行作业。当你点击运行作业时,注意因为有多个步骤,你会被问从哪个步骤开始你的祖业。从第一个步骤来运行作业(如插图6所示),围观下作业流,第1步成功执行后然后移到的第2步——最后一步作业。
插图6——作业开始步骤选择(选择第1步)
一谈成功完成,作业标记为成功并退出(如插图7所示)
插图7——作业成功执行
你会用到7个主要作业子系统。这个数字不包含复制子系统,因为它们情况特殊,典型的这些作业步骤和作业由复制组件创建而不是DBA。对于下片文章,我们会延迟3个分析服务子系统的讨论,因为它们有几个独特的考虑。
T-SQL子系统非常直接,是你最常创建的作业步骤。它允许你对于本地SQL Server实例运行T-SQL,当然SQL Server代理也是本地和它关联的。注意不像分析服务子系统,你只能连接到本地SQL Server实例。对于T-SQL,没有代理能力,因此对于T-SQL的作业步骤只在作业拥有者的安全上下文里运行。
ActiveX子系统允许你运行VBScript,Jscript,或其他自定义的脚本(理论上)。脚本默认在SQL Server代理服务账号的安全上下文里运行。如果你擅长VBSccript,这是个方便的子系统,但这个子系统已经从SQL Server 2008剥离,你应该使用PowerShell来替代。
CmdExec子系统允许你运行操作系统命令(如同你打开命令提示行)。命令会在SQL Server代理服务账号的安全上下文里运行。这里要记住的关键是没有用户可以点击或接受任何提示符,因此请确保你的脚本运行没有用户干预。
PowerShell子系统允许你Windows PowerShell 1.0或2.0兼容的脚本。如其他脚本子系统,甲苯默认在SQL Server代理服务账号的安全上下文里运行。PowerShell非常强大,你应该认真学习并掌握它。PowerShell允许连接到远程系统,因此这是绕开T-SQL子系统的限制,可以连接到远程SQL Server实例。
如你所见,SQL Server代理作业步骤是作业内容的核心问题。有很多不同的子系统,每个提供你不同的能力。在这个系列的下一步,我会在作业步骤上检查加强安全的代理能力,还有SQL代理子系统剩下部分——分析服务。