什么是SQL Server代理服务?
SQL Server代理服务是SQL Server中的一个可选组件,它为DBA(数据库管理员)提供了一种在指定时间和日期运行SQL Server作业的机制。作业是一组可以由SQL Server代理服务在特定日期和时间自动执行的连续步骤。
与其他计划程序不同,SQL Server代理服务可以在Windows服务中以本地系统或其他安全上下文运行,因此可以执行操作系统层面的任务,例如备份文件或发送电子邮件通知。
SQL Server代理服务的组件
SQL Server代理服务中的Agent核心服务
SQL Server代理服务中的核心服务是SQL Server代理服务(C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn\SQLAGENT.EXE),它作为一个Windows服务运行,可以通过SQL Server Configuration Manager启动,暂停,重新启动,恢复和停止。
它还具有Windows事件记录集成,可在事件日志中记录重要事件,例如代理服务启动/停止,代理任务执行成功/失败等。这些事件可用于监视代理服务的操作与性能。
SQL Server代理服务中的作业
代理服务中的主要实体是作业。作业是一组一次性或定期运行的连续步骤。步骤可以是T-SQL脚本,ActiveX脚本,操作系统命令或SSIS包。
作业可以在代理服务中通过SQL Server Management Studio、Transact-SQL命令或代理服务对象模型进行创建、管理和监视。在SQL Server Management Studio中,可以使用向导来创建作业,步骤和计划,也可以手动创建每个对象。作业属性包括名称、描述、类别、扩展属性和步骤。步骤属性包括名称、类型、命令和输出文件位置。
SQL Server代理服务中的警报
代理服务中的另一个重要实体是警报。警报定义了一组条件和操作,以便代理服务可以在条件满足时执行操作,如向管理员发送电子邮件或在事件日志中生成条目。
警报可以在SQL Server Management Studio中管理,包括创建、编辑、启用和禁用。SQL Server代理提供了几个内置警报,例如SQL Server Agent错误,以便快速设置通知关键事件的方法。
SQL Server代理服务的用途
SQL Server代理服务为DBA提供了一种自动化管理SQL Server实例的方法。下面是一些SQL Server代理服务可以执行的常见任务:
自动备份数据库
使用代理服务,可以创建一个备份作业,该作业将定期运行自动备份数据库。例如,以下是一个备份作业,它以全备份和差异备份的形式每天备份AdventureWorks2017数据库。
BACKUP DATABASE [AdventureWorks2017]
TO DISK = N'C:\Backup\AdventureWorks2017-Full.bak' WITH NOFORMAT, NOINIT,
NAME = N'AdventureWorks2017-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,
STATS = 10
BACKUP DATABASE [AdventureWorks2017]
TO DISK = N'C:\Backup\AdventureWorks2017-Diff.bak' WITH DIFFERENTIAL,
NAME = N'AdventureWorks2017-Differential Database Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
自动压缩和清理备份文件
如果你自动备份数据库,则通常还希望自动清理旧备份和压缩备份文件。SQL Server代理服务以及Windows命令脚本可用于执行此操作。例如,以下是一个命令脚本,可以自动压缩和清理在7天前创建的备份文件。
forfiles /p "C:\Backup" /s /d -7 /c "cmd /c 7z a @path.zip @path & del /f /s /q @path"
运行复杂的查询
代理服务还可以在可控时间内运行复杂和长时间运行的查询,而无需从SSMS或其他工具中离开此查询。例如,以下是一个代理作业,可以每天以HTML格式发送报告并统计AdventureWorks2017数据库中的销售订单。
EXEC msdb.dbo.sp_send_dbmail
@profile_name='Adventure Works Administrator',
@recipients='yourname@yourcompany.com',
@subject='Sales Order Report',
@query='SET NOCOUNT ON;
SELECT
COUNT(*) AS [Number of Sales Orders],
SUM(TotalDue) AS [Total Sales Amount]
FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN '2017-01-01' AND '2017-12-31'
',
@attach_query_result_as_file=1,
@query_attachment_filename='SalesOrders.html',
@query_result_separator=',',
@query_result_header=1,
@query_result_width =32767,
@query_result_to_file =1,
@query_result_no_padding=1
运行Integration Services包
代理服务可以运行Integration Services包,该包通常涉及读取和写入数据到数据库、文件和网络服务。例如,以下是一个代理作业,可以每天运行一个Integration Services包,该包从Excel文件中提取数据,并将该数据加载到AdventureWorks2017数据库表。
dtexec /F "C:\SSIS\Packages\ExcelToTable.dtsx" /SET "\Package.Variables[User::ExcelFilePath].Properties[Value]";"C:\Files\ExcelData.xlsx"
总结
通过SQL Server代理服务,DBA可以轻松自动化管理SQL Server实例。代理服务可以创建作业、警报,运行T-SQL脚本、操作系统命令和Integration Services包,从而实现各种管理和维护任务。利用代理服务可以简化通常需要手动执行的任务,节省时间并提高效率。