

# 使用 SQL Server Agent for Amazon RDS
<a name="Appendix.SQLServer.CommonDBATasks.Agent"></a>

借助 Amazon RDS，您可以在运行 Microsoft SQL Server 企业版、标准版或 Web 版的数据库实例上使用 SQL Server Agent。SQL Server Agent 是一项 Microsoft Windows 服务，可运行计划的管理任务，即所谓的作业。您可以使用 SQL Server Agent 运行 T - SQL 作业，以在 SQL Server 数据库实例中重新生成索引、运行损坏检查和聚合数据。

创建 SQL Server 数据库实例时，主用户以 `SQLAgentUserRole` 角色登记。

SQL Server Agent 可以按照时间表运行作业，对特定事件或需求做出响应。有关详细信息，请参阅 Microsoft 文档中的 [SQL Server Agent](http://msdn.microsoft.com/en-us/library/ms189237)。

**注意**  
避免在数据库实例维护和备份 Windows 期间计划运行作业。由 Amazon 启动的维护和备份过程可能会中断作业或导致作业取消。  
在多可用区部署中，启用作业复制功能时，SQL Server Agent 作业将从主要主机复制到辅助主机。有关更多信息，请参阅 [启用 SQL Server Agent 作业复制](#SQLServerAgent.Replicate)。  
多可用区部署具有 10000 个 SQL Server 代理任务的限制。如果您需要更高的限制，则可联系 Amazon Web Services 支持 请求增加限制。打开 [Amazon Web Services 支持 Center (Amazon Web Services Support 中心)](https://console.amazonaws.cn/support/home#/) 页面，登录（如有必要），然后选择 **Create case (创建案例)**。选择 **Service Limit increase (提高服务限制)**。填写并提交表格。

要查看 SQL Server Management Studio (SSMS) 中单个 SQL Server Agent 作业的历史记录，需打开 Object Explorer，右键单击此作业，然后选择 **View History**。

SQL Server Agent 正在数据库实例中的托管主机上运行，因此不支持某些操作：
+ 不支持使用 ActiveX、Windows Command Shell或 Windows PowerShell 运行复制作业和命令行脚本。
+ 无法手动启动、停止或重新启动 SQL Server Agent。
+ 无法从数据库实例获取通过 SQL Server Agent 发出的电子邮件通知。
+ 不支持 SQL Server Agent 提示和运算符。
+ 不支持使用 SQL Server Agent 创建备份。用 Amazon RDS 备份数据库实例。
+ 目前，RDS for SQL Server 不支持使用 SQL Server Agent 令牌。

## 启用 SQL Server Agent 作业复制
<a name="SQLServerAgent.Replicate"></a>

您可以使用以下存储的过程启用 SQL Server Agent 作业复制：

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob';
```

您可以在 Amazon RDS for SQL Server 支持的所有 SQL Server 版本上运行存储的过程。将复制以下类别中的作业：
+ [未分类（本地）]
+ [未分类（多服务器）]
+ [未分类]
+ 数据收集器
+ 数据库引擎优化顾问
+ 数据库维护
+ 全文

仅复制使用 T-SQL 作业步骤的作业。不复制步骤类型为 SQL Server Integration Services（SSIS）、SQL Server Reporting Services（SSRS）、复制和 PowerShell 等的作业。不复制使用数据库邮件和服务器级别对象的作业。

**重要**  
主要主机是复制的信任源。在开启作业复制之前，请确保您的 SQL Server Agent 任务位于主要主机上。否则，如果在辅助主机上使用较新的任务时开启该功能，则可能会导致删除 SQL Server Agent 任务。

您可以使用以下函数来确认复制是否已开启。

```
SELECT * from msdb.dbo.rds_fn_get_system_database_sync_objects();
```

 如果正在复制 SQL Server Agent 作业，T-SQL 查询将返回以下内容。如果未复制这些作业，将不会返回任何 `object_class` 内容。

![\[正在复制 SQL Server Agent 作业\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/SQLAgentJob.png)


您可以使用以下函数来查找上次同步对象的时间，以 UTC 时间表示。

```
SELECT * from msdb.dbo.rds_fn_server_object_last_sync_time();
```

例如，假设您在 01:00 修改 SQL Server Agent 作业。您预计最近的同步时间将在 01:00 之后，这表示同步已经进行。

同步后，为辅助节点上的 `date_created` 和 `date_modified` 返回的值预计将匹配。

![\[上次同步服务器对象的时间为 01:21:23\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/SQLAgentJob_last_sync_time.png)


如果您也在使用 `tempdb` 复制，则可以通过在 `@object_type` 参数中提供 SQL 代理任务和 `tempdb` 配置来为它们启用复制：

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob,TempDbFile';
```

有关 `tempdb` 复制的更多信息，请参阅[多可用区部署的 TempDB 配置](SQLServer.TempDB.MAZ.md)。