

# Amazon RDS for Microsoft SQL Server
<a name="CHAP_SQLServer"></a>

Amazon RDS 支持多个版本的 Microsoft SQL Server。下表显示了每个主要版本支持的最新次要版本。有关所支持版本和 RDS 引擎版本的完整列表，请参阅 [Amazon RDS 上的 Microsoft SQL Server 版本](SQLServer.Concepts.General.VersionSupport.md)。




| 主要版本 | Service Pack/GDR | 累积更新 | 次要版本 | 知识库文章 | 发行日期 | 
| --- | --- | --- | --- | --- | --- | 
| SQL Server 2022 | 不适用 | CU23 |  16.0.4236.2  | [KB5078297](https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2022/cumulativeupdate23) | 2026 年 1 月 29 日 | 
| SQL Server 2019 | GDR | CU32 GDR |  15.0.4455.2  | [KB5068404](https://support.microsoft.com/en-us/topic/kb5068404-description-of-the-security-update-for-sql-server-2019-cu32-november-11-2025-c203bfbf-036e-46d2-bc10-6c01200dc48a) | 2025 年 11 月 11 日 | 
| SQL Server 2017 | GDR | CU31 GDR |  14.0.3515.1  | [KB5068402](https://support.microsoft.com/en-us/topic/kb5068402-description-of-the-security-update-for-sql-server-2017-cu31-november-11-2025-1be08efe-ad14-4b95-a0de-ecbbf2703114) | 2025 年 11 月 11 日 | 
| SQL Server 2016 | SP3 GDR | 不适用 |  13.0.6475.1  | [KB5068401](https://support.microsoft.com/en-us/topic/kb5068401-description-of-the-security-update-for-sql-server-2016-sp3-gdr-november-11-2025-59a59fc0-f673-45c2-b8de-492b95c0e423) | 2025 年 11 月 11 日 | 

有关适用于 SQL Server 的许可的信息，请参阅[授予 Amazon RDS 上 Microsoft SQL Server 的许可](SQLServer.Concepts.General.Licensing.md)。有关 SQL Server 内部版本的信息，请参阅有关[在何处查找有关最新 SQL Server 内部版本的信息](https://support.microsoft.com/en-us/topic/kb957826-where-to-find-information-about-the-latest-sql-server-builds-43994ba5-9aed-2323-ea7c-d29fe9c4fbe8)的这篇 Microsoft 支持文章。

利用 Amazon RDS，您可以创建数据库实例和数据库快照、时间点还原以及自动或手动备份。可在 VPC 内使用运行 SQL Server 的数据库实例。此外，您还可使用安全套接字层（SSL）连接到运行 SQL Server 的数据库实例，并且可以使用透明数据加密（TDE）加密静态数据。Amazon RDS 当前支持对将 SQL Server 数据库镜像（DBM）或 Always On 可用性组（AG）用作高可用性失效转移解决方案的 SQL Server 执行多可用区部署。

为让用户获得托管式服务体验，Amazon RDS 未提供对数据库实例的 Shell 访问权限，并且限制对需要高级权限的某些系统程序和表的访问权限。Amazon RDS 支持使用任何标准 SQL 客户端应用程序（例如 Microsoft SQL Server Management Studio）访问数据库实例上的数据库。Amazon RDS 不允许通过 Telnet、安全外壳（SSH）或 Windows 远程桌面连接直接从主机访问数据库实例。在创建数据库实例时，主用户将分配给该实例上的所有用户数据库的 *db\$1owner* 角色，并具有用于备份的权限以外的所有数据库级权限。Amazon RDS 会为您管理备份。

在创建您的第一个数据库实例之前，您应完成本指南的设置部分中的步骤。有关更多信息，请参阅“[设置 Amazon RDS 环境](CHAP_SettingUp.md)”。

**Topics**
+ [Amazon RDS 上 Microsoft SQL Server 的常见管理任务](#SQLServer.Concepts.General)
+ [Microsoft SQL Server 数据库实例的限制](#SQLServer.Concepts.General.FeatureSupport.Limits)
+ [Microsoft SQL Server 的数据库实例类支持](SQLServer.Concepts.General.InstanceClasses.md)
+ [RDS for SQL Server 包含许可证的实例的优化 CPU](SQLServer.Concepts.General.OptimizeCPU.md)
+ [Microsoft SQL Server 安全性](SQLServer.Concepts.General.FeatureSupport.UnsupportedRoles.md)
+ [Microsoft SQL Server 数据库实例的合规性计划支持](#SQLServer.Concepts.General.Compliance)
+ [Amazon RDS 上的 Microsoft SQL Server 版本](SQLServer.Concepts.General.VersionSupport.md)
+ [Amazon RDS 上的 Microsoft SQL Server 功能](SQLServer.Concepts.General.FeatureSupport.md)
+ [使用 Microsoft SQL Server 数据库镜像或 Always On 可用性组的多可用区部署](#SQLServer.Concepts.General.Mirroring)
+ [使用透明数据加密来加密静态数据](#SQLServer.Concepts.General.Options)
+ [适用于 Amazon RDS for Microsoft SQL Server 的函数和存储过程](SQLServer.Concepts.General.StoredProcedures.md)
+ [Microsoft SQL Server 数据库实例的本地时区](SQLServer.Concepts.General.TimeZone.md)
+ [授予 Amazon RDS 上 Microsoft SQL Server 的许可](SQLServer.Concepts.General.Licensing.md)
+ [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)
+ [在 RDS for SQL Server 上使用 SQL Server 开发人员版](sqlserver-dev-edition.md)
+ [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)
+ [升级 Microsoft SQL Server 数据库引擎](USER_UpgradeDBInstance.SQLServer.md)
+ [在 RDS for SQL Server 中使用存储](Appendix.SQLServer.CommonDBATasks.DatabaseStorage.md)
+ [使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)
+ [在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本](SQLServer.ReadReplicas.md)
+ [Amazon RDS for Microsoft SQL Server 多可用区部署](USER_SQLServerMultiAZ.md)
+ [Amazon RDS 上的 Microsoft SQL Server 的其他功能](User.SQLServer.AdditionalFeatures.md)
+ [适用于 Microsoft SQL Server 数据库引擎的选项](Appendix.SQLServer.Options.md)
+ [Amazon RDS for Microsoft SQL Server 的常见 DBA 任务](Appendix.SQLServer.CommonDBATasks.md)

## Amazon RDS 上 Microsoft SQL Server 的常见管理任务
<a name="SQLServer.Concepts.General"></a>

以下是您使用 Amazon RDS for SQL Server 数据库实例执行的常见管理任务，以及有关每个任务的相关文档的链接。


****  

| 任务区域 | 说明 | 相关文档 | 
| --- | --- | --- | 
|  **实例类、存储和 PIOPS**  |  如果您出于生产目的而创建数据库实例，则应该了解 Amazon RDS 中的实例类、存储类型和配置的 IOPS 的工作原理。  |  [Microsoft SQL Server 的数据库实例类支持](SQLServer.Concepts.General.InstanceClasses.md) [Amazon RDS 存储类型](CHAP_Storage.md#Concepts.Storage)  | 
|  **多可用区部署**  |  生产数据库实例应使用多可用区部署。多可用区部署为数据库实例提供了更高的可用性、数据持久性和容错能力。SQL Server 的多可用区部署使用 SQL Server 的本机 DBM 或 AG 技术实现。  |  [配置和管理 Amazon RDS 的多可用区部署](Concepts.MultiAZ.md) [使用 Microsoft SQL Server 数据库镜像或 Always On 可用性组的多可用区部署](#SQLServer.Concepts.General.Mirroring)  | 
|  **Amazon Virtual Private Cloud (VPC)**  |  如果您的 AWS 账户具有默认 VPC，则自动在默认 VPC 中创建数据库实例。如果您的账户没有默认 VPC，并且您希望数据库实例位于 VPC 中，则必须在创建数据库实例之前创建 VPC 和子网组。  |  [在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)  | 
|  **安全组**：  |  默认情况下，数据库实例在创建时带有一个防火墙，这个防火墙会阻止对实例进行访问。因此，您必须使用正确的 IP 地址和网络配置创建安全组来访问数据库实例。  |  [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)  | 
|  **参数组**  |  如果数据库实例需要特定数据库参数，则应在创建数据库实例前创建参数组。  |  [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)  | 
|  **选项组**  |  如果数据库实例需要特定数据库选项，则应在创建数据库实例前创建选项组。  |  [适用于 Microsoft SQL Server 数据库引擎的选项](Appendix.SQLServer.Options.md)  | 
|  **连接到您的数据库实例**  |  在创建安全组并将其与数据库实例关联后，您可以使用任何标准 SQL 客户端应用程序 (如 Microsoft SQL Server Management Studio) 连接到数据库实例。  |  [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)  | 
|  **备份和还原**  |  在创建数据库实例时，可以将它配置为使用自动备份。您还可以使用完整备份文件 (.bak 文件) 来手动备份和还原数据库。  |  [备份简介](USER_WorkingWithAutomatedBackups.md) [使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)  | 
|  **监控**  |  可使用 CloudWatch Amazon RDS 指标、事件和增强监测来监控 SQL Server 数据库实例。  |  [在 Amazon RDS 控制台中查看指标](USER_Monitoring.md) [查看 Amazon RDS 事件](USER_ListEvents.md)  | 
|  **日志文件**  |  您可以访问 SQL Server 数据库实例的日志文件。  |  [监控 Amazon RDS 日志文件](USER_LogAccess.md) [Amazon RDS for Microsoft SQL Server 数据库日志文件](USER_LogAccess.Concepts.SQLServer.md)  | 

此外，还有使用 SQL Server 数据库实例的高级管理任务。有关更多信息，请参阅以下文档：
+ [Amazon RDS for Microsoft SQL Server 的常见 DBA 任务](Appendix.SQLServer.CommonDBATasks.md).
+ [将 AWS Managed Active Directory 用于 RDS for SQL Server](USER_SQLServerWinAuth.md)
+ [访问临时数据库](SQLServer.TempDB.md)

## Microsoft SQL Server 数据库实例的限制
<a name="SQLServer.Concepts.General.FeatureSupport.Limits"></a>

在数据库实例上进行 Microsoft SQL Server 的 Amazon RDS 实施时，应注意某些限制：
+ 数据库实例上支持的最大数据库数取决于实例类的类型和可用性模式 — 单可用区、数据库镜像 (DBM) 多可用区或可用性组 (AG) 多可用区。Microsoft SQL Server 系统数据库不计入此限制中。

  下表显示了每种实例类类型和可用性模式支持的最大数据库数。使用此表帮助您确定是否可从一种实例类类型切换到另一种类型，或是否可从一种可用性模式切换到另一种模式。如果您的源数据库实例拥有的数据库数量超出目标实例类类型或可用性模式可以支持的数量，则修改数据库实例会失败。您可以在 **Events (事件)** 窗格中查看请求的状态。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html)

  \$1 表示不同实例类的类型。

  例如，我们假定您的数据库实例在使用单可用区的 db.\$1.16xlarge 上运行，且拥有 76 个数据库。您修改数据库实例，以便升级为使用 Always On 可用性组多可用区。因为您的数据库实例包含的数据库数量超出您的目标配置支持的数据库数量，所以此次升级失败。如果您将实例类类型升级为 db.\$1.24xlarge，则修改会成功。

  如果升级失败，则您会看到类似于下面所示的事件和消息：
  +  无法修改数据库实例类。该实例有 76 个数据库，但在转换之后，它仅支持 75 个数据库。
  +  无法将数据库实例转换为多可用区：该实例有 76 个数据库，但在转换之后，它仅支持 75 个数据库。

   如果时间点还原或快照还原失败，则您会看到类似于下面所示的事件和消息：
  +  数据库实例进入不兼容的还原。该实例有 76 个数据库，但在转换之后，它仅支持 75 个数据库。
+ 以下端口预留供 Amazon RDS 使用，您不能在创建数据库实例时使用它们：`1234, 1434, 3260, 3343, 3389, 47001,` 和 `49152-49156`。
+ 不允许来自 169.254.0.0/16 范围内的 IP 地址的客户端连接。这是自动私有 IP 寻址范围 (APIPA)，它用于本地链路寻址。
+ 如果数据库实例的处理器数量超过软件限制（24 个内核、4 个插槽和 128GB RAM），则 SQL Server Standard 版将仅使用部分可用处理器。例如 db.m5.24xlarge 和 db.r5.24xlarge 实例类。

  有关详细信息，请参阅 Microsoft 文档中 [SQL Server 2019 (15.x) 的版本和支持的功能](https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-version-15)下的扩展限制表。
+ Amazon RDS for SQL Server 不支持将数据导入 msdb 数据库。
+ 您无法重命名 SQL Server 多可用区部署中的数据库实例中的数据库。
+ 在 RDS for SQL Server 上设置以下数据库参数时，请确保遵循以下准则：
  + `max server memory (mb)` >= 256 MB
  + `max worker threads` >=（逻辑 CPU 的数量 \$1 7）

  有关设置数据库参数的更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。
+ SQL Server 数据库实例的最大存储大小如下所示：
  + 通用型 (SSD) 存储 – 16 TiB（针对所有版本） 
  + 预调配 IOPS 存储 – 64 TiB（针对所有版本） 
  + 磁性存储 – 1 TiB（针对所有版本） 

  对于需要大量存储的情况，您可跨多个数据库实例使用分片绕过该限制。此方法需要连接到已分片系统的应用程序中的依赖数据的路由逻辑。可以使用现有分片框架，也可以编写自定义代码来启用分片。如果使用现有框架，则该框架无法在与数据库实例相同的服务器上安装任何组件。
+ SQL Server 数据库实例的最小存储大小如下所示：
  + 通用 (SSD) 存储 – 20 GiB，用于 Enterprise、Standard、Web 和 Express 版本
  + 预置 IOPS 存储 – 20 GiB，用于 Enterprise、Standard、Web 和 Express 版本
  + 磁性存储 – 20 GiB，用于 Enterprise、Standard、Web 和 Express 版本
+ Amazon RDS 不支持在与 RDS 数据库实例相同的服务器上运行这些服务：
  + 数据质量服务
  + 主数据服务

  要使用这些功能，建议您在 Amazon EC2 实例上安装 SQL Server，或者使用本地 SQL Server 实例。在这些情况下，EC2 或 SQL Server 实例充当 Amazon RDS 上的 SQL Server 数据库实例的主数据服务服务器。根据 Microsoft 许可策略，您可以在带有 Amazon EBS 存储的 Amazon EC2 实例上安装 SQL Server。
+ 由于 Microsoft SQL Server 中存在的限制，还原到成功运行 `DROP DATABASE` 前的时间点可能不会反映出数据库在该时间点的状态。例如，通常会将已删掉的数据库还原到距发出 `DROP DATABASE` 命令前还有长达 5 分钟时的状态。使用此类型的还原，意味着无法还原您的已删除数据库上在那几分钟进行的事务。要解决该问题，您可以在完成还原操作后重新发出 `DROP DATABASE` 的命令。删除数据库也会删除该数据库的事务日志。
+ 对于 SQL Server，在创建数据库实例之后，需创建数据库。数据库名称遵循常用的 SQL Server 命名规则，但有以下区别：
  + 数据库名称不能以 `rdsadmin` 开头。
  + 它们不能以空格或制表符开头或结尾。
  + 它们不能包含任何创建新行的字符。
  + 它们不能包含单引号 (`'`)。
+ SQL Server Web Edition 仅允许您在为 SQL Server 数据库实例创建新的 RDS 时使用**开发/测试**模板。
+ SQL Server Web 版专为 Web 托管商和 Web VAP 而设计，用于托管公用和可通过互联网访问的网页、网站、Web 应用程序和 Web 服务。有关更多信息，请参阅 [授予 Amazon RDS 上 Microsoft SQL Server 的许可](SQLServer.Concepts.General.Licensing.md)。

# Microsoft SQL Server 的数据库实例类支持
<a name="SQLServer.Concepts.General.InstanceClasses"></a>

数据库实例的计算和内存容量由数据库实例类决定。您需要的数据库实例类取决于您的处理能力和内存要求。有关更多信息，请参阅“[数据库实例类](Concepts.DBInstanceClass.md)”。

以下是 Microsoft SQL Server 支持的数据库实例类列表，此处为方便起见而提供。如需最新的列表，请参阅 RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

并非所有受支持的 SQL Server 次要版本中均提供所有数据库实例类。例如，较旧的次要版本中不提供一些较新的数据库实例类（例如 db.r6i）。您可以使用 [describe-orderable-db-instance-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/describe-orderable-db-instance-options.html) AWS CLI 命令来找出哪些数据库实例类可用于您的 SQL Server 版本。


****  

| SQL Server 版本 | 2022 支持范围 | 2019 支持范围 | 2017 和 2016 支持范围 | 
| --- | --- | --- | --- | 
|  企业版  | `db.t3.xlarge`–`db.t3.2xlarge``db.r5.xlarge`–`db.r5.24xlarge``db.r5b.xlarge`–`db.r5b.24xlarge``db.r5d.xlarge`–`db.r5d.24xlarge``db.r6i.xlarge`–`db.r6i.32xlarge`db.r7i.xlarge–db.r7i.48xlarge`db.m5.xlarge`–`db.m5.24xlarge``db.m5d.xlarge`–`db.m5d.24xlarge``db.m6i.xlarge`–`db.m6i.32xlarge``db.m7i.xlarge`–`db.m7i.48xlarge``db.x2iedn.xlarge`–`db.x2iedn.32xlarge``db.z1d.xlarge`–`db.z1d.12xlarge` |  `db.t3.xlarge`–`db.t3.2xlarge` `db.r5.xlarge`–`db.r5.24xlarge` `db.r5b.xlarge`–`db.r5b.24xlarge` `db.r5d.xlarge`–`db.r5d.24xlarge` `db.r6i.xlarge`–`db.r6i.32xlarge` `db.r7i.xlarge`–`db.r7i.48xlarge` `db.m5.xlarge`–`db.m5.24xlarge` `db.m5d.xlarge`–`db.m5d.24xlarge` `db.m6i.xlarge`–`db.m6i.32xlarge` `db.m7i.xlarge`–`db.m7i.48xlarge` `db.x2iedn.xlarge`–`db.x2iedn.32xlarge` `db.z1d.xlarge`–`db.z1d.12xlarge`  |  `db.t3.xlarge`–`db.t3.2xlarge` `db.r5.xlarge`–`db.r5.24xlarge` `db.r5b.xlarge`–`db.r5b.24xlarge` `db.r5d.xlarge`–`db.r5d.24xlarge` `db.r6i.xlarge`–`db.r6i.32xlarge` `db.r7i.xlarge`–`db.r7i.48xlarge` `db.m5.xlarge`–`db.m5.24xlarge` `db.m5d.xlarge`–`db.m5d.24xlarge` `db.m6i.xlarge`–`db.m6i.32xlarge` `db.m7i.xlarge`–`db.m7i.48xlarge` `db.x2iedn.xlarge`–`db.x2iedn.32xlarge` `db.z1d.xlarge`–`db.z1d.12xlarge`  | 
|  标准版  | `db.t3.xlarge`–`db.t3.2xlarge``db.r5.large`–`db.r5.24xlarge``db.r5b.large`–`db.r5b.8xlarge``db.r5d.large`–`db.r5d.24xlarge``db.r6i.large`–`db.r6i.8xlarge`db.r7i.large–db.r7i.12xlarge`db.m5.large`–`db.m5.24xlarge``db.m5d.large`–`db.m5d.24xlarge``db.m6i.large`–`db.m6i.8xlarge``db.m7i.large`–`db.m7i.12xlarge``db.x2iedn.xlarge`–`db.x2iedn.8xlarge``db.z1d.large`–`db.z1d.12xlarge` |  `db.t3.xlarge`–`db.t3.2xlarge` `db.r5.large`–`db.r5.24xlarge` `db.r5b.large`–`db.r5b.24xlarge` `db.r5d.large`–`db.r5d.24xlarge` `db.r6i.large`–`db.r6i.8xlarge` `db.r7i.large`–`db.r7i.12xlarge` `db.m5.large`–`db.m5.24xlarge` `db.m5d.large`–`db.m5d.24xlarge` `db.m6i.large`–`db.m6i.8xlarge` `db.m7i.large`–`db.m7i.12xlarge` `db.x2iedn.xlarge`–`db.x2iedn.32xlarge` `db.z1d.large`–`db.z1d.12xlarge`  | `db.t3.xlarge`–`db.t3.2xlarge``db.r5.large`–`db.r5.24xlarge``db.r5b.large`–`db.r5b.24xlarge``db.r5d.large`–`db.r5d.24xlarge``db.r6i.large`–`db.r6i.8xlarge``db.r7i.large`–`db.r7i.12xlarge``db.m5.large`–`db.m5.24xlarge``db.m5d.large`–`db.m5d.24xlarge``db.m6i.large`–`db.m6i.8xlarge`db.m7i.large–db.m7i.12xlarge`db.x2iedn.xlarge`–`db.x2iedn.32xlarge``db.z1d.large`–`db.z1d.12xlarge` | 
|  Web 版  | `db.t3.small`–`db.t3.xlarge``db.r5.large`–`db.r5.4xlarge``db.r5b.large`–`db.r5b.4xlarge``db.r5d.large`–`db.r5d.4xlarge`db.r6i.large–db.r6i.4xlarge`db.r7i.large`–`db.r7i.4xlarge``db.m5.large`–`db.m5.4xlarge``db.m5d.large`–`db.m5d.4xlarge``db.m6i.large`–`db.m6i.4xlarge``db.m7i.large`–`db.m7i.4xlarge``db.z1d.large`–`db.z1d.13xlarge` | `db.t3.small`–`db.t3.2xlarge``db.r5.large`–`db.r5.4xlarge``db.r5b.large`–`db.r5b.4xlarge``db.r5d.large`–`db.r5d.4xlarge``db.r6i.large`–`db.r6i.4xlarge`db.r7i.large–db.r7i.4xlarge`db.m5.large`–`db.m5.4xlarge``db.m5d.large`–`db.m5d.4xlarge``db.m6i.large`–`db.m6i.4xlarge`db.m7i.large–db.m7i.4xlarge`db.z1d.large`–`db.z1d.3xlarge` | `db.t3.small`–`db.t3.2xlarge``db.r5.large`–`db.r5.4xlarge``db.r5b.large`–`db.r5b.4xlarge``db.r5d.large`–`db.r5d.4xlarge``db.r6i.large`–`db.r6i.4xlarge`db.r7i.large–db.r7i.4xlarge`db.m5.large`–`db.m5.4xlarge``db.m5d.large`–`db.m5d.4xlarge``db.m6i.large`–`db.m6i.4xlarge`db.m7i.large–db.m7i.4xlarge`db.z1d.large`–`db.z1d.3xlarge` | 
|  精简版  |  `db.t3.micro`–`db.t3.xlarge`  |  `db.t3.micro`–`db.t3.xlarge`  |  `db.t3.micro`–`db.t3.xlarge`  | 
| 开发人员版本 | `db.m6i.xlarge`–`db.m6i.32xlarge``db.r6i.xlarge`–`db.r6i.32xlarge` |  |  | 

**注意**  
 从第 7 代实例类开始，对于大小为 2xlarge 及更大的实例，在 RDS SQL Server 上禁用超线程。这会导致可用的 vCPU 总数为[相应的 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cpu-options-supported-instances-values.html)所支持的 vCPU 总数的一半。例如，EC2 实例类型 `m7i.2xlarge` 默认情况下支持 4 个内核和每个内核 2 个线程，因此总共为 8 个 vCPU。相比之下，禁用超线程的 RDS for SQL Server `db.m7i.2xlarge` 实例会导致 4 个内核和每个内核 1 个线程，总共为 4 个 vCPU。
从第 7 代实例开始，您的账单将提供 RDS 数据库实例和第三方许可费用的详细明细。有关更多详细信息，请参阅 [RDS SQL Server pricing](https://aws.amazon.com/rds/sqlserver/pricing/)。

# RDS for SQL Server 包含许可证的实例的优化 CPU
<a name="SQLServer.Concepts.General.OptimizeCPU"></a>

借助 RDS for SQL Server，您可以通过指定处理器功能来使用“优化 CPU”，以配置数据库实例上的 vCPU 计数，同时保持相同的内存和 IOPS。您可以针对特定的数据库工作负载要求实现所需的内存与 CPU 比，并降低基于 vCPU 计数的 Microsoft Windows 操作系统和 SQL Server 的许可成本。

要指定处理器功能，请使用以下参数：

```
--processor-features "Name=coreCount,Value=value" \ 
	"Name=threadsPerCore,Value=value"
```
+ **coreCount**：指定数据库实例的 CPU 核心数，以优化数据库实例的许可成本。要查找所选实例类型支持的核心计数值，请参阅[支持“优化 CPU”的数据库实例类数据库实例类支持](SQLServer.Concepts.General.OptimizeCPU.Support.md)。
+ **threadsPerCore**：指定每核心线程数以定义每个 CPU 核心的线程数。要查找所选实例类型支持的每核心线程数的值，请参阅[支持“优化 CPU”的数据库实例类数据库实例类支持](SQLServer.Concepts.General.OptimizeCPU.Support.md)。

使用“优化 CPU”设置创建 RDS for SQL Server 实例的命令示例：

```
aws rds create-db-instance \
    --engine sqlserver-ee \
    --engine-version 16.00 \
    --license-model license-included \
    --allocated-storage 300 \
    --master-username myuser \
    --master-user-password xxxxx \
    --no-multi-az \
    --vpc-security-group-ids myvpcsecuritygroup \
    --db-subnet-group-name mydbsubnetgroup \
    --db-instance-identifier my-rds-instance \
    --db-instance-class db.m7i.8xlarge \
    --processor-features "Name=coreCount,Value=8" "Name=threadsPerCore,Value=1"
```

在本例中，您创建一个 `db.m7i.8xlarge` 实例，默认情况下 coreCount 为 16。通过使用“优化 CPU”，您可以选择 coreCount 为 8，从而使有效的 vCPU 计数为 8。

如果您创建实例时不带 `--processor-features` 参数，则默认情况下，核心计数设置为 16，每核心线程数设置为 1，因而默认 vCPU 计数为 16。

指定处理器功能时需要记住的一些注意事项：
+ **创建**：从支持的值中为 `processor-features` 参数指定 `coreCount` 和 `threadsPerCore`。请参阅[支持“优化 CPU”的数据库实例类数据库实例类支持](SQLServer.Concepts.General.OptimizeCPU.Support.md)。
+ **修改**：从一个配置了“优化 CPU”设置的实例类修改为另一个支持“优化 CPU”设置的实例类时，您必须使用 `--use-default-processor-features` 参数指定默认处理器设置，或者在修改请求期间显式定义选项。
**注意**  
更改 vCPU 计数可能会影响与数据库实例关联的许可费用成本。
+ **快照还原**：将快照还原到与源相同的实例类型时，还原的数据库实例将继承快照中的“优化 CPU”设置。如果还原到不同的实例类型，则需要为目标实例定义“优化 CPU”设置或指定 `--use-default-processor-features` 参数。
+ **时间点恢复**：时间点恢复（PITR）涉及根据指定的 PITR 时间还原特定的快照，然后将所有事务日志备份应用于该快照，从而将实例恢复到指定的时间点。对于 PITR，除非在 PITR 请求期间指定了自定义值，否则“优化 CPU”设置 `coreCount` 和 `threadsPerCore` 源自源快照（而不是时间点）。如果正在使用的源快照启用了“优化 CPU”设置，并且您为 PITR 使用不同的实例类型，则必须为目标实例定义“优化 CPU”设置或指定 `—-use-default-processor-features` 参数。

## 限制
<a name="SQLServer.Concepts.General.OptimizeCPU.Limitations"></a>

使用“优化 CPU”时，以下限制适用：
+ 只有企业版、标准版和 Web 版支持“优化 CPU”。
+ “优化 CPU”适用于部分实例。请参阅[支持“优化 CPU”的数据库实例类数据库实例类支持](SQLServer.Concepts.General.OptimizeCPU.Support.md)。
+ 对于大小等于 `2xlarge` 及更大的实例，支持自定义 CPU 核心数量。对于这些实例类型，“优化 CPU”支持的最少 vCPCU 数量为 4。
+ “优化 CPU”仅支持每核心 1 个线程，因为从第 7 代起，对支持“优化 CPU”的实例禁用超线程。

# 支持“优化 CPU”的数据库实例类
<a name="SQLServer.Concepts.General.OptimizeCPU.Support"></a>

RDS for SQL Server 从第 7 代实例类类型开始支持“优化 CPU”。此外，从第 7 代实例类类型开始，无论是否启用了“优化 CPU”功能，RDS 都会提供 RDS 数据库实例和第三方许可费用的详细账单明细。

RDS for SQL Server 针对特定实例大小支持“优化 CPU”，支持的最小实例大小为 `2xlarge`。支持的最低配置为 4 个 vCPU。下表概述了支持“优化 CPU”的数据库实例类，包括 CPU 核心数、每核心 CPU 线程数和 vCPU 数量的默认值和有效值：


**通用实例**  

| 实例类型 | 默认 vCPU | 默认 CPU 核心数 | 有效的 CPU 核心 | 每个核心的有效线程 | 
| --- | --- | --- | --- | --- | 
| `m7i.large` | 2 | 1 | 1 | 2 | 
| `m7i.xlarge` | 4 | 2 | 2 | 2 | 
| `m7i.2xlarge` | 4 | 4 | 1、2、3、4 | 1 | 
| `m7i.4xlarge` | 8 | 8 | 1、2、3、4、5、6、7、8 | 1 | 
| `m7i.8xlarge` | 16 | 16 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16 | 1 | 
| `m7i.12xlarge` | 24 | 24 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24 | 1 | 
| `m7i.16xlarge` | 32 | 32 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31、32 | 1 | 


**内存优化型实例**  

| 实例类型 | 默认 vCPU | 默认 CPU 核心数 | 有效的 CPU 核心 | 每个核心的有效线程 | 
| --- | --- | --- | --- | --- | 
| `r7i.large` | 2 | 1 | 1 | 2 | 
| `r7i.xlarge` | 4 | 2 | 2 | 2 | 
| `r7i.2xlarge` | 4 | 4 | 1、2、3、4 | 1 | 
| `r7i.4xlarge` | 8 | 8 | 1、2、3、4、5、6、7、8 | 1 | 
| `r7i.8xlarge` | 16 | 16 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16 | 1 | 
| `r7i.12xlarge` | 24 | 24 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24 | 1 | 
| `r7i.16xlarge` | 32 | 32 | 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31、32 | 1 | 

# 为数据库实例类设置 CPU 核心数和每 CPU 核心线程数
<a name="SQLServer.Concepts.General.OptimizeCPU.Enabling"></a>

可在执行以下操作时为数据库实例类配置 CPU 核心数和每核心线程数：
+ [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)
+ [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)
+ [还原到数据库实例](USER_RestoreFromSnapshot.md)
+ [将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)

**注意**  
在修改数据库实例以配置 CPU 核心数或每核心线程数时，会出现短暂的中断，这与您修改实例类时的情况类似。

使用 AWS 管理控制台、AWS CLI 或 RDS API 设置 CPU 核心数。

## 控制台
<a name="SQLServer.Concepts.General.OptimizeCPU.Enabling.CON"></a>

**设置核心数**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 选择**创建数据库**。

1. 设置**实例配置**选项时：

   1. 选择**优化 CPU** 选项。

   1. 通过选择核心数来设置 **vCPU** 选项。  
![\[设置 OCPU 设置时的数据库创建页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/OCPU-screenshot.png)

1. 完成其它选择后，选择**创建数据库**。

## AWS CLI
<a name="SQLServer.Concepts.General.OptimizeCPU.Enabling.CLI"></a>

**设置核心数**

1. 要使用 AWS CLI 配置“优化 CPU”，请在命令中包含 `--processor-features` 选项。通过将 `coreCount` 和 `threadsPerCore` 设置为 `1`，指定 CPU 核心的数量。

1. 使用以下语法：

   ```
   aws rds create-db-instance \
       --engine sqlserver-ee \
       --engine-version 16.00 \
       --license-model license-included \
       --allocated-storage 300 \
       --master-username myuser \
       --master-user-password xxxxx \
       --no-multi-az \
       --vpc-security-group-ids myvpcsecuritygroup \
       --db-subnet-group-name mydbsubnetgroup \
       --db-instance-identifier my-rds-instance \
       --db-instance-class db.m7i.4xlarge \
       --processor-features "Name=coreCount,Value=6" "Name=threadsPerCore,Value=1"
   ```

**Example ：查看数据库实例类的有效处理器值**  
使用 `describe-orderable-db-instance-options` 命令可显示默认 vCPU 数、核心数和每核心线程数。例如，以下命令的输出显示用于 db.r7i.2xlarge 实例类的处理器选项。  

```
aws rds describe-orderable-db-instance-options --engine sqlserver-ee \
--db-instance-class db.r7i.2xlarge

Sample output: 
-------------------------------------------------------------
|            DescribeOrderableDBInstanceOptions             |
+-----------------------------------------------------------+
||               OrderableDBInstanceOptions                ||
|+------------------------------------+--------------------+|
||  DBInstanceClass                   |  db.r7i.2xlarge    ||
||  Engine                            |  sqlserver-ee      ||
||  EngineVersion                     |  13.00.6300.2.v1   ||
||  LicenseModel                      |  license-included  ||
||  MaxIopsPerDbInstance              |                    ||
||  MaxIopsPerGib                     |                    ||
||  MaxStorageSize                    |  64000             ||
||  MinIopsPerDbInstance              |                    ||
||  MinIopsPerGib                     |                    ||
||  MinStorageSize                    |  20                ||
||  MultiAZCapable                    |  True              ||
||  OutpostCapable                    |  False             ||
||  ReadReplicaCapable                |  True              ||
||  StorageType                       |  gp2               ||
||  SupportsClusters                  |  False             ||
||  SupportsDedicatedLogVolume        |  False             ||
||  SupportsEnhancedMonitoring        |  True              ||
||  SupportsGlobalDatabases           |  False             ||
||  SupportsIAMDatabaseAuthentication |  False             ||
||  SupportsIops                      |  False             ||
||  SupportsKerberosAuthentication    |  True              ||
||  SupportsPerformanceInsights       |  True              ||
||  SupportsStorageAutoscaling        |  True              ||
||  SupportsStorageEncryption         |  True              ||
||  SupportsStorageThroughput         |  False             ||
||  Vpc                               |  True              ||
|+------------------------------------+--------------------+|
|||                   AvailabilityZones                   |||
||+-------------------------------------------------------+||
|||                         Name                          |||
||+-------------------------------------------------------+||
|||  us-west-2a                                           |||
|||  us-west-2b                                           |||
|||  us-west-2c                                           |||
||+-------------------------------------------------------+||
|||              AvailableProcessorFeatures               |||
||+-----------------+-----------------+-------------------+||
|||  AllowedValues  |  DefaultValue   |       Name        |||
||+-----------------+-----------------+-------------------+||
|||  1,2,3,4        |  4              |  coreCount        |||
|||  1              |  1              |  threadsPerCore   |||
||+-----------------+-----------------+-------------------+||
```
此外，可以运行以下命令来获取数据库实例类处理器信息：  
+ `describe-db-instances`：显示指定数据库实例的处理器信息
+ `describe-db-snapshots`：显示指定数据库快照的处理器信息
+ `describe-valid-db-instance-modifications`：显示对指定数据库实例的处理器的有效修改
在上述命令的输出中，如果未配置“优化 CPU”，则处理器功能的值为 `null`。

**Example ：为数据库实例设置 CPU 核心数**  
以下示例通过将 CPU 核心数设置为 4 并将 threadsPerCore 设置为 1 来修改 *mydbinstance* 。使用 `--apply-immediately` 立即应用更改。如果要在下一个计划的维护时段内应用更改，请省略 `--apply-immediately option`。  

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --db-instance-class db.r7i.8xlarge \
    --processor-features "Name=coreCount,Value=4" "Name=threadsPerCore,Value=1" \
    --apply-immediately
```

**Example ：返回到数据库实例的默认处理器设置**  
以下示例通过将 *mydbinstance* 返回到其默认处理器值来进行修改。  

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --db-instance-class db.r7i.8xlarge \
    --use-default-processor-features \
    --apply-immediately
```

# Microsoft SQL Server 安全性
<a name="SQLServer.Concepts.General.FeatureSupport.UnsupportedRoles"></a>

Microsoft SQL Server 数据库引擎使用基于角色的安全性。您在创建数据库实例时指定的主用户名是 SQL Server 身份验证登录名，该登录名是 `processadmin`、`public` 和 `setupadmin` 固定服务器角色的成员。

任何创建数据库的用户都将被分配该数据库的 db\$1owner 角色，并将拥有除用于备份外的所有数据库级别的权限。Amazon RDS 会为您管理备份。

以下服务器级别的角色在 Amazon RDS for SQL Server 中不可用：
+ bulkadmin
+ dbcreator
+ diskadmin
+ securityadmin
+ serveradmin
+ sysadmin

以下服务器级别的权限在 RDS for SQL Server 数据库实例上不可用：
+ 更改任何数据库
+ ALTER ANY EVENT NOTIFICATION
+ ALTER RESOURCES
+ ALTER SETTINGS（您可以使用数据库参数组 API 操作来修改参数；有关更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)） 
+ AUTHENTICATE SERVER
+ CONTROL\$1SERVER
+ CREATE DDL EVENT NOTIFICATION
+ CREATE ENDPOINT
+ CREATE SERVER ROLE
+ CREATE TRACE EVENT NOTIFICATION
+ 删除任何数据库
+ EXTERNAL ACCESS ASSEMBLY
+ SHUTDOWN（您可转而使用 RDS 重启选项）
+ UNSAFE ASSEMBLY
+ ALTER ANY AVAILABILITY GROUP
+ CREATE ANY AVAILABILITY GROUP

## Microsoft SQL Server 数据库实例的 SSL 支持
<a name="SQLServer.Concepts.General.SSL"></a>

可使用 SSL 对应用程序和运行 Microsoft SQL Server 的 Amazon RDS 数据库实例之间的连接进行加密。您还可强制至数据库实例的所有连接使用 SSL。如果强制所有连接使用 SSL，则对客户端是透明的，客户端不需要为使用 SSL 而执行任何操作。

在所有 AWS 区域以及所有支持的 SQL Server 版本中支持 SSL。有关更多信息，请参阅 [将 SSL 与 Microsoft SQL Server 数据库实例结合使用](SQLServer.Concepts.General.SSL.Using.md)。

# 将 SSL 与 Microsoft SQL Server 数据库实例结合使用
<a name="SQLServer.Concepts.General.SSL.Using"></a>

可使用安全套接字层 (SSL) 对客户端应用程序和运行 Microsoft SQL Server 的 Amazon RDS 数据库实例之间的连接进行加密。对于所有支持的 SQL Server 版本，所有 AWS 区域提供了 SSL 支持。

在您创建 SQL Server 数据库实例时，Amazon RDS 会为其创建 SSL 证书。SSL 证书会将数据库实例终端节点作为 SSL 证书的公用名 (CN) 包含在内以防止欺诈攻击。

使用 SSL 连接到 SQL Server 数据库实例有两种方法：
+ 强制所有连接使用 SSL — 这种方法对客户端是透明的，客户端不需要为使用 SSL 而执行任何操作。
**注意**  
当您将 `rds.force_ssl` 设置为 `1` 并使用 SSMS 版本 19.3、20.0 和 20.2 时，请检查以下各项：  
在 SSMS 中启用**信任服务器证书**。
将证书导入您的系统。
+ 加密特定连接 — 这种方法在特定客户端计算机上设置 SSL 连接，您必须在客户端上执行加密连接的操作。

有关 SQL Server 的传输层安全性 (TLS) 支持的信息，请参阅 [Microsoft SQL Server 的 TLS 1.2 支持](https://support.microsoft.com/en-ca/help/3135244/tls-1-2-support-for-microsoft-sql-server)。

## 强制与数据库实例的连接使用 SSL
<a name="SQLServer.Concepts.General.SSL.Forcing"></a>

您还可强制与数据库实例的所有连接使用 SSL。如果强制所有连接使用 SSL，则对客户端是透明的，客户端不需要为使用 SSL 而执行任何操作。

如果要强制使用 SSL，请使用 `rds.force_ssl` 参数。默认情况下，`rds.force_ssl` 参数设置为 `0 (off)`。将 `rds.force_ssl` 参数设置为 `1 (on)` 可强制连接使用 SSL。由于 `rds.force_ssl` 参数是静态的，因此，在更改值后，您必须重启数据库实例才能使更改生效。

**强制与数据库实例的所有连接都使用 SSL**

1. 确定附加到数据库实例的参数组：

   1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

   1. 在 Amazon RDS 控制台的右上角，选择数据库实例的AWS区域。

   1. 在导航窗格中，选择**数据库**，然后选择数据库实例的名称以显示其详细信息。

   1. 选择 **Configuration** 选项卡。在此部分中查找**参数组**。

1. 如果需要，可创建新的参数组。如果数据库实例使用默认参数组，则必须创建新的参数组。如果数据库实例使用非默认参数组，则可以选择编辑现有参数组或创建新的参数组。如果您编辑现有参数组，则更改将影响使用该参数组的所有数据库实例。

   要创建新的参数组，请按照[在 Amazon RDS 中创建数据库参数组](USER_WorkingWithParamGroups.Creating.md)中的说明执行操作。

1. 编辑新的或现有的参数组以将 `rds.force_ssl` 参数设置为 `true`。要编辑参数组，请按照[在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)中的说明执行操作。

1. 如果您创建了一个新的参数组，可修改数据库实例以附加该新参数组。修改数据库实例的 **DB Parameter Group** 设置。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. 重启数据库实例。有关更多信息，请参阅“[重启数据库实例](USER_RebootInstance.md)”。

## 加密特定连接
<a name="SQLServer.Concepts.General.SSL.Client"></a>

您可以强制与数据库实例的所有连接使用 SSL，也可以仅加密来自特定客户端计算机的连接。要在特定客户端中使用 SSL，您必须获取客户端计算机的证书、在客户端计算机中导入证书，然后加密来自该客户端计算机的连接。

**注意**  
在 2014 年 8 月 5 日之后创建的所有 SQL Server 实例都在 SSL 证书的公用名 (CN) 字段中使用数据库实例终端节点。在 2014 年 8 月 5 日之前，SSL 证书验证不可用于基于 VPC 的 SQL Server 实例。如果您具有在 2014 年 8 月 5 日之前创建的基于 VPC 的 SQL Server 数据库实例，而且要使用 SSL 证书验证并确保实例终端节点作为该数据库实例 SSL 证书的 CN 包括在内，请重命名该实例。当您重命名数据库实例时，新证书会进行部署，并且实例会重启以启用新证书。

### 获取客户端计算机的证书
<a name="SQLServer.Concepts.General.SSL.Certificates"></a>

要对从客户端计算机到运行 Microsoft SQL Server 的 Amazon RDS 数据库实例的连接进行加密，您需要客户端计算机上的证书。

要获取该证书，请将该证书下载到客户端计算机。您可以下载适用于所有区域的根证书。您也可以下载同时包含旧的和新的根证书的证书捆绑包。此外，您还可以下载特定于区域的中间证书。有关下载证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

下载适当的证书后，使用以下部分中的过程将该证书导入 Microsoft Windows 操作系统。

### 将证书导入客户端计算机
<a name="SQLServer.Concepts.General.SSL.Importing"></a>

您可以使用以下过程将证书导入客户端计算机上的 Microsoft Windows 操作系统。

**将证书导入 Windows 操作系统：**

1. 在 **Start (开始)** 菜单上的搜索框中，键入 **Run**，然后按 **Enter**。

1. 在 **Open (打开)** 框中，键入 **MMC**，然后选择 **OK (确定)**。

1. 在 MMC 控制台中的 **File** 菜单上，选择 **Add/Remove Snap-in**。

1. 在 **Add or Remove Snap-ins (添加或删除管理单元)** 对话框中，对于 **Available snap-ins (可用管理单元)**，选择 **Certificates**，然后选择 **Add (添加)**。

1. 在 **Certificates snap-in** 对话框中，选择 **Computer account**，然后选择 **Next**。

1. 在 **Select computer** 对话框中，选择 **Finish**。

1. 在 **Add or Remove Snap-ins** 对话框中，选择 **OK**。

1. 在 MMC 控制台中，展开 **Certificates**，打开 **Trusted Root Certification Authorities** 的上下文 (右键单击) 菜单，选择 **All Tasks**，然后选择 **Import**。

1. 在证书导入向导的第一页上，选择 **Next**。

1. 在证书导入向导的第二页上，选择 **Browse**。在浏览窗口中，将文件类型更改为 **All files (\$1.\$1) (所有文件 (\$1.\$1))**，因为 .pem 不是标准证书扩展名。找到您之前下载的 .pem 文件。
**注意**  
从 SQL Server Management Studio（SSMS）等 Windows 客户端进行连接时，我们建议使用 PKCS \$17 (.p7b) 证书格式，而不是 global-bundle.pem 文件。.p7b 格式可确保将完整的证书链 [包括根证书颁发机构和中间证书颁发机构（CA）] 正确导入到 Windows 证书存储中。这样可以防止在启用强制加密时可能发生的连接故障，因为 .pem 导入可能无法正确安装完整的链。

1. 选择 **Open** 以选择证书文件，然后选择 **Next**。

1. 在证书导入向导的第三页上，选择 **Next**。

1. 在证书导入向导的第四页上，选择 **Finish**。这将显示一个指示导入已成功的对话框。

1. 在 MMC 控制台中，展开 **Certificates**，再展开 **Trusted Root Certification Authorities**，然后选择 **Certificates**。找到证书以确认其存在，如此处所示。  
![\[在 MMC 控制台的导航窗格中，从“控制台根节点”、“证书（本地证书）”和“受信任的根证书颁发机构”向下钻取，选择“证书”文件夹。在主页中，选择所需的 CA 证书。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/rds_sql_ssl_cert.png)

### 对与运行 Microsoft SQL Server 的 Amazon RDS 数据库实例的连接进行加密
<a name="SQLServer.Concepts.General.SSL.Encrypting"></a>

将证书导入客户端计算机后，您可以对从客户端计算机到运行 Microsoft SQL Server 的 Amazon RDS 数据库实例的连接进行加密。

对于 SQL Server Management Studio，使用以下过程。有关 SQL Server Management Studio 的更多信息，请参阅[使用 SQL Server Management Studio](http://msdn.microsoft.com/en-us/library/ms174173.aspx)。

**对来自 SQL Server Management Studio 的连接进行加密**

1. 启动 SQL Server Management Studio。

1. 为 **Connect to server ** 键入服务器信息、登录用户名和密码。

1. 选择 **Options**。

1. 选择 **Encrypt connection**。

1. 选择 **Connect**。

1. 通过运行以下查询确认连接已加密。验证查询为 `true` 返回 `encrypt_option`。

   ```
   select ENCRYPT_OPTION from SYS.DM_EXEC_CONNECTIONS where SESSION_ID = @@SPID
   ```

对于任何其他 SQL 客户端，请使用以下过程。

**对来自其他 SQL 客户端的连接进行加密**

1. 向连接字符串追加 `encrypt=true`。在 GUI 工具的连接页上，此字符串可能以选项或属性形式提供。
**注意**  
要为使用 JDBC 进行连接的客户端启用 SSL 加密，您可能需要将 Amazon RDS SQL 证书添加到 Java CA 证书 (cacerts) 存储。可通过使用 [keytool](http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html) 实用程序执行该操作。

1. 通过运行以下查询确认连接已加密。验证查询为 `true` 返回 `encrypt_option`。

   ```
   select ENCRYPT_OPTION from SYS.DM_EXEC_CONNECTIONS where SESSION_ID = @@SPID
   ```

# 配置 SQL Server 安全协议和密码
<a name="SQLServer.Ciphers"></a>

您可以使用数据库参数打开和关闭某些安全协议和密码。您可以配置的安全参数（TLS 版本 1.2 除外）如下表所示。


****  

| 数据库参数 | 允许的值（默认值以粗体显示） | 描述 | 
| --- | --- | --- | 
| rds.tls10 | 默认值，启用，禁用 | TLS 1.0。 | 
| rds.tls11 | 默认值，启用，禁用 | TLS 1.1。 | 
| rds.tls12 | 默认值 | TLS 1.2。您无法修改此值。 | 
| rds.fips | 0, 1 |  将参数设置为 1 时，RDS 会强制使用符合美国联邦信息处理标准 (FIPS) 140-2 标准的模块。 有关详细信息，请参阅 Microsoft 文档中的 [Use SQL Server 2016 in FIPS 140-2-compliant mode](https://docs.microsoft.com/en-us/troubleshoot/sql/security/sql-2016-fips-140-2-compliant-mode)（在 FIPS 140-2 合规模式下使用 SQL Server 2016）。  | 
| rds.rc4 | 默认值，启用，禁用 | RC4 流密码。 | 
| rds.diffie-hellman | 默认值，启用，禁用 | Diffie-Hellman key-exchange 加密。 | 
| rds.diffie-hellman-min-key-bit-length | 默认值，1024，2048，3072，4096 | Diffie-Hellman 密钥的最小位长度。 | 
| rds.curve25519 | 默认值，启用，禁用 | Curve25519 elliptic-curve 加密密码。并非所有引擎版本都支持此参数。 | 
| rds.3des168 | 默认值，启用，禁用 | 具有 168 位密钥长度的三重数据加密标准 (DES) 加密密码。 | 

**注意**  
对于 16.00.4120.1、15.00.4365.2、14.00.3465.1、13.00.6435.1 和 12.00.6449.1 之后的次要引擎版本，数据库参数 `rds.tls10`、`rds.tls11`、`rds.rc4`、`rds.curve25519` 和 `rds.3des168` 的默认设置处于*禁用*状态。否则，默认设置为*启用*。  
对于 16.00.4120.1、15.00.4365.2、14.00.3465.1、13.00.6435.1 和 12.00.6449.1 之后的次要引擎版本，`rds.diffie-hellman-min-key-bit-length` 的默认设置为 3072。否则，默认设置为 2048。

使用以下过程配置安全协议和密码：

1. 创建自定义数据库参数组。

1. 修改参数组中的参数。

1. 将数据库参数组与数据库实例相关联。

有关数据库参数组的更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

## 创建安全相关的参数组
<a name="CreateParamGroup.Ciphers"></a>

为与 SQL Server 版本和数据库实例版本相对应的安全相关参数创建参数组。

### 控制台
<a name="CreateParamGroup.Ciphers.Console"></a>

以下过程为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择**创建参数组**。

1. 在**创建参数组**窗格中，执行以下操作：

   1. 对于**参数组系列**，选择 **sqlserver-se-13.0**。

   1. 对于**组名称**，输入参数组的标识符，如 **sqlserver-ciphers-se-13**。

   1. 对于**描述**，输入 **Parameter group for security protocols and ciphers**。

1. 选择**创建**。

### CLI
<a name="CreateParamGroup.Ciphers.CLI"></a>

以下过程为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-parameter-group \
      --db-parameter-group-name sqlserver-ciphers-se-13 \
      --db-parameter-group-family "sqlserver-se-13.0" \
      --description "Parameter group for security protocols and ciphers"
  ```

  对于 Windows：

  ```
  aws rds create-db-parameter-group ^
      --db-parameter-group-name sqlserver-ciphers-se-13 ^
      --db-parameter-group-family "sqlserver-se-13.0" ^
      --description "Parameter group for security protocols and ciphers"
  ```

## 修改安全相关参数
<a name="ModifyParams.Ciphers"></a>

修改与 SQL Server 版本和数据库实例版本对应的参数组中的安全相关参数。

### 控制台
<a name="ModifyParams.Ciphers.Console"></a>

以下过程修改您为 SQL Server 标准版 2016 创建的参数组。此示例关闭 TLS 版本 1.0。

**修改参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择参数组，例如 **sqlserver-ciphers-se-13**。

1. 在**参数**下，从参数列表中筛选 **rds**。

1. 选择**编辑参数**。

1. 选择 **rds.tls10**。

1. 对于**值**，选择**已禁用**。

1. 选择 **Save changes（保存更改）**。

### CLI
<a name="ModifyParams.Ciphers.CLI"></a>

以下过程修改您为 SQL Server 标准版 2016 创建的参数组。此示例关闭 TLS 版本 1.0。

**修改参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-parameter-group \
      --db-parameter-group-name sqlserver-ciphers-se-13 \
      --parameters "ParameterName='rds.tls10',ParameterValue='disabled',ApplyMethod=pending-reboot"
  ```

  对于 Windows：

  ```
  aws rds modify-db-parameter-group ^
      --db-parameter-group-name sqlserver-ciphers-se-13 ^
      --parameters "ParameterName='rds.tls10',ParameterValue='disabled',ApplyMethod=pending-reboot"
  ```

## 将安全相关参数组与您的数据库实例关联
<a name="AssocParamGroup.Ciphers"></a>

要将参数组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="AssocParamGroup.Ciphers.Console"></a>

您可以将参数组与新的或现有的数据库实例关联：
+ 对于新的数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="AssocParamGroup.Ciphers.CLI"></a>

您可以将参数组与新的或现有的数据库实例关联。

**使用参数组创建数据库实例**
+ 指定在创建参数组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mydbinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 13.00.5426.0.v1 \
      --allocated-storage 100 \
      --master-user-password secret123 \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --db-parameter-group-name sqlserver-ciphers-se-13
  ```

  对于 Windows：

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 13.00.5426.0.v1 ^
      --allocated-storage 100 ^
      --master-user-password secret123 ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --db-parameter-group-name sqlserver-ciphers-se-13
  ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

**修改数据库实例并关联参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mydbinstance \
      --db-parameter-group-name sqlserver-ciphers-se-13 \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-parameter-group-name sqlserver-ciphers-se-13 ^
      --apply-immediately
  ```

# 更新应用程序以使用新的 SSL/TLS 证书连接到 Microsoft SQL Server 数据库实例
<a name="ssl-certificate-rotation-sqlserver"></a>

自 2023 年 1 月 13 日起，Amazon RDS 发布了新的证书颁发机构（CA）证书，以便使用安全套接字层或传输层安全性协议（SSL/TLS）连接到 RDS 数据库实例。接下来，您可以找到有关更新应用程序以使用新证书的信息。

本主题可帮助您确定是否有任何客户端应用程序使用 SSL/TLS 连接到您的数据库实例。如果是这样，您可以进一步检查这些应用程序是否需要证书验证才能连接。

**注意**  
某些应用程序配置为仅在它们可以成功验证服务器上的证书时才连接到 SQL Server 数据库实例。  
对于此类应用程序，您必须更新客户端应用程序信任存储，以包括新的 CA 证书。

更新客户端应用程序信任存储中的 CA 证书后，可以在数据库实例上轮换这些证书。强烈建议在生产环境中实现这些过程之前，先在开发或测试环境中测试它们。

有关证书轮换的更多信息，请参阅[轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。有关下载证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。有关对 Microsoft SQL Server 数据库实例使用 SSL/TLS 的信息，请参阅[将 SSL 与 Microsoft SQL Server 数据库实例结合使用](SQLServer.Concepts.General.SSL.Using.md)。

**Topics**
+ [确定是否有任何应用程序使用 SSL 连接到 Microsoft SQL Server 数据库实例](#ssl-certificate-rotation-sqlserver.determining-server)
+ [确定客户端是否需要证书验证才能连接](#ssl-certificate-rotation-sqlserver.determining-client)
+ [更新应用程序信任存储](#ssl-certificate-rotation-sqlserver.updating-trust-store)

## 确定是否有任何应用程序使用 SSL 连接到 Microsoft SQL Server 数据库实例
<a name="ssl-certificate-rotation-sqlserver.determining-server"></a>

检查数据库实例配置中 `rds.force_ssl` 参数的值。默认情况下，`rds.force_ssl` 参数设置为 0 (off)。如果 `rds.force_ssl` 参数设置为 1（开），则客户端需要使用 SSL/TLS 进行连接。有关参数组的更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

运行以下查询来获取到数据库实例的所有打开的连接的当前加密选项。如果连接已加密，则列 `ENCRYPT_OPTION` 将返回 `TRUE`。

```
select SESSION_ID,
    ENCRYPT_OPTION,
    NET_TRANSPORT,
    AUTH_SCHEME
    from SYS.DM_EXEC_CONNECTIONS
```

此查询仅显示当前连接。它没有显示过去已连接并断开连接的应用程序是否使用了 SSL。

## 确定客户端是否需要证书验证才能连接
<a name="ssl-certificate-rotation-sqlserver.determining-client"></a>

您可以检查不同类型的客户端是否需要证书验证才能连接。

**注意**  
如果您使用的连接器不是所列的连接器，请参阅特定连接器的文档以获取有关它如何执行加密连接的信息。有关更多信息，请参阅 Microsoft SQL Server 文档中的 [Microsoft SQL 数据库的连接模块](https://docs.microsoft.com/en-us/sql/connect/sql-connection-libraries?view=sql-server-ver15)。

### SQL Server Management Studio
<a name="ssl-certificate-rotation-sqlserver.determining-client.management-studio"></a>

检查是否对 SQL Server Management Studio 连接进行了加密：

1. 启动 SQL Server Management Studio。

1. 为**连接到服务器**输入服务器信息、登录用户名和密码。

1. 选择 **Options**。

1. 在连接页面中检查是否选择了**加密连接**。

有关 SQL Server Management Studio 的更多信息，请参阅[使用 SQL Server Management Studio](http://msdn.microsoft.com/en-us/library/ms174173.aspx)。

### sqlcmd
<a name="ssl-certificate-rotation-sqlserver.determining-client.sqlcmd"></a>

以下使用 `sqlcmd` 客户端的示例显示了如何检查脚本的 SQL Server 连接以确定成功的连接是否需要有效证书。有关更多信息，请参阅 Microsoft SQL Server 文档中的[使用 sqlcmd 进行连接](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/connecting-with-sqlcmd?view=sql-server-ver15)。

当使用 `sqlcmd` 时，如果您使用 `-N` 命令参数对连接进行加密，则 SSL 连接需要对服务器证书进行验证，如以下示例所示。

```
$ sqlcmd -N -S dbinstance.rds.amazon.com -d ExampleDB                     
```

**注意**  
如果 `sqlcmd` 是使用 `-C` 选项调用的，则它将信任服务器证书，即使该证书与客户端信任存储不匹配也是如此。

### ADO.NET
<a name="ssl-certificate-rotation-sqlserver.determining-client.adonet"></a>

在以下示例中，应用程序使用 SSL 进行连接，并且必须验证服务器证书。

```
using SQLC = Microsoft.Data.SqlClient;
 
...
 
    static public void Main()  
    {  
        using (var connection = new SQLC.SqlConnection(
            "Server=tcp:dbinstance.rds.amazon.com;" +
            "Database=ExampleDB;User ID=LOGIN_NAME;" +
            "Password=YOUR_PASSWORD;" + 
            "Encrypt=True;TrustServerCertificate=False;"
            ))
        {  
            connection.Open();  
            ...
        }
```

### Java
<a name="ssl-certificate-rotation-sqlserver.determining-client.java"></a>

在以下示例中，应用程序使用 SSL 进行连接，并且必须验证服务器证书。

```
String connectionUrl =   
    "jdbc:sqlserver://dbinstance.rds.amazon.com;" +  
    "databaseName=ExampleDB;integratedSecurity=true;" +  
    "encrypt=true;trustServerCertificate=false";
```

要为使用 JDBC 进行连接的客户端启用 SSL 加密，您可能需要将 Amazon RDS 证书添加到 Java CA 证书存储。有关说明，请参阅 Microsoft SQL Server 文档中的[配置客户端加密](https://docs.microsoft.com/en-us/SQL/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-2017)。您还可以通过将 `trustStore=path-to-certificate-trust-store-file` 附加到连接字符串来直接提供受信任的 CA 证书文件名。

**注意**  
如果在连接字符串中使用 `TrustServerCertificate=true`（或其等效项），则连接过程将跳过信任链验证。在这种情况下，即使无法验证证书，应用程序也会连接。使用 `TrustServerCertificate=false` 执行证书验证，这是最佳实践。

## 更新应用程序信任存储
<a name="ssl-certificate-rotation-sqlserver.updating-trust-store"></a>

您可以更新使用 Microsoft SQL Server 的应用程序的信任存储。有关说明，请参阅 [加密特定连接](SQLServer.Concepts.General.SSL.Using.md#SQLServer.Concepts.General.SSL.Client)。另请参阅 Microsoft SQL Server 文档中的[配置客户端加密](https://docs.microsoft.com/en-us/SQL/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-2017)。

如果您使用的操作系统不是 Microsoft Windows，请参阅 SSL/TLS 实现的软件分发文档，以获取有关添加新的根 CA 证书的信息。例如，OpenSSL 和 GnuTLS 是常用的选项。使用实现方法将信任添加到 RDS 根 CA 证书。Microsoft 提供了有关在某些系统上配置证书的说明。

有关下载根证书的信息，请参阅 [使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

有关导入证书的示例脚本，请参阅 [将证书导入信任存储的示例脚本](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script)。

**注意**  
更新信任存储时，除了添加新证书外，还可以保留较旧证书。

## Microsoft SQL Server 数据库实例的合规性计划支持
<a name="SQLServer.Concepts.General.Compliance"></a>

AWS范围内的服务已由第三方审核员完全评估，由此获得了证书、合规性证明或操作授权书 (ATO)。有关更多信息，请参阅[合规性计划范围内的AWS服务](https://aws.amazon.com/compliance/services-in-scope/)。

### Microsoft SQL Server 数据库实例的 HIPAA 支持
<a name="SQLServer.Concepts.General.HIPAA"></a>

您可以使用 Amazon RDS for Microsoft SQL Server 数据库来构建符合 HIPAA 标准的应用程序。您可以在与 AWS 签订的业务合作协议 (BAA) 下存储与医疗保健相关的信息，包括受保护医疗信息 (PHI)。有关更多信息，请参阅 [HIPAA 合规性](https://aws.amazon.com/compliance/hipaa-compliance/)。

Amazon RDS for SQL Server 支持在以下版本中使用 HIPAA：
+ SQL Server 2022 企业版、标准版和 Web 版本
+ SQL Server 2019 Enterprise、Standard 和 Web 版本
+ SQL Server 2017 Enterprise、Standard 和 Web 版本
+ SQL Server 2016 Enterprise、Standard 和 Web 版本

要启用对数据库实例的 HIPAA 支持，请设置以下三个组件。


****  

| 组件 | 详细信息 | 
| --- | --- | 
|  审核  |  要设置审核，请将参数 `rds.sqlserver_audit` 的值设置为 `fedramp_hipaa`。如果数据库实例尚未使用自定义数据库参数组，您必须创建一个自定义参数组并将它附加到数据库实例，然后才能修改 `rds.sqlserver_audit` 参数。有关更多信息，请参阅“[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)”。  | 
|  传输加密  |  要设置传输加密，请强制与数据库实例的所有连接使用安全套接字层 (SSL)。有关更多信息，请参阅“[强制与数据库实例的连接使用 SSL](SQLServer.Concepts.General.SSL.Using.md#SQLServer.Concepts.General.SSL.Forcing)”。  | 
|  静态加密  |  要设置静态加密，您有两种选择： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html)  | 

# Amazon RDS 上的 Microsoft SQL Server 版本
<a name="SQLServer.Concepts.General.VersionSupport"></a>

在创建新数据库实例时，您可以指定目前支持的任何 Microsoft SQL Server 版本。您可以指定 Microsoft SQL Server 主要版本（例如 Microsoft SQL Server 14.00），以及所指定主要版本的任何受支持的次要版本。如果没有指定版本，Amazon RDS 会默认使用支持的版本，通常是最新的版本。如果指定了主要版本但未指定次要版本，Amazon RDS 将默认使用您指定的主要版本的最新版本。

下表显示所有版本和所有 AWS 区域支持的 SQL Server 版本，除非另有说明。

**注意**  
您也可以使用 [describe-db-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-engine-versions.html) AWS CLI 命令查看受支持版本的列表以及新建数据库实例的默认值。您可以运行 [describe-db-major-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-major-engine-versions.html) AWS CLI 命令或者使用 [DescribeDBMajorEngineVersions](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBMajorEngineVersions.html) RDS API 操作，来查看 SQL Server 数据库的主要版本。


| 主要版本 | 次要版本 | RDS API `EngineVersion` 和 CLI `engine-version` | 
| --- | --- | --- | 
| SQL Server 2022 |  16.00.4236.2 (CU23) 16.00.4230.2 (CU22 GDR) 16.00.4225.2（CU22） 16.00.4215.2（CU21） 16.00.4210.1（CU20 GDR） 16.00.4205.1（CU20） 16.00.4195.2（CU19） 16.00.4185.3（CU18） 16.00.4175.1（CU17） 16.00.4165.4（CU16） 16.00.4150.1（CU15） 16.00.4140.3（CU14 GDR） 16.00.4135.4（CU14） 16.00.4131.2（CU13） 16.00.4125.3（CU13） 16.00.4120.1（CU12 GDR） 16.00.4115.5（CU12） 16.00.4105.2（CU11） 16.00.4095.4（CU10） 16.00.4085.2（CU9）  |  `16.00.4236.2.v1` `16.00.4230.2.v1` `16.00.4225.2.v1` `16.00.4215.2.v1` `16.00.4210.1.v1` `16.00.4205.1.v1` `16.00.4195.2.v1` `16.00.4185.3.v1` `16.00.4175.1.v1` `16.00.4165.4.v1` `16.00.4150.1.v1` `16.00.4140.3.v1` `16.00.4135.4.v1` `16.00.4131.2.v1` `16.00.4125.3.v1` `16.00.4120.1.v1` `16.00.4115.5.v1` `16.00.4105.2.v1` `16.00.4095.4.v1` `16.00.4085.2.v1`  | 
| SQL Server 2019 |  15.00.4455.2（CU32 GDR） 15.00.4445.1（CU32 GDR） 15.00.4440.1（CU32 GDR） 15.00.4435.7（CU32） 15.00.4430.1（CU32） 15.00.4420.2（CU31） 15.00.4415.2（CU30） 15.00.4410.1（CU29 GDR） 15.00.4395.2（CU28） 15.00.4390.2（CU28） 15.00.4385.2（CU28） 15.00.4382.1（CU27） 15.00.4375.4（CU27） 15.00.4365.2（CU26） 15.00.4355.3（CU25） 15.00.4345.5（CU24） 15.00.4335.1（CU23） 15.00.4322.2（CU22） 15.00.4316.3（CU21） 15.00.4312.2（CU20） 15.00.4236.7 (CU16) 15.00.4198.2 (CU15) 15.00.4153.1 (CU12) 15.00.4073.23 (CU8) 15.00.4043.16 (CU5)  |  `15.00.4455.2.v1` `15.00.4445.1.v1` `15.00.4440.1.v1` `15.00.4435.7.v1` `15.00.4430.1.v1` `15.00.4420.2.v1` `15.00.4415.2.v1` `15.00.4410.1.v1` `15.00.4395.2.v1` `15.00.4390.2.v1` `15.00.4385.2.v1` `15.00.4382.1.v1` `15.00.4375.4.v1` `15.00.4365.2.v1` `15.00.4355.3.v1` `15.00.4345.5.v1` `15.00.4335.1.v1` `15.00.4322.2.v1` `15.00.4316.3.v1` `15.00.4312.2.v1` `15.00.4236.7.v1` `15.00.4198.2.v1` `15.00.4153.1.v1` `15.00.4073.23.v1` `15.00.4043.16.v1`  | 
| SQL Server 2017 |  14.00.3515.1（CU31 GDR） 14.00.3505.1（CU31 GDR） 14.00.3500.1（CU31 GDR） 14.00.3495.9（CU31 GDR） 14.00.3485.1（CU31 GDR） 14.00.3480.1（CU31） 14.00.3475.1（CU31） 14.00.3471.2（CU31） 14.00.3465.1（CU31） 14.00.3460.9（CU31） 14.00.3451.2 (CU30) 14.00.3421.10 (CU27) 14.00.3401.7 (CU25) 14.00.3381.3 (CU23) 14.00.3356.20 (CU22) 14.00.3294.2 (CU20) 14.00.3281.6 (CU19)  |  `14.00.3515.1.v1` `14.00.3505.1.v1` `14.00.3500.1.v1` `14.00.3495.9.v1` `14.00.3485.1.v1` `14.00.3480.1.v1` `14.00.3475.1.v1` `14.00.3471.2.v1` `14.00.3465.1.v1` `14.00.3460.9.v1` `14.00.3451.2.v1` `14.00.3421.10.v1` `14.00.3401.7.v1` `14.00.3381.3.v1` `14.00.3356.20.v1` `14.00.3294.2.v1` `14.00.3281.6.v1`  | 
| SQL Server 2016 |  13.00.6475.1（GDR） 13.00.6470.1（GDR） 13.00.6465.1（GDR） 13.00.6460.7（GDR） 13.00.6455.2（GDR） 13.00.6450.1（GDR） 13.00.6445.1（GDR） 13.00.6441.1（GDR） 13.00.6435.1（GDR） 13.00.6430.49（GDR） 13.00.6419.1（SP3 \$1 补丁） 13.00.6300.2 (SP3)  |  `14.00.6475.1.v1` `14.00.6470.1.v1` `13.00.6465.1.v1` `13.00.6460.7.v1` `13.00.6455.2.v1` `13.00.6450.1.v1` `13.00.6445.1.v1` `13.00.6441.1.v1` `13.00.6435.1.v1` `13.00.6430.49.v1` `13.00.6419.1.v1` `13.00.6300.2.v1`  | 

## Amazon RDS 中的版本管理
<a name="SQLServer.Concepts.General.Version-Management"></a>

Amazon RDS 包括灵活的版本管理功能，让您可以控制何时以及如何修补或升级您的数据库实例。这让您可对数据库引擎执行以下操作：
+ 维持与数据库引擎修补程序版本的兼容性。
+ 在将新修补程序版本部署到生产环境之前，先测试它们，以确定它们可与您的应用程序一起使用。
+ 规划和执行版本升级以满足您的服务水平协议和计时要求。

### Amazon RDS 中的 Microsoft SQL Server 引擎修补
<a name="SQLServer.Concepts.General.Patching"></a>

Amazon RDS 会定期将官方 Microsoft SQL Server 数据库修补程序聚合到 Amazon RDS 特定的数据库实例引擎版本。有关每个引擎版本中的 Microsoft SQL Server 修补程序的更多信息，请参阅 [Amazon RDS 上的版本和功能支持](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html#SQLServer.Concepts.General.FeatureSupport)。

目前，您对数据库实例手动执行所有引擎升级。有关更多信息，请参阅“[升级 Microsoft SQL Server 数据库引擎](USER_UpgradeDBInstance.SQLServer.md)”。

### Amazon RDS 上的 Microsoft SQL Server 主要引擎版本的弃用时间表
<a name="SQLServer.Concepts.General.Deprecated-Versions"></a>

下表显示了 Microsoft SQL Server 主要引擎版本的计划弃用时间表。


| 日期 | 信息 | 
| --- | --- | 
| 2026 年 7 月 14 日 |  Microsoft 将停止 SQL Server 2016 的关键修补程序更新。有关详细信息，请参阅 Microsoft 文档中的 [Microsoft SQL Server 2016](https://learn.microsoft.com/en-us/lifecycle/products/sql-server-2016)。  | 
| 2026 年 7 月 14 日 |  Amazon RDS 计划在 RDS for SQL Server 上终止对 Microsoft SQL Server 2016 的支持。届时，任何剩余的实例都将被安排迁移到 SQL Server 2017（最新可用的次要版本）。有关更多信息，请参阅 [Announcement: Amazon RDS for SQL Server ending support for Microsoft SQL Server 2016](https://repost.aws/articles/ARGkeWligDSU-MQgBwUQj0nA/announcement-amazon-rds-for-sql-server-ending-support-for-microsoft-sql-server-2016)。 为避免从 Microsoft SQL Server 2016 自动升级，您可以在方便的时候进行升级。有关更多信息，请参阅 [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)。  | 
| 2026 年 1 月 15 日 | Amazon RDS 开始禁止使用 Microsoft SQL Server 2016 为 SQL Server 数据库实例创建新的 RDS。有关更多信息，请参阅 [Announcement: Amazon RDS for SQL Server ending support for Microsoft SQL Server 2016](https://repost.aws/articles/ARGkeWligDSU-MQgBwUQj0nA/announcement-amazon-rds-for-sql-server-ending-support-for-microsoft-sql-server-2016)。 | 
| 2024 年 7 月 9 日 |  Microsoft 将停止 SQL Server 2014 的关键补丁更新。有关更多信息，请参阅 Microsoft 文档中的 [Microsoft SQL Server 2014](https://learn.microsoft.com/en-us/lifecycle/products/sql-server-2014)。  | 
|  2024 年 6 月 1 日 |  Amazon RDS 计划在 RDS for SQL Server 上终止对 Microsoft SQL Server 2014 的支持。届时，任何剩余的实例都将被安排迁移到 SQL Server 2016（最新可用的次要版本）。有关更多信息，请参阅[公告：Amazon RDS for SQL Server 终止对 SQL Server 2014 主要版本的支持](https://repost.aws/articles/AR-eyAH1PSSuevuZRUE9FV3A)。 为避免从 Microsoft SQL Server 2014 自动升级，您可以在方便的时候进行升级。有关更多信息，请参阅 [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)。  | 
| 2022 年 7 月 12 日 |  Microsoft 将停止 SQL Server 2012 的关键修补程序更新。有关详细信息，请参阅 Microsoft 文档中的 [Microsoft SQL Server 2012](https://docs.microsoft.com/en-us/lifecycle/products/microsoft-sql-server-2012)。  | 
| 2022 年 6 月 1 日 |  Amazon RDS 计划在 RDS for SQL Server 上终止对 Microsoft SQL Server 2012 的支持。届时，任何剩余的实例都将被安排迁移到 SQL Server 2014（最新可用的次要版本）。有关更多信息，请参阅[公告：Amazon RDS for SQL Server 终止对 SQL Server 2012 主要版本的支持](https://repost.aws/questions/QUFNiETqrMQ_WT_AXSxOYNOA)。 为避免从 Microsoft SQL Server 2012 自动升级，您可以在方便的时候进行升级。有关更多信息，请参阅 [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)。  | 
| 2021 年 9 月 1 日 | Amazon RDS 开始禁止使用 Microsoft SQL Server 2012 为 SQL Server 数据库实例创建新的 RDS。有关更多信息，请参阅[公告：Amazon RDS for SQL Server 终止对 SQL Server 2012 主要版本的支持](https://repost.aws/questions/QUFNiETqrMQ_WT_AXSxOYNOA)。 | 
| 2019 年 7 月 12 日 |  Amazon RDS 团队已在 2019 年 6 月停止为 Microsoft SQL Server 2008 R2 提供支持。剩余的 Microsoft SQL Server 2008 R2 实例正在迁移到 SQL Server 2012（最新可用的次要版本）。 为避免从 Microsoft SQL Server 2008 R2 自动升级，您可以在方便的时候进行升级。有关更多信息，请参阅“[升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)”。  | 
| 2019 年 4 月 25 日 | 在 2019 年 4 月底之前，您将不能再使用 Microsoft SQL Server 2008R2 创建新的 Amazon RDS for SQL Server 数据库实例。 | 

# Amazon RDS 上的 Microsoft SQL Server 功能
<a name="SQLServer.Concepts.General.FeatureSupport"></a>

Amazon RDS 上支持的 SQL Server 版本包括以下功能。一般来说，除非 Microsoft 文档中另有说明，否则版本中也包括以前版本的功能。

**Topics**
+ [Microsoft SQL Server 2022 功能](#SQLServer.Concepts.General.FeatureSupport.2022)
+ [Microsoft SQL Server 2019 功能](#SQLServer.Concepts.General.FeatureSupport.2019)
+ [Microsoft SQL Server 2017 功能](#SQLServer.Concepts.General.FeatureSupport.2017)
+ [Microsoft SQL Server 2016 功能](#SQLServer.Concepts.General.FeatureSupport.2016)
+ [Amazon RDS 上的 Microsoft SQL Server 2014 支持终止](#SQLServer.Concepts.General.FeatureSupport.2014)
+ [Amazon RDS 上的 Microsoft SQL Server 2012 支持终止](#SQLServer.Concepts.General.FeatureSupport.2012)
+ [Amazon RDS 上的 Microsoft Server 2008 R2 支持终止](#SQLServer.Concepts.General.FeatureSupport.2008)
+ [适用于 Microsoft SQL Server 数据库实例的更改数据捕获支持](SQLServer.Concepts.General.CDC.md)
+ [不支持的功能以及有限支持的功能](SQLServer.Concepts.General.FeatureNonSupport.md)

## Microsoft SQL Server 2022 功能
<a name="SQLServer.Concepts.General.FeatureSupport.2022"></a>

SQL Server 2022 包括很多新功能，例如以下各项：
+ 参数敏感计划优化 – 允许单个参数化语句有多个缓存计划，从而可能减少有关参数嗅探的问题。
+ SQL Server Ledger – 提供以加密方式证明您的数据未经授权而未被更改的功能。
+ 事务日志文件增长事件的即时文件初始化 – 可以更快地执行高达 64MB 的日志增长事件，包括对于启用了 TDE 的数据库。
+ 系统页面锁存并发增强 – 在分配和取消分配数据页和范围时减少页面锁存争用，为 `tempdb` 繁重的工作负载提供显著的性能增强。

有关 SQL Server 2022 功能的完整列表，请参阅 Microsoft 文档中的 [SQL Server 2022（16.x）中的新增功能](https://learn.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-2022?view=sql-server-ver16)。

有关不支持特征的列表，请参阅 [不支持的功能以及有限支持的功能](SQLServer.Concepts.General.FeatureNonSupport.md)。

## Microsoft SQL Server 2019 功能
<a name="SQLServer.Concepts.General.FeatureSupport.2019"></a>

SQL Server 2019 包括很多新功能，例如以下内容：
+ 加速数据库恢复 (ADR) – 减少重新启动或长时间运行的事务回滚后的崩溃恢复时间。
+ 智能查询处理 (IQP)：
  + 行模式内存授予反馈 – 自动更正多余的授权，否则会导致内存浪费并降低并发性。
  + 行存储上的批处理模式 – 为分析工作负载启用批处理模式执行，而不需要列存储索引。
  + 表变量延迟编译 – 提高了引用表变量的查询的计划质量和整体性能。
+ 智能性能：
  + `OPTIMIZE_FOR_SEQUENTIAL_KEY` 索引选项 – 提高向索引进行高并发性插入的吞吐量。
  + 改进了间接检查点可扩展性 – 帮助具有繁重 DML 工作负载的数据库。
  + 并发页可用空间 (PFS) 更新 – 允许作为共享闩锁而非独占闩锁进行处理。
+ 监控改进：
  + `WAIT_ON_SYNC_STATISTICS_REFRESH` 等待类型 – 显示在同步统计信息刷新操作上花费的累积实例级时间。
  + 数据库范围内的配置 – 包括 `LIGHTWEIGHT_QUERY_PROFILING` 和 `LAST_QUERY_PLAN_STATS`。
  + 动态管理功能 (DMF) – 包括 `sys.dm_exec_query_plan_stats` 和 `sys.dm_db_page_info`。
+ 详细截断警告 – 数据截断错误消息默认包括表名和列名以及截断的值。
+ 可恢复的联机索引创建 – 在 SQL Server 2017 中，只支持可恢复的联机索引重建。

有关 SQL Server 2019 功能的完整列表，请参阅 Microsoft 文档中的 [SQL Server 2019（15.x）中的新增功能](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-ver15)。

有关不支持功能的列表，请参阅 [不支持的功能以及有限支持的功能](SQLServer.Concepts.General.FeatureNonSupport.md)。

## Microsoft SQL Server 2017 功能
<a name="SQLServer.Concepts.General.FeatureSupport.2017"></a>

SQL Server 2017 包括很多新功能，例如以下内容：
+ 自适应查询处理
+ 自动更正计划（自动优化功能）
+ GraphDB
+ 可恢复的索引重建

有关 SQL Server 2017 功能的完整列表，请参阅 Microsoft 文档中的 [SQL Server 2017 中的新增功能](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-2017)。

有关不支持功能的列表，请参阅 [不支持的功能以及有限支持的功能](SQLServer.Concepts.General.FeatureNonSupport.md)。

## Microsoft SQL Server 2016 功能
<a name="SQLServer.Concepts.General.FeatureSupport.2016"></a>

Amazon RDS 支持 SQL Server 2016 的以下功能：
+ 始终加密
+ JSON 支持
+ 运行分析
+ 查询存储
+ 临时表

有关 SQL Server 2016 功能的完整列表，请参阅 Microsoft 文档中的 [SQL Server 2016 中的新增功能](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-2016)。

## Amazon RDS 上的 Microsoft SQL Server 2014 支持终止
<a name="SQLServer.Concepts.General.FeatureSupport.2014"></a>

SQL Server 2014 在 Amazon RDS 上的支持已经终止。

RDS 正在将仍在使用 SQL Server 2014 的所有现有数据库实例升级到 SQL Server 2016 的最新次要版本。有关更多信息，请参阅 [Amazon RDS 中的版本管理](SQLServer.Concepts.General.VersionSupport.md#SQLServer.Concepts.General.Version-Management)。

## Amazon RDS 上的 Microsoft SQL Server 2012 支持终止
<a name="SQLServer.Concepts.General.FeatureSupport.2012"></a>

SQL Server 2012 在 Amazon RDS 上的支持已经终止。

RDS 正在将仍在使用 SQL Server 2012 的所有现有数据库实例升级到 SQL Server 2016 的最新次要版本。有关更多信息，请参阅 [Amazon RDS 中的版本管理](SQLServer.Concepts.General.VersionSupport.md#SQLServer.Concepts.General.Version-Management)。

## Amazon RDS 上的 Microsoft Server 2008 R2 支持终止
<a name="SQLServer.Concepts.General.FeatureSupport.2008"></a>

SQL Server 2008 R2 在 Amazon RDS 上的支持已经终止。

RDS 正在将仍在使用 SQL Server 2008 R2 的所有现有实例升级到 SQL Server 2012 的最新次要版本。有关更多信息，请参阅 [Amazon RDS 中的版本管理](SQLServer.Concepts.General.VersionSupport.md#SQLServer.Concepts.General.Version-Management)。

# 适用于 Microsoft SQL Server 数据库实例的更改数据捕获支持
<a name="SQLServer.Concepts.General.CDC"></a>

Amazon RDS 支持运行 Microsoft SQL Server 的数据库实例的更改数据捕获 (CDC)。CDC 捕获对表中数据所做的更改，并存储有关您稍后可访问的每项更改的元数据。有关更多信息，请参阅 Microsoft 文档中的[更改数据捕获](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server#Capture)。

Amazon RDS 支持在以下 SQL Server 版本中使用 CDC：
+ Microsoft SQL Server 企业版（所有版本） 
+ Microsoft SQL Server 标准版：
  + 2022
  + 2019
  + 2017
  + 2016 版本 13.00.4422.0 SP1 CU2 及更高版本

要将 CDC 用于 Amazon RDS 数据库实例，请先使用 RDS 提供的存储过程在数据库级别启用或禁用 CDC。之后，担任该数据库的 `db_owner` 角色的任何用户均可使用本机 Microsoft 存储过程来控制该数据库上的 CDC。有关更多信息，请参阅“[在 Amazon RDS for SQL Server 上使用变更数据捕获](Appendix.SQLServer.CommonDBATasks.CDC.md)”。

您可以使用 CDC 和 AWS Database Migration Service 启用来自 SQL Server 数据库实例的持续复制。

# 不支持的功能以及有限支持的功能
<a name="SQLServer.Concepts.General.FeatureNonSupport"></a>

Amazon RDS 中不支持以下 Microsoft SQL Server 功能：
+ 备份到 Microsoft Azure Blob 存储
+ 缓冲池扩展
+ 自定义密码策略
+ 数据质量服务
+ 数据库日志传输
+ 数据库快照（Amazon RDS 仅支持数据库实例快照）
+ 扩展存储过程，包括 xp\$1cmdshell
+ FILESTREAM 支持
+ 文件表
+ Machine Learning 和 R 服务（需要操作系统访问权限才能安装）
+ 维护计划
+ 性能数据收集器
+ 基于策略的管理
+ PolyBase
+ 复制
+ 服务器级别触发器
+ 服务代理端点
+ 拉伸数据库
+ TRUSTWORTHY 数据库属性（需要 sysadmin 角色）
+ T-SQL 端点 (使用 CREATE ENDPOINT 的所有操作不可用)
+ WCF Data Services

Amazon RDS 上对以下 Microsoft SQL Server 功能提供有限支持：
+ 分布式查询/链接服务器。有关更多信息，请参阅[通过 Amazon RDS for Microsoft SQL Server 实施链接服务器](https://aws.amazon.com/blogs/database/implement-linked-servers-with-amazon-rds-for-microsoft-sql-server/)。
+ 通用运行时语言 (CLR)。在适用于 SQL Server 2016 和更低版本的 RDS 上，在 `SAFE` 模式中支持 CLR 并仅使用汇编位。在适用于 SQL Server 2017 和更高版本的 RDS 上不支持 CLR。有关更多信息，请参阅 Microsoft 文档中的[通用运行时语言集成](https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration/common-language-runtime-integration-overview)。
+ Amazon RDS for SQL Server 中带有 Oracle OLEDB 的链接服务器。有关更多信息，请参阅 [在 Amazon RDS for SQL Server 中支持带有 Oracle OLEDB 的链接服务器](Appendix.SQLServer.Options.LinkedServers_Oracle_OLEDB.md)。

对于 SQL Server 2022，Amazon RDS 中不支持以下功能：
+ 暂停数据库以获取快照
+ 外部数据来源
+ 备份和还原到 S3 兼容的对象存储
+ 对象存储集成
+ TLS 1.3 和 MS-TDS 8.0
+ 使用 QAT 分载备份压缩
+ SQL Server Analysis Services (SSAS)
+ 使用多可用区部署进行数据库镜像。SQL Server Always On 是多可用区部署中唯一受支持的方法。

## 使用 Microsoft SQL Server 数据库镜像或 Always On 可用性组的多可用区部署
<a name="SQLServer.Concepts.General.Mirroring"></a>

Amazon RDS 通过使用 SQL Server 数据库镜像 (DBM) 或 Always On 可用性组 (AG) 支持为运行 Microsoft SQL Server 的数据库实例进行多可用区部署。多可用区部署为数据库实例提供了更高的可用性、数据持久性和容错能力。在进行计划的数据维护或发生未计划的服务中断时，Amazon RDS 将自动失效转移到最新辅助副本，以便数据库操作能够在不进行手动干预的情况下快速恢复。主实例和辅助实例使用相同的端点，其物理网络地址作为失效转移过程的一部分转换到被动辅助副本。在失效转移时，您不必重新配置应用程序。

Amazon RDS 管理失效转移的方式是：主动监控多可用区部署并在主实例发生问题时主动启动失效转移。除非备用实例和主要实例完全同步，否则失效转移不会发生。Amazon RDS 自动修复运行状况不佳的数据库实例并重新建立同步复制，主动维护您的多可用区部署。您不必管理任何内容。Amazon RDS 负责处理主实例、见证以及备用实例。当您设置 SQL Server 多可用区时，RDS 为实例上的所有数据库配置被动辅助实例。

有关更多信息，请参阅“[Amazon RDS for Microsoft SQL Server 多可用区部署](USER_SQLServerMultiAZ.md)”。

## 使用透明数据加密来加密静态数据
<a name="SQLServer.Concepts.General.Options"></a>

Amazon RDS 支持 Microsoft SQL Server 透明数据加密（TDE），此方法以透明方式对存储数据进行加密。Amazon RDS 利用选项组启用和配置这些功能。有关 TDE 选项的更多信息，请参阅 [SQL Server 中的透明数据加密支持](Appendix.SQLServer.Options.TDE.md)。

# 适用于 Amazon RDS for Microsoft SQL Server 的函数和存储过程
<a name="SQLServer.Concepts.General.StoredProcedures"></a>

在下面，您可以找到有助于自动执行 SQL Server 任务的 Amazon RDS 函数和存储过程的列表。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Concepts.General.StoredProcedures.html)

# Microsoft SQL Server 数据库实例的本地时区
<a name="SQLServer.Concepts.General.TimeZone"></a>

默认情况下，已设置运行 Microsoft SQL Server 的 Amazon RDS 数据库实例的时区。当前默认值为协调世界时 (UTC)。您可改为将数据库实例的时区设置为本地时区以匹配应用程序的时区。

首次创建数据库实例时将设置时区。您可以使用 [AWS 管理控制台](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)、Amazon RDS API [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html.html) 操作或 AWS CLI [create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) 命令创建数据库实例。

如果数据库实例是多可用区部署（使用 SQL Server DBM 或 AG）的一部分，则当您进行故障转移时，您的时区将保留您设置的本地时区。有关更多信息，请参阅“[使用 Microsoft SQL Server 数据库镜像或 Always On 可用性组的多可用区部署](CHAP_SQLServer.md#SQLServer.Concepts.General.Mirroring)”。

在请求时间点还原时，请指定要还原到的时间。时间以您的当地时区显示。有关更多信息，请参阅“[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)”。

下面是在数据库实例上设置本地时区时的限制：
+ 您无法修改现有 SQL Server 数据库实例的时区。
+ 您无法将快照从一个时区的数据库实例还原至另一个时区的数据库实例。
+ 强烈建议您不要将备份文件从一个时区还原到另一个时区。如果您将备份文件从一个时区还原至为另一个时区，则必须审查您的查询和应用程序来查看时区更改的效果。有关更多信息，请参阅“[使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)”。

## 支持的时区
<a name="SQLServer.Concepts.General.TimeZone.Zones"></a>

您可以将本地时区设置为下表中列出的值之一。


| 时区 | 标准时间偏差 | 描述 | 备注 | 
| --- | --- | --- | --- | 
| 阿富汗标准时间 | (UTC\$104:30) | 喀布尔 | 此时区不遵守夏令时。 | 
| 阿拉斯加标准时间 | (UTC–09:00) | 阿拉斯加州 |  | 
| 阿留申群岛标准时间 | (UTC–10:00) | 阿留申群岛 |  | 
| 阿尔泰标准时间 | (UTC\$107:00) | 巴尔瑙尔，戈尔诺-阿尔泰斯克 |  | 
| 阿拉伯标准时间 | (UTC\$103:00) | 科威特，利雅得 | 此时区不遵守夏令时。 | 
| 阿拉伯标准时间 | (UTC\$104:00) | 阿布扎比、马斯喀特 |  | 
| 阿拉伯标准时间 | (UTC\$103:00) | 巴格达 | 此时区不遵守夏令时。 | 
| 阿根廷标准时间 | (UTC–03:00) | 布宜诺斯艾利斯市 | 此时区不遵守夏令时。 | 
| 阿斯特拉罕标准时间 | (UTC\$104:00) | 阿斯特拉罕，乌里扬诺夫斯克 |  | 
| 大西洋标准时间 | (UTC–04:00) | 大西洋时间 (加拿大) |  | 
| 澳大利亚中部标准时间 | (UTC\$109:30) | 达尔文 | 此时区不遵守夏令时。 | 
| 澳大利亚中西部标准时间 | (UTC\$108:45) | 尤克拉 |  | 
| 澳大利亚东部标准时间 | (UTC\$110:00) | 堪培拉、墨尔本、悉尼 |  | 
| 阿塞拜疆标准时间 | (UTC\$104:00) | 巴库 |  | 
| 亚速尔群岛标准时间 | (UTC–01:00) | 亚速尔群岛 |  | 
| 巴伊亚标准时间 | (UTC–03:00) | 萨尔瓦多 |  | 
| 孟加拉国标准时间 | (UTC\$106:00) | 达卡 | 此时区不遵守夏令时。 | 
| 白俄罗斯标准时间 | (UTC\$103:00) | 明斯克 | 此时区不遵守夏令时。 | 
| 布干维尔岛标准时间 | (UTC\$111:00) | 布干维尔岛 |  | 
| 加拿大中部标准时间 | (UTC–06:00) | 萨斯喀彻温省 | 此时区不遵守夏令时。 | 
| 佛得角标准时间 | (UTC–01:00) | 佛得角群岛 | 此时区不遵守夏令时。 | 
| 高加索标准时间 | (UTC\$104:00) | 埃里温 |  | 
| 澳大 利亚中部标准时间 | (UTC\$109:30) | 阿德莱德 |  | 
| 中美洲标准时间 | (UTC–06:00) | 中美洲 | 此时区不遵守夏令时。 | 
| 中亚标准时间 | (UTC\$106:00) | 阿斯塔纳 | 此时区不遵守夏令时。 | 
| 巴西中部标准时间 | (UTC–04:00) | 库亚巴 |  | 
| 中欧标准时间 | (UTC\$101:00) | 贝尔格莱德、布拉迪斯拉发、布达佩斯、卢布尔雅那、布拉格 |  | 
| 中欧标准时间 | (UTC\$101:00) | 萨拉热窝、斯科普里、华沙、萨格勒布 |  | 
| 太平洋中部标准时间 | (UTC\$111:00) | 索罗门群岛、新喀里多尼亚 | 此时区不遵守夏令时。 | 
| 中部标准时间 | (UTC–06:00) | 中部时间 (美国和加拿大) |  | 
| 中部标准时间（墨西哥） | (UTC–06:00) | 瓜达拉哈拉、墨西哥城、蒙特雷 |  | 
| 查塔姆群岛标准时间 | (UTC\$112:45) | 查塔姆群岛 |  | 
| 中国标准时间 | (UTC\$108:00) | 北京、重庆、香港特别行政区、乌鲁木齐 | 此时区不遵守夏令时。 | 
| 古巴标准时间 | (UTC–05:00) | 哈瓦那 |  | 
| 国际日期变更线标准时间 | (UTC–12:00) | 国际日期变更线西 | 此时区不遵守夏令时。 | 
| 东非标准时间 | (UTC\$103:00) | 内罗毕 | 此时区不遵守夏令时。 | 
| 澳大利亚东部标准时间 | (UTC\$110:00) | 布里斯班 | 此时区不遵守夏令时。 | 
| 东欧标准时间 | (UTC\$102:00) | 基希讷乌 |  | 
| 东部南美洲标准时间 | (UTC–03:00) | 巴西利亚 |  | 
| 复活节岛标准时间 | (UTC–06:00) | 复活节岛 |  | 
| 东部标准时间 | (UTC–05:00) | 东部时间 (美国和加拿大) |  | 
| 东部标准时间（墨西哥） | (UTC–05:00) | 切图马尔 |  | 
| 埃及标准时间 | (UTC\$102:00) | 开罗 |  | 
| 叶卡捷琳堡标准时间 | (UTC\$105:00) | 叶卡捷琳堡 |  | 
| 斐济标准时间 | (UTC\$112:00) | 斐济 |  | 
| FLE 标准时间 | (UTC\$102:00) | 赫尔辛基，基辅，里加，索非亚，塔林，维尔纽斯 |  | 
| 格鲁吉亚标准时间 | (UTC\$104:00) | 第比利斯 | 此时区不遵守夏令时。 | 
| GMT 标准时间 | (UTC) | 都柏林、爱丁堡、里斯本、伦敦 |  此时区与格林威治标准时间不同。此时区遵守夏令时。 | 
| 格陵兰标准时间 | (UTC–03:00) | 格陵兰 |  | 
| 格林威治标准时间 | (UTC) | 蒙罗维亚、雷克雅未克 | 此时区不遵守夏令时。 | 
| GTB 标准时间 | (UTC\$102:00) | 雅典、布加勒斯特 |  | 
| 海地标准时间 | (UTC–05:00) | 海地 |  | 
| 夏威夷标准时间 | (UTC–10:00) | 夏威夷州 |  | 
| 印度标准时间 | (UTC\$105:30) | 钦奈、加尔各答、孟买、新德里 | 此时区不遵守夏令时。 | 
| 伊朗标准时间 | (UTC\$103:30) | 德黑兰 |  | 
| 以色列标准时间 | (UTC\$102:00) | 耶路撒冷 |  | 
| 约旦标准时间 | (UTC\$102:00) | 阿曼 |  | 
| 加里宁格勒标准时间 | (UTC\$102:00) | 加里宁格勒 |  | 
| 堪察加标准时间 | (UTC\$112:00) | 彼得罗巴甫洛夫斯克-堪察加 – 旧 |  | 
| 韩国标准时间 | (UTC\$109:00) | 首尔 | 此时区不遵守夏令时。 | 
| 利比亚标准时间 | (UTC\$102:00) | 的黎波里 |  | 
| 莱恩群岛标准时间 | (UTC\$114:00) | 圣诞岛 |  | 
| 豪勋爵岛标准时间 | (UTC\$110:30) | 豪勋爵岛 |  | 
| 马加丹标准时间 | (UTC\$111:00) | 马加丹 | 此时区不遵守夏令时。 | 
| 麦哲伦标准时间 | (UTC–03:00) | 蓬塔阿雷纳斯 |  | 
| 马克萨斯群岛标准时间 | (UTC–09:30) | 马克萨斯群岛 |  | 
| 毛里求斯标准时间 | (UTC\$104:00) | 路易港 | 此时区不遵守夏令时。 | 
| 中东标准时间 | (UTC\$102:00) | 贝鲁特 |  | 
| 蒙得维的亚标准时间 | (UTC–03:00) | 蒙得维的亚 |  | 
| 摩洛哥标准时间 | (UTC\$101:00) | 卡萨布兰卡 |  | 
| 山地标准时间 | (UTC–07:00) | 山区时间 (美国和加拿大) |  | 
| 山地标准时间（墨西哥） | (UTC–07:00) | 奇瓦瓦、拉巴斯、马萨特兰 |  | 
| 缅甸标准时间 | (UTC\$106:30) | 仰光 | 此时区不遵守夏令时。 | 
| 中亚北部标准时间 | (UTC\$107:00) | 新西伯利亚 |  | 
| 纳米比亚标准时间 | (UTC\$102:00) | 温得和克 |  | 
| 尼泊尔标准时间 | (UTC\$105:45) | 加德满都 | 此时区不遵守夏令时。 | 
| 新西兰标准时间 | (UTC\$112:00) | 奥克兰、惠灵顿 |  | 
| 纽芬兰标准时间 | (UTC–03:30) | 纽芬兰省 |  | 
| 诺福克岛标准时间 | (UTC\$111:00) | 诺福克岛 |  | 
| 北亚东部标准时间 | (UTC\$108:00) | 伊尔库茨克 |  | 
| 北亚标准时间 | (UTC\$107:00) | 克拉斯诺亚尔斯克 |  | 
| 朝鲜标准时间 | (UTC\$109:00) | 平壤 |  | 
| 鄂木斯克标准时间 | (UTC\$106:00) | 鄂木斯克 |  | 
| 太平洋 SA 标准时间 | (UTC–03:00) | 圣地亚哥 |  | 
| 太平洋标准时间 | (UTC–08:00) | 太平洋时间 (美国和加拿大) |  | 
| 太平洋标准时间（墨西哥） | (UTC–08:00) | 下加利福尼亚州 |  | 
| 巴基斯坦标准时间 | (UTC\$105:00) | 伊斯兰堡，卡拉奇 | 此时区不遵守夏令时。 | 
| 巴拉圭标准时间 | (UTC–04:00) | 亚松森 |  | 
| 罗马标准时间 | (UTC\$101:00) | 布鲁塞尔，哥本哈根，马德里，巴黎 |  | 
| 俄罗斯时区 10 | (UTC\$111:00) | 乔库尔达赫 |  | 
| 俄罗斯时区 11 | (UTC\$112:00) | 阿纳德尔，堪察加彼得罗巴甫洛夫斯克 |  | 
| 俄罗斯时区 3 | (UTC\$104:00) | 伊热夫斯克，萨马拉 |  | 
| 俄罗斯标准时间 | (UTC\$103:00) | 莫斯科、圣彼德堡、伏尔加格勒 | 此时区不遵守夏令时。 | 
| 南美洲东部标准时间 | (UTC–03:00) | 卡宴，福塔雷萨 | 此时区不遵守夏令时。 | 
| SA 太平洋标准时间 | (UTC–05:00) | 波哥大、利马、基多、里约布兰科 |  此时区不遵守夏令时。 | 
| 南美洲西部标准时间 | (UTC–04:00) | 乔治敦，拉巴斯，马瑙斯，圣胡安 | 此时区不遵守夏令时。 | 
| 圣皮埃尔标准时间 | (UTC–03:00) | 圣皮埃尔和密克隆群岛 |  | 
| 萨哈林标准时间 | (UTC\$111:00) | 萨哈林 |  | 
| 萨摩亚群岛标准时间 | (UTC\$113:00) | 萨摩亚群岛 |  | 
| 圣多美标准时间 | (UTC\$101:00) | 圣多美 |  | 
| 萨拉托夫标准时间 | (UTC\$104:00) | 萨拉托夫 |  | 
| 东南亚标准时间 | (UTC\$107:00) | 曼谷、河内、雅加达 | 此时区不遵守夏令时。 | 
| 新加坡标准时间 | (UTC\$108:00) | 吉隆坡、新加坡 | 此时区不遵守夏令时。 | 
| 南非标准时间 | (UTC\$102:00) | 哈拉雷，比勒陀利亚 | 此时区不遵守夏令时。 | 
| 斯里兰卡标准时间 | (UTC\$105:30) | 斯里哈亚华登尼普拉 | 此时区不遵守夏令时。 | 
| 苏丹标准时间 | (UTC\$102:00) | 喀土穆 |  | 
| 叙利亚标准时间 | (UTC\$102:00) | 大马士革 |  | 
| 台北标准时间 | (UTC\$108:00) | 台北 | 此时区不遵守夏令时。 | 
| 塔斯马尼亚岛标准时间 | (UTC\$110:00) | 霍巴特 |  | 
| 托坎廷斯标准时间 | (UTC–03:00) | 阿拉瓜伊纳 |  | 
| 东京标准时间 | (UTC\$109:00) | 大坂、札幌、东京 | 此时区不遵守夏令时。 | 
| 托木斯克标准时间 | (UTC\$107:00) | 托木斯克 |  | 
| 汤加标准时间 | (UTC\$113:00) | 努库阿洛法 | 此时区不遵守夏令时。 | 
| 外贝加尔标准时间 | (UTC\$109:00) | 赤塔市 |  | 
| 土耳其标准时间 | (UTC\$103:00) | 伊斯坦布尔 |  | 
| 特克斯和凯科斯群岛标准时间 | (UTC–05:00) | 特克斯和凯科斯群岛 |  | 
| 乌兰巴托标准时间 | (UTC\$108:00) | 乌兰巴托 | 此时区不遵守夏令时。 | 
| 美国东部标准时间 | (UTC–05:00) | 印第安纳 (东部) |  | 
| 美国山地标准时间 | (UTC–07:00) | 亚利桑那州 | 此时区不遵守夏令时。 | 
| UTC | UTC | 协调世界时 | 此时区不遵守夏令时。 | 
| UTC–02 | (UTC–02:00) | 协调世界时–02 | 此时区不遵守夏令时。 | 
| UTC–08 | (UTC–08:00) | 协调世界时–08 |  | 
| UTC–09 | (UTC–09:00) | 协调世界时–09 |  | 
| UTC–11 | (UTC–11:00) | 协调世界时–11 | 此时区不遵守夏令时。 | 
| UTC\$112 | (UTC\$112:00) | 协调世界时\$112 | 此时区不遵守夏令时。 | 
| UTC\$113 | (UTC\$113:00) | 协调世界时\$113 |  | 
| 委内瑞拉标准时间 | (UTC–04:00) | 加拉加斯 | 此时区不遵守夏令时。 | 
| 符拉迪沃斯托克标准时间 | (UTC\$110:00) | 符拉迪沃斯托克 |  | 
| 伏尔加格勒标准时间 | (UTC\$104:00) | 伏尔加格勒 |  | 
| 澳大利亚西部标准时间 | (UTC\$108:00) | 珀斯 | 此时区不遵守夏令时。 | 
| 中非西部标准时间 | (UTC\$101:00) | 中非西部 | 此时区不遵守夏令时。 | 
| 西欧标准时间 | (UTC\$101:00) | 阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳 |  | 
| 西蒙古标准时间 | (UTC\$107:00) | 科布多 |  | 
| 西亚标准时间 | (UTC\$105:00) | 阿什哈巴德，塔什干 | 此时区不遵守夏令时。 | 
| 西岸标准时间 | (UTC\$102:00) | 加沙，希伯伦 |  | 
| 西太平洋标准时间 | (UTC\$110:00) | 关岛，莫尔兹比港 | 此时区不遵守夏令时。 | 
| 雅库茨克标准时间 | (UTC\$109:00) | 雅库茨克 |  | 

# 授予 Amazon RDS 上 Microsoft SQL Server 的许可
<a name="SQLServer.Concepts.General.Licensing"></a>

在您设置 Microsoft SQL Server 的 Amazon RDS 数据库实例时，已包含软件许可证。

这意味着您无需单独购买 SQL Server 许可证。AWS拥有 SQL Server 数据库软件的许可证。Amazon RDS 定价包含软件许可证、底层硬件资源以及 Amazon RDS 管理功能。

Amazon RDS 支持以下 Microsoft SQL Server 版本：
+ 企业
+ 标准
+ Web
+ Express

**注意**  
SQL Server Web 版专为 Web 托管商和 Web VAP 而设计，用于托管公用和可通过互联网访问的网页、网站、Web 应用程序和 Web 服务。此级别的支持是符合 Microsoft 的使用权限所必需的。有关更多信息，请参阅 [AWS 服务条款](https://aws.amazon.com/serviceterms)。

Amazon RDS 通过使用 SQL Server 数据库镜像（DBM）、Always On 可用性组（AG）和 SQL Server Web 版的块级别复制，支持为运行 Microsoft SQL Server 的数据库实例进行多可用区部署。多可用区部署没有额外的许可要求。有关更多信息，请参阅“[Amazon RDS for Microsoft SQL Server 多可用区部署](USER_SQLServerMultiAZ.md)”。

## 还原许可证终止的数据库实例
<a name="SQLServer.Concepts.General.Licensing.Restoring"></a>

Amazon RDS 拍摄许可证终止的数据库实例的快照。如果实例因许可问题而终止，可以从快照将它还原为新的数据库实例。新的数据库实例已包含许可证。

有关更多信息，请参阅“[还原 Amazon RDS for SQL Server 的许可证终止的数据库实例](Appendix.SQLServer.CommonDBATasks.RestoreLTI.md)”。

## 开发和测试
<a name="SQLServer.Concepts.General.Licensing.Development"></a>

对于开发和测试场景，您可以使用 Express 版本来满足很多开发、测试及其他非生产需求。您还可以使用 Developer 版本，该版本包含 SQL Server 企业版的所有功能，但仅授权用于非生产用途。您可以在 RDS for SQL Server 上下载并安装 SQL Server Developer 版。有关更多信息，请参阅[在 RDS for SQL Server 上使用 SQL Server 开发人员版](sqlserver-dev-edition.md)，并结合使用自定义引擎版本（CEV）和自带媒体（BYOM）。您还可以使用同一方法，在 RDS Custom for SQL Server 上下载并安装 SQL Server Developer 版。有关更多信息，请参阅 [使用自带媒体（BYOM）准备 CEV](custom-cev-sqlserver.preparing.md#custom-cev-sqlserver.preparing.byom)。有关 SQL Server 版本之间的差异的更多信息，请参阅 Microsoft 文档中的 [SQL Server 2019 的版本和支持的功能](https://learn.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver15)。

# 连接到 Microsoft SQL Server 数据库实例
<a name="USER_ConnectToMicrosoftSQLServerInstance"></a>

在 Amazon RDS 配置数据库实例后，您可以使用任何标准 SQL 客户端应用程序连接到该数据库实例。在本主题中，您将使用 Microsoft SQL Server Management Studio (SSMS) 或 SQL Workbench/J 连接到数据库实例。

有关指导您完成创建和连接到示例数据库实例的示例，请参阅 [创建 Microsoft SQL Server 数据库实例并连接到该实例](CHAP_GettingStarted.CreatingConnecting.SQLServer.md)。

## 连接之前
<a name="sqlserver-before-connect"></a>

在连接到数据库实例之前，它必须是可用且可访问的。

1. 确保其状态为`available`。您可以通过 AWS 管理控制台 或使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) AWS CLI 命令查看实例详细信息页面上的相关内容。  
![\[检查数据库实例是否可用\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/sqlserver-available.png)

1. 请确保您的源可以访问该实例。根据您的情况，该实例可能不需要能够公开访问。有关更多信息，请参阅 [Amazon VPC 和 Amazon RDS](USER_VPC.md)。

1. 确保 VPC 安全组的入站规则允许访问您的数据库实例。有关更多信息，请参阅“[无法连接到 Amazon RDS 数据库实例](CHAP_Troubleshooting.md#CHAP_Troubleshooting.Connecting)”。

## 查找数据库实例端点和端口号
<a name="sqlserver-endpoint"></a>

您需要端点和端口号才能连接到数据库实例。

**如需查找端点和端口**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 Amazon RDS 控制台的右上角，选择数据库实例的AWS区域。

1. 找到数据库实例的域名系统（DNS）名称（端点）和端口号：

   1. 打开 RDS 控制台，然后选择 **Databases (数据库)**，以显示数据库实例的列表。

   1. 选择 SQL Server 数据库实例名称以显示其详细信息。

   1. 在**连接和安全性**选项卡上，复制端点。  
![\[找到该数据库实例的端点和端口\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQL-Connect-Endpoint.png)

   1. 请注意端口号。

# 使用 Microsoft SQL Server Management Studio 连接到数据库实例
<a name="USER_ConnectToMicrosoftSQLServerInstance.SSMS"></a>

在此过程中，您将使用 Microsoft SQL Server Management Studio (SSMS) 连接示例数据库实例。要下载此实用工具的独立版本，请参阅 Microsoft 文档了解[下载中心 SQL Server Management Studio (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms)。

**使用 SSMS 连接数据库实例**

1. 启动 SQL Server Management Studio。

   显示**连接至服务器**对话框。  
![\["Connect to Server" 对话框\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/RDSMSFTSQLConnect01.png)

1. 为数据库实例提供信息：

   1. 对于 **Server type**，选择 **Database Engine**。

   1. 对于 **Server name (服务器名称)**，输入数据库实例的 DNS 名称（端点）和端口号，并用逗号隔开。
**重要**  
将端点和端口号之间的冒号更改为逗号。

      您的服务器名称应类似于以下示例：

      ```
      database-2.cg034itsfake.us-east-1.rds.amazonaws.com,1433
      ```

   1. 对于 **Authentication**，选择 **SQL Server Authentication**。

   1. 对于 **Login (登录名)**，输入数据库实例的主用户名。

   1. 对于 **Password (密码)**，输入数据库实例的密码。

1. 选择 **Connect**。

   稍等几分钟后，SSMS 将连接到数据库实例。

   如果您无法连接到数据库实例，请参阅 [安全组注意事项](USER_ConnectToMicrosoftSQLServerInstance.Security.md) 和 [排除与 SQL Server 数据库实例的连接故障](USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting.md)。

1. 您的 SQL Server 数据库实例附带 SQL Server 的标准内置系统数据库（`master`、`model`、`msdb` 和 `tempdb`）。要了解系统数据库，请执行以下操作：

   1. 在 SSMS 的 **View** 菜单上，选择 **Object Explorer**。

   1. 依次展开数据库实例、**数据库**和**系统数据库**。  
![\[Object Explorer 中显示系统数据库\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQL-SSMS-SystemDBs.png)

1. 您的 SQL Server 数据库实例还附带一个名为 `rdsadmin` 的数据库。Amazon RDS 使用此数据库存储它用于管理您的数据库的对象。`rdsadmin` 数据库还包括存储过程，您可以运行它们来执行高级任务。有关更多信息，请参阅“[Amazon RDS for Microsoft SQL Server 的常见 DBA 任务](Appendix.SQLServer.CommonDBATasks.md)”。

1. 您现在可以开始创建您自己的数据库并像往常一样对数据库实例和数据库运行查询。要对数据库实例运行测试查询，请执行以下操作：

   1. 在 SSMS 中，在 **File** 菜单上，指向 **New**，然后选择 **Query with Current Connection**。

   1. 输入以下 SQL 查询。

      ```
      select @@VERSION
      ```

   1. 运行查询。SSMS 会返回 SQL Server 版的 Amazon RDS 数据库实例。  
![\["SQL Query" 窗口\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQL-Connect-Query.png)

# 使用 SQL Workbench/J 连接到数据库实例
<a name="USER_ConnectToMicrosoftSQLServerInstance.JDBC"></a>

此示例说明如何使用 SQL Workbench/J 数据库工具连接到运行 Microsoft SQL Server 数据库引擎的数据库实例。要下载 SQL Workbench/J，请参阅 [SQL Workbench/J](http://www.sql-workbench.net/)。

SQL Workbench/J 使用 JDBC 连接到数据库实例。您还需要 JDBC driver for SQL Server。要下载此驱动程序，请参阅[下载 Microsoft SQL Server JDBC 驱动程序](https://learn.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver16)。

**使用 SQL Workbench/J 连接到数据库实例**

1. 打开 SQL Workbench/J。系统将显示 **Select Connection Profile (选择连接配置文件)** 对话框，如下所示。  
![\[“选择连接配置文件”对话框\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/workbench_profile.png)

1. 在该对话框顶部的第一个框中，输入配置文件的名称。

1. 对于 **Driver (驱动程序)**，请选择 **SQL JDBC 4.0**。

1. 对于 **URL**，输入 **jdbc:sqlserver://**，然后输入您的数据库实例的端点。例如，可以使用以下 URL 值。

   ```
   jdbc:sqlserver://sqlsvr-pdz.abcd12340.us-west-2.rds.amazonaws.com:1433
   ```

1. 对于 **Username (用户名)**，输入或粘贴数据库实例的主用户名。

1. 对于 **Password (密码)**，输入主用户的密码。

1. 选择对话框工具栏中的保存图标，如下所示。  
![\[保存配置文件\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/save_example.png)

1. 选择 **OK**。稍等几分钟后，SQL Workbench/J 将连接到数据库实例。如果您无法连接到数据库实例，请参阅 [安全组注意事项](USER_ConnectToMicrosoftSQLServerInstance.Security.md) 和 [排除与 SQL Server 数据库实例的连接故障](USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting.md)。

1. 在查询窗格中，输入以下 SQL 查询。

   ```
   select @@VERSION
   ```

1. 选择工具栏中的 `Execute` 图标，如下所示。  
![\[运行查询\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/execute_example.png)

   查询将返回数据库实例的版本信息，类似于以下内容。

   ```
   Microsoft SQL Server 2017 (RTM-CU22) (KB4577467) - 14.0.3356.20 (X64)
   ```

# 安全组注意事项
<a name="USER_ConnectToMicrosoftSQLServerInstance.Security"></a>

要连接到数据库实例，您的数据库实例必须与安全组关联。此安全组包含用于访问数据库实例的 IP 地址和网络配置。您可以在创建数据库实例时，将其与适当的安全组相关联。如果在创建数据库实例时分配了一个默认的未配置安全组，则数据库实例防火墙将阻止连接。

在某些情况下，您可能需要创建新的安全组以实现访问。有关创建新安全组的说明，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。有关指导您完成 VPC 安全组规则设置过程的主题，请参阅[教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)。

在创建新安全组后，需要修改数据库实例以使其与该安全组关联。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

可通过使用 SSL 加密与数据库实例的连接来增强安全性。有关更多信息，请参阅 [将 SSL 与 Microsoft SQL Server 数据库实例结合使用](SQLServer.Concepts.General.SSL.Using.md)。

# 排除与 SQL Server 数据库实例的连接故障
<a name="USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting"></a>

下表显示了尝试连接到 SQL Server 数据库实例时可能会遇到的错误消息。


****  
<a name="rds-sql-server-connection-troubleshooting-guidance"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting.html)

**注意**  
有关连接问题的更多信息，请参阅[无法连接到 Amazon RDS 数据库实例](CHAP_Troubleshooting.md#CHAP_Troubleshooting.Connecting)。

# 在 RDS for SQL Server 上使用 SQL Server 开发人员版
<a name="sqlserver-dev-edition"></a>

RDS for SQL Server 支持 SQL Server 开发人员版。开发人员版包含 SQL Server 企业版的所有功能，但仅许可用于非生产用途。您可以通过自定义引擎版本（CEV）功能，使用您自己的安装媒体创建 RDS for SQL Server 开发人员版实例。

## 优势
<a name="sqlserver-dev-edition.benefits"></a>

您可以使用 RDS for SQL Server 开发人员版来实现：
+ 降低开发和测试环境的成本，同时保持与生产数据库的功能对等性。
+ 无需支付企业许可费用，即可在非生产环境中访问企业版功能。
+ 使用 Amazon RDS 自动管理功能，包括备份、修补和监控。

**注意**  
SQL Server 开发人员版仅许可用于开发和测试目的，而不能在生产环境中使用。

## 区域可用性
<a name="sqlserver-dev-edition.regions"></a>

RDS for SQL Server 开发人员版在以下 AWS 区域推出：
+ 美国东部（弗吉尼亚州北部）
+ 美国东部（俄亥俄州）
+ 美国西部（俄勒冈州）
+ 美国西部（北加利福尼亚）
+ 亚太地区（孟买）
+ 亚太地区（首尔）
+ 亚太地区（新加坡）
+ 亚太地区（大阪）
+ 亚太地区（悉尼）
+ 亚太地区（东京）
+ 欧洲地区（爱尔兰）
+ 欧洲地区（法兰克福）
+ 欧洲地区（伦敦）
+ 欧洲地区（斯德哥尔摩）
+ 欧洲地区（巴黎）
+ 加拿大（中部）
+ 南美洲（圣保罗）
+ 非洲（开普敦）

## 许可和使用
<a name="sqlserver-dev-edition.licensing"></a>

SQL Server 开发人员版由 Microsoft 许可，仅适用于开发和测试环境。您不能将开发人员版用作生产服务器。当您在 Amazon RDS 上使用 SQL Server 开发人员版时，您有责任遵守 Microsoft 的 SQL Server 开发人员版许可条款。您只需为 AWS 基础设施成本付费，而无需支付额外的 SQL Server 许可费。有关定价详细信息，请参阅 [RDS for SQL Server pricing](https://aws.amazon.com/rds/sqlserver/pricing/)。

## 先决条件
<a name="sqlserver-dev-edition.prerequisites"></a>

在 RDS for SQL Server 上使用 SQL Server 开发人员版之前，请确保您已满足以下要求：
+ 您必须直接从 Microsoft 获取安装二进制文件，并确保遵守 Microsoft 的许可条款。
+ 您必须具有访问权限，以使用以下资源来创建开发人员版数据库实例：
  + 拥有 `AmazonRDSFullAccess` 和 `s3:GetObject` 权限的 AWS 账户。
+ 存储安装媒体需要 Amazon S3 存储桶。在创建 CEV 的过程中，您需要将 ISO 和累积更新文件上传到 Amazon S3 存储桶。有关更多信息，请参阅[将安装媒体上传到 Amazon S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。
+ 所有安装媒体文件都必须位于同一 Amazon S3 存储桶中，并且在创建自定义引擎版本的同一区域中，必须位于该 Amazon S3 存储桶内的相同文件夹路径中。

### 支持的版本
<a name="sqlserver-dev-edition.supported-versions"></a>

RDS for SQL Server 上的开发人员版支持以下版本：
+ SQL Server 2022 CU 21（16.00.4215.2）
+ SQL Server 2019 CU 32 GDR（15.00.4455.2）

要列出开发人员版 CEV 创建所支持的所有引擎版本，请使用以下 AWS CLI 命令：

```
aws rds describe-db-engine-versions --engine sqlserver-dev-ee --output json --query "{DBEngineVersions: DBEngineVersions[?Status=='requires-custom-engine-version'].{Engine: Engine, EngineVersion: EngineVersion, Status: Status, DBEngineVersionDescription: DBEngineVersionDescription}}"
```

此命令将返回类似于以下示例的输出：

```
{
    "DBEngineVersions": [
        {
            "Engine": "sqlserver-dev-ee",
            "EngineVersion": "16.00.4215.2.v1",
            "Status": "requires-custom-engine-version",
            "DBEngineDescription": "Microsoft SQL Server Enterprise Developer Edition",
            "DBEngineVersionDescription": "SQL Server 2022 16.00.4215.2.v1"
        }
    ]
}
```

引擎版本状态为 `requires_custom_engine_version` 标识支持的模板引擎版本。这些模板显示您可以导入哪些 SQL Server 版本。

## 限制
<a name="sqlserver-dev-edition.limitations"></a>

以下限制适用于 Amazon RDS 上的 SQL Server 开发人员版：
+ 目前仅在 M6i 和 R6i 实例类上才支持。
+ 不支持多可用区部署和只读副本。
+ 您必须提供并管理自己的 SQL Server 安装媒体。
+ SQL Server 开发人员版（sqlserver-dev-ee）的自定义引擎版本不能跨区域或跨账户共享。

# 准备适用于 RDS for SQL Server 的 CEV
<a name="sqlserver-dev-edition.preparing"></a>

## 先决条件
<a name="sqlserver-dev-prerequisites"></a>

在创建自定义引擎版本之前，请确保您已完成以下先决条件：

### 准备 SQL Server 开发人员版安装媒体
<a name="sqlserver-dev-prepare-media"></a>

您必须从 Microsoft 获取 SQL Server 开发人员版安装媒体，并准备将其上传到 S3。

**从 Microsoft 下载安装媒体**

1. **选项 A：**使用您的 [Visual Studio 订阅](https://visualstudio.microsoft.com/subscriptions/)下载开发人员版 ISO。仅支持英文版本。

1. **选项 B：使用 SQL Server 安装程序**

   1. 下载 [SQL Server 开发人员版安装程序](https://download.microsoft.com/download/c/c/9/cc9c6797-383c-4b24-8920-dc057c1de9d3/SQL2022-SSEI-Dev.exe)。

   1. 运行安装程序并选择**下载媒体**以下载完整版 ISO。

   1. 选择**英语**作为首选语言。

   1. 选择 **ISO** 作为媒体类型。

   1. 选择**下载**。

**下载累积更新**

1. 访问 [Microsoft Catalog Update](https://www.catalog.update.microsoft.com/Home.aspx) 页面。

1. 查找 RDS for SQL Server 支持的 SQL Server 开发人员版，例如“SQL Server 2022 年累积更新”。

1. 下载最新支持的 CU 可执行文件并将其保存到您的计算机上。

1. 示例文件：`SQLServer2022-KB5065865-x64.exe`（适用于 SQL Server 2022 的 CU21）

**重要**  
RDS for SQL Server 仅支持特定的累积更新（CU）版本。您必须使用下表中列出的确切版本。即使 Microsoft 提供较新的 CU 版本，也不要使用这些版本，因为它们可能与 RDS 不兼容。

或者，您也可以直接从以下位置下载所需的累积更新（CU）文件：

下表列出了支持的 SQL Server 开发人员版本及其相应的要与 RDS 结合使用的累积更新：


| SQL Server 版本 | 支持的 CU | 知识库文章 | 下载文件名 | 
| --- | --- | --- | --- | 
|  SQL Server 2022  |  `CU21`  |  [KB5065865](https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2022/cumulativeupdate21)  |  `SQLServer2022-KB5065865-x64.exe`  | 
|  SQL Server 2019  |  `CU32 GDR`  |  [KB5068404](https://support.microsoft.com/en-us/topic/kb5068404-description-of-the-security-update-for-sql-server-2019-cu32-november-11-2025-c203bfbf-036e-46d2-bc10-6c01200dc48a)  |  `SQLServer2019-KB5068404-x64.exe`  | 

# 创建适用于 RDS for SQL Server 的自定义引擎版本
<a name="sqlserver-dev-edition.creating-cev"></a>

适用于 RDS for SQL Server 的自定义引擎版本（CEV）由导入到 Amazon RDS 的 SQL Server 开发人员版安装媒体组成。需要将基本 ISO 安装程序和累积更新文件（.exe）上传到您的 Amazon S3 存储桶。上传后，您应向 RDS 提供 Amazon S3 位置，以便其下载、验证以及随后创建您的 CEV。

## 命名限制
<a name="sqlserver-dev-edition.create-cev.naming-limitations"></a>

创建 CEV 时，必须遵循特定的命名约定：
+ CEV 名称必须遵循模式 `major-version.minor-version.customized-string`。
+ `customized-string` 可以包含 1–50 个字母数字字符、下划线、短划线和句点。例如：对于 SQL Server 2022，为 `16.00.4215.2.my-dev-cev`。

要列出所有支持的引擎版本，请使用以下命令：

```
aws rds describe-db-engine-versions --engine sqlserver-dev-ee --output json --query "{DBEngineVersions: DBEngineVersions[?Status=='requires-custom-engine-version'].{Engine: Engine, EngineVersion: EngineVersion, Status: Status, DBEngineVersionDescription: DBEngineVersionDescription}}" 

{
    "DBEngineVersions": [
        {
            "Engine": "sqlserver-dev-ee",
            "EngineVersion": "16.00.4215.2.v1",
            "Status": "requires-custom-engine-version",
            "DBEngineDescription": "Microsoft SQL Server Enterprise Developer Edition",
            "DBEngineVersionDescription": "SQL Server 2022 16.00.4215.2.v1"
        }
    ]
}
```

## AWS CLI
<a name="sqlserver-dev-edition.create-cev.CLI"></a>

**创建自定义引擎版本**
+ 使用 [create-custom-db-engine-version](https://docs.aws.amazon.com/cli/latest/reference/rds/create-custom-db-engine-version.html) 命令。

  以下选项为必填：
  + `--engine`
  + `--engine-version`
  + `--database-installation-files-s3-bucket-name`
  + `--database-installation-files`
  + `--region`

  您还可以指定以下选项：
  + `--database-installation-files-s3-prefix`
  + `--description`
  + `--tags`

  ```
  aws rds create-custom-db-engine-version \
  --engine sqlserver-dev-ee \
  --engine-version 16.00.4215.2.cev-dev-ss2022-cu21 \
  --region us-west-2 \
  --database-installation-files-s3-bucket-name my-s3-installation-media-bucket \
  --database-installation-files-s3-prefix sqlserver-dev-media \
  --database-installation-files "SQLServer2022-x64-ENU-Dev.iso" "SQLServer2022-KB5065865-x64.exe"
  ```

创建 CEV 通常需要 15-30 分钟。要监控 CEV 创建进度，请使用以下命令：

```
# Check CEV status
aws rds describe-db-engine-versions \
--engine sqlserver-dev-ee \
--engine-version 16.00.4215.2.my-dev-cev \
--region us-west-2
```

## RDS for SQL Server CEV 的生命周期
<a name="sqlserver-dev-cev-lifecycle"></a>

在 RDS for SQL Server 上使用 SQL Server 开发人员版时，自定义引擎版本会经历不同的生命周期状态。


| 生命周期状态 | 说明 | 何时出现 | 可用操作 | 
| --- | --- | --- | --- | 
|  pending-validation  |  创建 CEV 时的初始状态  |  这是使用 `create-custom-db-engine-version` 命令创建后的初始状态。  |  通过 `describe-db-engine-version` 监控状态。  | 
|  正在验证  |  CEV 验证状态  |  Amazon RDS 正在验证您的自定义引擎版本（CEV）。这个异步过程可能需要一些时间才能完成。  |  监控状态，直到验证完成。  | 
|  available  |  自定义引擎版本（CEV）验证成功完成。  |  自定义引擎版本（CEV）现已可用。Amazon RDS 成功验证了您的 SQL Server ISO 和累积更新文件。您现在可以使用此 CEV 创建数据库实例。  |  使用此 CEV 创建数据库实例  | 
|  已失败  |  由于验证检查失败，RDS for SQL Server 无法创建自定义引擎版本（CEV）。  |  ISO 和累积媒体验证失败。   |  ISO 验证失败。在 `describe-db-engine-version` 中检查失败原因，修复任何文件问题，例如哈希不匹配或内容损坏，然后重新创建自定义引擎版本（CEV）。  | 
|  删除  |  正在删除自定义引擎版本（CEV）  |  在客户调用 `delete-custom-db-engine-version` 之后，直到删除工作流程完成。  |  通过 `describe-db-engine-version` 监控状态。  | 
|  incompatible-installation-media  |  Amazon RDS 无法验证为自定义引擎版本（CEV）提供的安装媒体  |  自定义引擎版本（CEV）验证失败。这是最终状态。  |  有关验证失败原因的信息，请通过 `describe-db-engine-versions` 参阅 failureReason；删除 CEV。  | 

### 描述 CEV 状态
<a name="sqlserver-dev-cev-status-check"></a>

您可以使用 AWS CLI 查看 CEV 的状态。

```
1. aws rds describe-db-engine-versions \
2. --engine sqlserver-dev-ee \
3. --engine-version 16.00.4215.2.my-dev-cev \
4. --region us-west-2 \
5. --query 'DBEngineVersions[0].{Version:EngineVersion,Status:Status}'
```

示例输出

```
| DescribeDBEngineVersions                     |
+------------+---------------------------------+
| Status | Version                             |
+------------+---------------------------------+
| available | 16.00.4215.2.cev-dev-ss2022-cu21    |
+------------+---------------------------------+
```

当 CEV 显示 `failed` 状态时，您可以使用以下命令确定原因：

```
1. aws rds describe-db-engine-versions \
2. --engine sqlserver-dev-ee \
3. --engine-version 16.00.4215.2.my-dev-cev \
4. --region us-west-2 \
5. --query 'DBEngineVersions[0].{Version:EngineVersion,Status:Status,FailureReason:FailureReason}'
```

# 创建 RDS for SQL Server 开发人员版数据库实例
<a name="sqlserver-dev-edition.creating-instance"></a>

在 RDS for SQL Server 上启动开发人员版实例的过程分为两步：首先使用 `create-custom-db-engine-version` 创建 CEV，一旦自定义引擎版本处于可用状态，即可使用 CEV 创建 Amazon RDS 数据库实例。

**开发人员版实例创建的主要区别**


| 参数 | 开发人员版本 | 
| --- | --- | 
|  `--engine`  |  sqlserver-dev-ee  | 
|  `--engine-version`  |  自定义引擎版本（例如，16.00.4215.2.cev-dev-ss2022-cu21）  | 
|  `--license-model`  |  自带许可  | 

## AWS CLI
<a name="sqlserver-dev-edition.creating-instance.CLI"></a>

要创建 SQL Server 开发人员版数据库实例，请使用以下参数调用 [create-db-instance](https://docs.aws.amazon.com//cli/latest/reference/rds/create-db-instance.html) 命令：

以下选项为必填：
+ `--db-instance-identifier` 
+ `--db-instance-class` 
+ `--engine` – `sqlserver-dev-ee`
+ `--region`

**示例：**

对于 Linux、macOS 或 Unix：

```
aws rds create-db-instance \
--db-instance-identifier my-dev-sqlserver \
--db-instance-class db.m6i.xlarge \
--engine sqlserver-dev-ee \
--engine-version 16.00.4215.2.my-dev-cev \
--allocated-storage 200 \
--master-username admin \
--master-user-password changeThisPassword \
--license-model bring-your-own-license \
--no-multi-az \
--vpc-security-group-ids sg-xxxxxxxxx \
--db-subnet-group-name my-db-subnet-group \
--backup-retention-period 7 \
--region us-west-2
```

对于 Windows：

```
aws rds create-db-instance ^
--db-instance-identifier my-dev-sqlserver ^
--db-instance-class db.m6i.xlarge ^
--engine sqlserver-dev-ee ^
--engine-version 16.00.4215.2.cev-dev-ss2022-cu21 ^
--allocated-storage 200 ^
--master-username admin ^
--master-user-password master_user_password ^
--license-model bring-your-own-license ^
--no-multi-az ^
--vpc-security-group-ids sg-xxxxxxxxx ^
--db-subnet-group-name my-db-subnet-group ^
--backup-retention-period 7 ^
--region us-west-2
```

请参阅[创建数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html#USER_CreateDBInstance.Creating)，以便使用 AWS 控制台来创建实例。

# 应用数据库次要版本升级
<a name="sqlserver-dev-edition.minor-version-upgrades"></a>

RDS for SQL Server 开发人员版要求使用最新的累积更新来创建新的自定义引擎版本（CEV），才能应用数据库次要版本升级。SQL Server 开发人员版的数据库次要版本升级涉及以下步骤：

1. 在升级之前，验证实例上的当前引擎版本，从 Amazon RDS 支持的版本中确定目标数据库引擎版本。有关在 Amazon RDS 上可用的 SQL Server 版本的信息，请参阅 [在 RDS for SQL Server 上使用 SQL Server 开发人员版](sqlserver-dev-edition.md)。

1. 获取并上传安装媒体（ISO 和 CU），然后[创建新的自定义引擎版本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/sqlserver-dev-edition.creating-cev.html)。

1. 通过使用带有新 CEV 的 Amazon RDS [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) 来应用数据库次要版本升级。

   ```
   aws rds modify-db-instance \
   --db-instance-identifier <instance-id> \
   --engine-version <new-cev-version> \
   --no-apply-immediately ## use --apply-immediately for immediate update
   ```
**注意**  
使用 `--no-apply-immediately`（默认设置）可在下一个维护时段内应用更改。

# 查看和管理自定义引擎版本
<a name="sqlserver-dev-edition.managing"></a>

要查看所有 RDS for SQL Server 开发人员版 CEV，请使用 `describe-db-engine-versions` 命令，并将 `--engine` 输入设置为 `sqlserver-dev-ee`。

```
aws rds describe-db-engine-versions \
--engine sqlserver-dev-ee \
--include-all \
--region us-west-2
```

要查看特定 CEV 的详细信息，请使用以下命令：

```
aws rds describe-db-engine-versions \
--engine sqlserver-dev-ee \
--engine-version 16.00.4215.2.cev-dev-ss2022-cu21 \
--region us-west-2
```

**注意**  
此命令仅返回带有 `available` 状态的 CEV。要查看处于验证状态或其它状态的 CEV，请加入 `--include-all` 标志。

## 删除自定义引擎版本
<a name="sqlserver-dev-deleting-cevs"></a>

删除 CEV 之前，请确保它未被以下任何项目使用：
+ Amazon RDS 数据库实例
+ Amazon RDS 数据库实例的快照
+ Amazon RDS 数据库实例的自动备份

**注意**  
如果存在与 CEV 关联的任何资源，您无法删除它。

要删除自定义引擎版本，请使用 [delete-custom-db-engine-version](https://docs.aws.amazon.com//cli/latest/reference/rds/delete-custom-db-engine-version.html) 命令。
+ `--engine`：为开发人员版指定 `sqlserver-dev-ee`
+ `--engine-version`：要删除的确切 CEV 版本标识符
+ `--region`：CEV 位于其中的 AWS 区域

```
aws rds delete-custom-db-engine-version \
--engine sqlserver-dev-ee \
--engine-version 16.00.4215.2.my-dev-cev \
--region us-west-2
```

要监控 CEV 删除过程，请使用 `describe-db-engine-versions` 命令并指定 RDS for SQL Server CEV 引擎版本

```
aws rds describe-db-engine-versions \
--engine sqlserver-dev-ee \
--engine-version 16.00.4215.2.my-dev-cev \
--region us-west-2
```

状态值：
+ `deleting`：正在删除 CEV
+ 未返回任何结果：已成功删除 CEV

# 适用于 RDS for SQL Server 的 SQL Server 开发人员版故障排除
<a name="sqlserver-dev-edition.troubleshooting"></a>

下表列出了使用适用于 RDS for SQL Server 的 SQL Server 开发人员版时遇到的一些常见错误和相应的解决方案


**常见错误和解决方案**  

| 错误代码 | 说明 | 解决方案 | 
| --- | --- | --- | 
| InvalidParameterValue | CEV 参数或文件引用无效 | 验证文件名、路径和参数语法 | 
| DBSubnetGroupNotFound | 子网组不存在 | 创建子网组或验证名称 | 
| InvalidVPCNetworkState | VPC 配置问题 | 检查 VPC、子网和路由表 | 
| InvalidEngineVersion | CEV 不可用或无效 | 验证 CEV 状态和名称 | 
| InvalidDBInstanceClass | 不支持此实例类 | 选择支持的实例类 | 
| CustomDBEngineVersionQuotaExceededFault | 您已达到最大自定义引擎版本数 | 如果需要，可以增加服务配额，也可以根据需要删除未使用的 CEV | 
| CreateCustomDBEngineVersionFault | Amazon RDS 无法访问 Amazon S3 存储桶中的指定安装程序文件。 | Amazon RDS 无法访问指定 Amazon S3 位置中的 SQL Server 安装文件。在您的 Amazon S3 存储桶策略中向 Amazon RDS 服务主体（rds.amazonaws.com）授予 s3:GetObject 权限。验证 Amazon S3 存储桶区域与您要在其中创建 CEV 的区域相同。 | 

# 将 Active Directory 用于 RDS for SQL Server
<a name="User.SQLServer.ActiveDirectoryWindowsAuth"></a>

您可以将 RDS for SQL Server 数据库实例加入 Microsoft Active Directory（AD）域。您的 AD 域可以托管在 AWS 内的 AWS Managed AD 上，也可以托管在您所选位置（包括您的企业数据中心、AWS EC2 或其他云提供商）的自托管式 AD 上。

您可以使用自托管式 Active Directory 和 AWS Managed Microsoft AD，通过 NTLM 身份验证和 Kerberos 身份验证对域用户进行身份验证。

在以下各节中，您可以找到有关将自托管式 Active Directory 和 AWS Managed Active Directory 用于 Amazon RDS 上的 Microsoft SQL Server 的信息。

**Topics**
+ [将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例](USER_SQLServer_SelfManagedActiveDirectory.md)
+ [将 AWS Managed Active Directory 用于 RDS for SQL Server](USER_SQLServerWinAuth.md)

# 将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory"></a>

无论您的 AD 托管在数据中心、Amazon EC2 上还是其他云提供商处，Amazon RDS for SQL Server 都可与您的自托管式 Active Directory（AD）域无缝集成。这种集成支持通过 NTLM 或 Kerberos 协议直接进行用户身份验证，无需复杂的中间域或林信任。当您连接到 RDS SQL Server 数据库实例时，身份验证请求会安全地转发到您指定的 AD 域，从而在利用 Amazon RDS 托管数据库功能的同时保持现有的身份管理结构。

**Topics**
+ [区域和版本可用性](#USER_SQLServer_SelfManagedActiveDirectory.RegionVersionAvailability)
+ [要求](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md)
+ [注意事项](#USER_SQLServer_SelfManagedActiveDirectory.Limitations)
+ [设置自托管式 Active Directory](USER_SQLServer_SelfManagedActiveDirectory.SettingUp.md)
+ [将数据库实例加入自托管式 Active Directory](USER_SQLServer_SelfManagedActiveDirectory.Joining.md)
+ [在自托管式 Active Directory 域中管理数据库实例](USER_SQLServer_SelfManagedActiveDirectory.Managing.md)
+ [了解自托管式 Active Directory 域成员资格](#USER_SQLServer_SelfManagedActiveDirectory.Understanding)
+ [自托管式 Active Directory 问题排查](USER_SQLServer_SelfManagedActiveDirectory.TroubleshootingSelfManagedActiveDirectory.md)
+ [还原 SQL Server 数据库实例，然后将其添加到自托管式 Active Directory 域](#USER_SQLServer_SelfManagedActiveDirectory.Restore)

## 区域和版本可用性
<a name="USER_SQLServer_SelfManagedActiveDirectory.RegionVersionAvailability"></a>

Amazon RDS 在所有商业 AWS 区域和 AWS GovCloud (US) Regions中都支持通过自托管式 AD 使用 NTLM 控制 SQL Server 的身份验证。

# 要求
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements"></a>

在将 RDS for SQL Server 数据库实例加入自托管式 AD 域之前，请确保您已满足以下要求。

**Topics**
+ [配置您的本地 AD](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.OnPremConfig)
+ [配置您的网络连接](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)
+ [配置您的 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)
+ [通过 LDAPS 配置安全通信](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.LDAPS)

## 配置您的本地 AD
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.OnPremConfig"></a>

确保您有一个本地或其他自托管式 Microsoft AD，您可以在其中加入 Amazon RDS for SQL Server 实例。您的本地 AD 应具有以下配置：
+ 如果您定义了 AD 站点，请确保在 AD 站点中定义与 RDS for SQL Server 数据库实例关联的 VPC 中的子网。确认您的 VPC 中的子网与您其他 AD 站点中的子网之间没有任何冲突。
+ 您 AD 域控制器的域功能级别为 Windows Server 2008 R2 或更高版本。
+ 您的 AD 域名不能采用单标签域（SLD）格式。RDS for SQL Server 不支持 SLD 域。
+ AD 的完全限定域名（FQDN）不能超过 47 个字符。

## 配置您的网络连接
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig"></a>

确保您满足以下网络配置：
+ 在您要在其中创建 RDS for SQL Server 数据库实例的 Amazon VPC 与自托管式 AD 之间配置了连接。您可以使用 AWS Direct Connect、AWS VPN、VPC 对等或 AWS Transit Gateway 设置连接。
+ 对于 VPC 安全组，原定设置 Amazon VPC 的原定设置安全组已添加到控制台中的 RDS for SQL Server 数据库实例。确保要在其中创建 RDS for SQL Server 数据库实例的子网的安全组和 VPC 网络 ACL 在端口上允许有下图所示方向的流量。  
![\[自托管式 AD 网络配置端口规则。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQLServer_SelfManagedActiveDirectory_Requirements_NetworkConfig.png)

  下表确定了每个端口的作用。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_SQLServer_SelfManagedActiveDirectory.Requirements.html)
+ 通常，域 DNS 服务器位于 AD 域控制器中。您无需配置 VPC DHCP 选项集即可使用此功能。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。

**重要**  
如果您使用的是 VPC 网络 ACL，则还必须允许动态端口（49152-65535）上有来自 RDS for SQL Server 数据库实例的出站流量。确保这些流量规则也镜像到适用于每个 AD 域控制器、DNS 服务器和 RDS for SQL Server 数据库实例的防火墙上。  
虽然 VPC 安全组要求仅在发起网络流量的方向打开端口，但大多数 Windows 防火墙和 VPC 网络 ACL 要求双向打开端口。

## 配置您的 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig"></a>

确保您的 AD 域服务账户满足以下要求：
+ 确保您在自托管式 AD 域中有一个域服务账户，该账户具有将计算机加入该域的委派权限。域服务账户是您的自托管式 AD 中的一个用户账户，该账户已被委派执行某些任务的权限。
+ 需要在您要加入 RDS for SQL Server 数据库实例的组织单位（OU）中向域服务账户委派以下权限：
  + 验证写入 DNS 主机名的能力
  + 验证写入服务主体名称的能力
  + 创建和删除计算机对象

  这些权限代表将计算机对象加入到自托管式 AD 至少需要具备的一组权限。有关更多信息，请参阅 Microsoft Windows Server 文档中的[尝试将计算机加入域时出现错误](https://learn.microsoft.com/en-US/troubleshoot/windows-server/identity/access-denied-when-joining-computers)。
+ 要使用 Kerberos 身份验证，您需要向 AD 域服务账户提供服务主体名称（SPN）和 DNS 权限：
  + **写入 SPN**：将**写入 SPN** 权限委托给需要加入 RDS for SQL Server 数据库实例的 OU 中的 AD 域服务账户。此权限与经过验证的写入 SPN 不同。
  + **DNS 权限**：在域控制器的服务器级 DNS 管理器中，为 AD 域服务账户提供以下权限：
    + 列出内容
    + 读取所有属性
    + 读取权限

**重要**  
创建数据库实例后，请勿移动 RDS for SQL Server 在组织单位中创建的计算机对象。移动关联对象将导致您的 RDS for SQL Server 数据库实例出现配置错误。如果您需要移动 Amazon RDS 创建的计算机对象，请通过 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作用计算机对象所需位置修改域参数。

## 通过 LDAPS 配置安全通信
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.LDAPS"></a>

建议通过 LDAPS 进行通信，让 RDS 查询和访问域控制器中的计算机对象以及 SPN。要使用安全 LDAP，请在域控制器上使用符合安全 LDAPS 要求的有效 SSL 证书。如果域控制器上不存在有效的 SSL 证书，则 RDS for SQL Server 数据库实例将默认为使用 LDAP。有关证书有效性的更多信息，请参阅 [LDAPS 证书的要求](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-over-ssl-3rd-certification-authority#requirements-for-an-ldaps-certificate)。

## 注意事项
<a name="USER_SQLServer_SelfManagedActiveDirectory.Limitations"></a>

将 RDS for SQL Server 数据库实例添加到自托管式 AD 时，请注意以下几点：
+ 您的数据库实例与 AWS 的 NTP 服务同步，而不是与 AD 域的时间服务器同步。对于 AD 域内链接 SQL Server 实例之间的数据库连接，您只能进行 SQL 身份验证，而不能进行 Windows 身份验证。
+ 来自自托管式 AD 域的组策略对象设置不会传播到 RDS for SQL Server 实例。

# 设置自托管式 Active Directory
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp"></a>

要设置自托管式 AD，请执行以下步骤。

**Topics**
+ [步骤 1：在 AD 中创建组织单位](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateOU)
+ [步骤 2：在您的 AD 中创建 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateADuser)
+ [步骤 3：将控制权委派给 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.DelegateControl)
+ [步骤 4：创建 AWS KMS 密钥](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateKMSkey)
+ [步骤 5：创建 AWS 密钥](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateSecret)

## 步骤 1：在 AD 中创建组织单位
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateOU"></a>

**重要**  
 我们建议为任何拥有已加入您自托管式 AD 域的 RDS for SQL Server 数据库实例的 AWS 账户创建专用 OU 以及作用域为该 OU 的服务凭证。通过专用 OU 和服务凭证，您可以避免权限冲突并遵循最低权限原则。

**在 AD 中创建 OU**

1. 以域管理员身份连接到您的 AD 域。

1. 打开 **Active Directory 用户和计算机**，然后选择要在其中创建 OU 的域。

1. 右键单击该域并选择**新建**，然后选择**组织单位**。

1. 为 OU 输入名称。

1. 选中**保护容器免遭意外删除**复选框。

1. 单击**确定**。您的新 OU 将出现在您的域下。

## 步骤 2：在您的 AD 中创建 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateADuser"></a>

域服务账户凭证将用于 AWS Secrets Manager 中的密钥。

**在 AD 中创建 AD 域服务账户**

1. 打开 **Active Directory 用户和计算机**，然后选择要在其中创建用户的域和 OU。

1. 右键单击**用户**对象并选择**新建**，然后选择**用户**。

1. 输入用户的名字、姓氏和登录名。单击**下一步**。

1. 输入用户的密码。请勿选择**“用户下次登录时必须更改密码”**。请勿选择**“账户已禁用”**。单击**下一步**。

1. 单击**确定**。您的新用户将出现在您的域下。

## 步骤 3：将控制权委派给 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.DelegateControl"></a>

**将控制权委派给域中的 AD 域服务账户**

1. 打开 **Active Directory 用户和计算机** MMC 管理单元，然后选择要在其中创建用户的域。

1. 右键单击您之前创建的 OU，然后选择**委派控制权**。

1. 在**委派控制权向导**页面上，单击**下一步**。

1. 在**用户或组**部分，单击**添加**。

1. 在**选择用户、计算机或组**部分，输入您创建的 AD 域服务账户，然后单击**检查名称**。如果您的 AD 域服务账户检查成功，请单击**确定**。

1. 在**用户或组**部分，确认您的 AD 域服务账户已添加，然后单击**下一步**。

1. 在**要委派的任务**部分，选择**创建要委派的自定义任务**，然后选择**下一步**。

1. 在 **Active Directory 对象类型**部分：

   1. 选择**仅文件夹中的以下对象**。

   1. 选择**计算机对象**。

   1. 选择**在此文件夹中创建选定对象**。

   1. 选择**删除此文件夹中的选定对象**，然后单击**下一步**。

1. 在**权限**部分：

   1. 将**常规**保持为选中状态。

   1. 选择**已验证写入 DNS 主机名**。

   1. 选择**已验证写入服务主体名称**，然后单击**下一步**。

   1. 要启用 Kerberos 身份验证，请选中**特定于属性**，然后从列表中选择**写入 servicePrincipalName**。

1. 对于**完成控制权委派向导**，请检查并确认您的设置，然后单击**完成**。

1. 要进行 Kerberos 身份验证，请打开 DNS 管理器并打开**服务器**属性。

   1. 在 Windows 对话框中，输入 `dnsmgmt.msc`。

   1. 在**安全**选项卡下添加 AD 域服务账户。

   1. 选择**读取**权限并应用您的更改。

## 步骤 4：创建 AWS KMS 密钥
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateKMSkey"></a>

KMS 密钥用于加密您的 AWS 密钥。

**要创建 AWS KMS 密钥**
**注意**  
 对于**加密密钥**，请勿使用 AWS 原定设置 KMS 密钥。确保在包含要加入自托管式 AD 的 RDS for SQL Server 数据库实例的 AWS 账户中创建 AWS KMS 密钥。

1. 在 AWS KMS 控制台中，选择**创建密钥**。

1. 对于**密钥类型**，选择**对称**。

1. 对于**密钥用法**，选择**加密和解密**。

1. 对于 **Advanced options (高级选项)**：

   1. 对于**密钥材料源**，选择 **KMS**。

   1. 对于**区域性**，选择**单区域密钥**，然后单击**下一步**。

1. 对于**别名**，提供 KMS 密钥的名称。

1. (可选）对于**描述**，提供 KMS 密钥的描述。

1. （可选）对于**标签**，提供 KMS 密钥的标签，然后单击**下一步**。

1. 对于**密钥管理员**，提供 IAM 用户的名称并将其选中。

1. 对于**密钥删除**，确保选中**允许密钥管理员删除此密钥**复选框，然后单击**下一步**。

1. 对于**密钥用户**，请提供上一步中的 IAM 用户并将其选中。单击**下一步**。

1. 审核配置。

1. 对于**密钥策略**，请在策略**声明**中包括以下内容：

   ```
   {
       "Sid": "Allow use of the KMS key on behalf of RDS",
       "Effect": "Allow",
       "Principal": {
           "Service": [
               "rds.amazonaws.com"
           ]
       },
       "Action": "kms:Decrypt",
       "Resource": "*"
   }
   ```

1. 单击 **Finish (完成)**。

## 步骤 5：创建 AWS 密钥
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateSecret"></a>

**创建密钥**
**注意**  
 确保在包含要加入自托管式 AD 的 RDS for SQL Server 数据库实例的 AWS 账户中创建密钥。

1. 在 AWS Secrets Manager 下，选择**存储新密钥**。

1. 对于**密钥类型**，请选择**其他密钥类型**。

1. 对于**键/值对**，请添加您的两个密钥：

   1. 对于第一个密钥，请输入 `SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME`。

   1. 对于第一个密钥的值，请仅输入 AD 用户的用户名（不带域前缀）。请勿包含域名，因为这会导致实例创建失败。

   1. 对于第二个密钥，请输入 `SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD`。

   1. 对于第二个密钥的值，请输入您在域中为 AD 用户创建的密码。

1. 对于**加密密钥**，输入您在上一步中创建的 KMS 密钥，然后单击**下一步**。

1. 在**密钥名称**中，输入一个描述性名称，以便您稍后查找自己的密钥。

1. （可选）对于**描述**，输入密钥名称的描述。

1. 对于**资源权限**，请单击**编辑**。

1. 将以下策略添加到权限策略中：
**注意**  
我们建议您在策略中使用 `aws:sourceAccount` 和 `aws:sourceArn` 条件，以避免出现*混淆代理人*问题。将您的 AWS 账户用于 `aws:sourceAccount`，并将 RDS for SQL Server 数据库实例 ARN 用于 `aws:sourceArn`。有关更多信息，请参阅 [防范跨服务混淆代理问题](cross-service-confused-deputy-prevention.md)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement":
       [
           {
               "Effect": "Allow",
               "Principal":
               {
                   "Service": "rds.amazonaws.com"
               },
               "Action": "secretsmanager:GetSecretValue",
               "Resource": "*",
               "Condition":
               {
                   "StringEquals":
                   {
                       "aws:sourceAccount": "123456789012"
                   },
                   "ArnLike":
                   {
                       "aws:sourceArn": "arn:aws:rds:us-west-2:123456789012:db:*"
                   }
               }
           }
       ]
   }
   ```

------

1. 单击**保存**，然后单击**下一步**。

1. 对于**配置轮换设置**，保留原定设置值并选择**下一步**。

1. 查看密钥的设置，然后单击**存储**。

1. 选择您创建的密钥，然后复制**密钥 ARN** 的值。下一步将使用它来设置自托管式 Active Directory。

# 将数据库实例加入自托管式 Active Directory
<a name="USER_SQLServer_SelfManagedActiveDirectory.Joining"></a>

要将 RDS for SQL Server 数据库实例加入自托管式 AD，请执行以下步骤：

## 步骤 1：创建或修改 SQL Server 数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateModify"></a>

您可以使用控制台、CLI 或 RDS API 将 RDS for SQL Server 数据库实例与自托管式 AD 域关联。您可以通过下列方式之一来执行该操作：
+ 使用控制台、[create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 SQL Server 数据库实例。

  有关说明，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 使用控制台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有 SQL Server 数据库实例。

  有关说明，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+ 使用控制台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，从数据库快照还原 SQL Server 数据库实例。

  有关说明，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。
+ 使用控制台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，将 SQL Server 数据库实例还原到某个时间点。

  有关说明，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

使用 AWS CLI 时，数据库实例需要以下参数才能使用您创建的自托管式 AD 域：
+ 对于 `--domain-fqdn` 参数，请使用自托管式 AD 的完全限定域名（FQDN）。
+ 对于 `--domain-ou` 参数，请使用您在自托管式 AD 中创建的 OU。
+ 对于 `--domain-auth-secret-arn` 参数，使用您在上一步中创建的**密钥 ARN** 的值。
+ 对于 `--domain-dns-ips` 参数，请使用自托管式 AD 的 DNS 服务器的主要 IPv4 地址和辅助 IPv4 地址。如果您没有辅助 DNS 服务器 IP 地址，请输入主 IP 地址两次。

以下示例 CLI 命令显示了如何创建、修改和删除已加入自托管式 AD 域的 RDS for SQL Server 数据库实例。

**重要**  
如果您修改数据库实例，将其加入自托管式 AD 域或将其从自托管式 AD 域中删除，则需要重启数据库实例才能使修改生效。您可以选择立即应用更改，也可以等到下一个维护时段。选择**立即应用**选项将导致单可用区数据库实例停机。多可用区数据库实例将在完成重启之前执行失效转移。有关更多信息，请参阅 [使用计划修改设置](USER_ModifyInstance.ApplyImmediately.md)。

以下 CLI 命令创建一个新的 RDS for SQL Server 数据库实例并将其加入自托管式 AD 域。

对于 Linux、macOS 或 Unix：

```
aws rds create-db-instance \
    --db-instance-identifier my-DB-instance \
    --db-instance-class db.m5.xlarge \
    --allocated-storage 50 \
    --engine sqlserver-se \
    --engine-version 15.00.4043.16.v1 \
    --license-model license-included \
    --master-username my-master-username \
    --master-user-password my-master-password \
    --domain-fqdn my_AD_domain.my_AD.my_domain \
    --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain \
    --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \
    --domain-dns-ips "10.11.12.13" "10.11.12.14"
```

对于：Windows

```
aws rds create-db-instance ^
    --db-instance-identifier my-DB-instance ^
    --db-instance-class db.m5.xlarge ^
    --allocated-storage 50 ^
    --engine sqlserver-se ^
    --engine-version 15.00.4043.16.v1 ^
    --license-model license-included ^
    --master-username my-master-username ^
    --master-user-password my-master-password ^
    --domain-fqdn my-AD-test.my-AD.mydomain ^
    --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain ^
    --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \ ^
    --domain-dns-ips "10.11.12.13" "10.11.12.14"
```

以下 CLI 命令将现有 RDS for SQL Server 数据库实例修改为使用自托管式 AD 域。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier my-DB-instance \
    --domain-fqdn my_AD_domain.my_AD.my_domain \
    --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain \
    --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \ 
    --domain-dns-ips "10.11.12.13" "10.11.12.14"
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier my-DBinstance ^
    --domain-fqdn my_AD_domain.my_AD.my_domain ^
    --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain ^
    --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" ^ 
    --domain-dns-ips "10.11.12.13" "10.11.12.14"
```

以下 CLI 命令从自托管式 AD 域中删除 RDS for SQL Server 数据库实例。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier my-DB-instance \
    --disable-domain
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier my-DB-instance ^
    --disable-domain
```

## 步骤 2：使用 Kerberos 或 NTLM 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.KerbNTLM"></a>

### NTLM 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.KerbNTLM.NTLM"></a>

每个 Amazon RDS 数据库实例都有一个端点，每个端点都包含数据库实例的 DNS 名称和端口号。要使用 SQL 客户端应用程序连接到数据库实例，您需要该数据库实例的 DNS 名称和端口号。要使用 NTLM 身份验证进行身份验证，必须连接到 RDS 端点，或者如果您使用多可用区部署，则必须连接到侦听器端点。

在计划内数据库维护或计划外服务中断期间，Amazon RDS 将自动失效转移到最新辅助数据库，以便操作能够在不进行手动干预的情况下快速恢复。主实例和辅助实例使用相同的端点，其物理网络地址作为失效转移过程的一部分转换到辅助实例。在失效转移时，您不必重新配置应用程序。

### Kerberos 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.Kerb"></a>

RDS for SQL Server 的基于 Kerberos 的身份验证要求连接到特定的服务主体名称（SPN）。但是，在失效转移事件发生后，应用程序可能不知道新 SPN。为了解决这个问题，RDS for SQL Server 提供了一个基于 Kerberos 的端点。

基于 Kerberos 的端点遵循一种特定的格式。如果您的 RDS 端点为 `rds-instance-name.account-region-hash.aws-region.rds.amazonaws.com`，则相应基于 Kerberos 的端点将为 `rds-instance-name.account-region-hash.aws-region.awsrds.fully qualified domain name (FQDN)`。

例如，如果 RDS 端点为 `ad-test.cocv6zwtircu.us-east-1.rds.amazonaws.com`，域名为 `corp-ad.company.com`，则基于 Kerberos 的端点将为 `ad-test.cocv6zwtircu.us-east-1.awsrds.corp-ad.company.com`。

这个基于 Kerberos 的端点可用于使用 Kerberos 对 SQL Server 实例进行身份验证，即使在失效转移事件发生后也是如此，因为端点会自动更新为指向主 SQL Server 实例的新 SPN。

### 查找您的 CNAME
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CNAME"></a>

要查找您的 CNAME，请连接到域控制器并打开 **DNS 管理器**。导航到**正向查找区域**和您的 FQDN。

浏览 **awsrds**、**aws-region**，以及**账户和区域特定的哈希值**。

![\[修改数据库实例的存储量\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/kerb-endpoint-selfManagedAD-RDSMS.png)


如果从远程客户端连接 CNAME 后返回了 NTLM 连接，请检查所需端口是否已列入允许列表。

要检查您的连接是否使用 Kerberos，请运行以下查询：

```
SELECT net_transport, auth_scheme
    FROM sys.dm_exec_connections
    WHERE session_id = @@SSPID;
```

如果您的实例在连接到 Kerberos 端点时返回 NTLM 连接，请验证您的网络配置和用户配置。请参阅[配置您的网络连接](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)。

## 步骤 3：创建 Windows 身份验证 SQL Server 登录名
<a name="USER_SQLServer_SelfManagedActiveDirectory.CreateLogins"></a>

使用 Amazon RDS 主用户凭证连接 SQL Server 数据库实例，就像连接任何其他数据库实例一样。由于数据库实例已加入自托管式 AD 域，因此您可以预调配 SQL Server 登录名和用户。您可以通过自托管式 AD 域中的 AD 用户和组实用程序执行此操作。通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。

为了使自托管式 AD 域服务账户能够在 SQL Server 上进行身份验证，自托管式 AD 域服务账户或该用户所属的自托管式 AD 组必须存在 SQL Server Windows 登录名。访问权限的精细控制是通过对这些 SQL Server 登录名授予和撤销权限来处理的。自托管式 AD 域服务账户没有 SQL Server 登录名，或者用户所属自托管式 AD 组中的登录名无法访问 SQL Server 数据库实例。

创建自托管式 AD SQL Server 登录名需要 ALTER ANY LOGIN 权限。如果您尚未使用此权限创建任何登录名，请使用 SQL Server 身份验证以数据库实例的主用户身份进行连接，并在主用户的上下文下创建自托管式 AD SQL Server 登录名。

您可以运行数据定义语言（DDL）命令（如以下示例），为自托管式 AD 域服务账户或组创建 SQL Server 登录名。

**注意**  
使用 Windows 2000 之前的登录名称指定用户和组，格式为 `my_AD_domain\my_AD_domain_user`。您不能使用 *`my_AD_domain_user`*`@`*`my_AD_domain`* 格式的用户主体名 (UPN)。

```
USE [master]
GO
CREATE LOGIN [my_AD_domain\my_AD_domain_user] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english];
GO
```

有关更多信息，请参阅 Microsoft 开发人员网络文档中的 [CREATE LOGIN (Transact-SQL)](https://msdn.microsoft.com/en-us/library/ms189751.aspx)。

域中用户（人和应用程序）现在均可从加入自托管式 AD 域的客户端计算机使用 Windows 身份验证连接到 RDS for SQL Server 实例。

# 在自托管式 Active Directory 域中管理数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory.Managing"></a>

 您可以使用控制台、AWS CLI 或 Amazon RDS API 来管理数据库实例及其与自托管式 AD 域的关系。例如，您可以将数据库实例移入域、移出域或在域之间移动。

 例如，使用 Amazon RDS API，您可以执行下列操作：
+ 要重新尝试以失败的成员身份加入自托管式域，请使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) API 操作并指定相同的参数集：
  + `--domain-fqdn`
  + `--domain-dns-ips`
  + `--domain-ou`
  + `--domain-auth-secret-arn`
+ 要从自托管式域中删除数据库实例，请使用 `ModifyDBInstance` API 操作并指定 `--disable-domain` 作为域参数。
+ 要将数据库实例从一个自托管式域移至另一个自托管式域，请使用 `ModifyDBInstance` API 操作并指定新域的域参数。
  + `--domain-fqdn`
  + `--domain-dns-ips`
  + `--domain-ou`
  + `--domain-auth-secret-arn`
+ 要列出每个数据库实例的自托管式 AD 域成员资格，请使用 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/DescribeDBInstances.html) API 操作。

## 了解自托管式 Active Directory 域成员资格
<a name="USER_SQLServer_SelfManagedActiveDirectory.Understanding"></a>

在创建或修改数据库实例并指定 AD 详细信息后，实例将成为自托管式 AD 域的成员。AWS 控制台将指示数据库实例的自托管式 Active Directory 域成员资格的状态。数据库实例的状态可以是以下状态之一：
+  **已加入** – 实例是 AD 域的成员。
+  **正在加入** – 实例正处于成为 AD 域成员的过程中。
+  **待联接** – 实例成员资格待定。
+  **pending-maintenance-join** – AWS 将在下一计划维护时段期间尝试使实例成为 AD 域成员。
+  **待删除** – 等待从 AD 域中删除实例。
+  **pending-maintenance-removal** – AWS将在下一计划维护时段期间尝试从 AD 域中删除实例。
+  **失败** – 配置问题阻碍实例加入 AD 域。在重新发出实例修改命令之前检查并修复配置。
+  **正在删除** – 正从自托管式 AD 域中删除实例。

**重要**  
成为自托管式 AD 域成员的请求可能因网络连接问题而失败。例如，您可能会创建数据库实例或修改现有实例，并且尝试使数据库实例成为某个自托管式 AD 域的成员会失败。在这种情况下，您重新发出命令来创建或修改数据库实例，或者修改新创建的实例来加入自托管式 AD 域。

# 自托管式 Active Directory 问题排查
<a name="USER_SQLServer_SelfManagedActiveDirectory.TroubleshootingSelfManagedActiveDirectory"></a>

以下是您在设置或修改自托管式 AD 时可能遇到的问题。


****  

| 错误代码 | 描述 | 常见原因 | 故障排除建议 | 
| --- | --- | --- | --- | 
| 错误 2/0x2 | 系统找不到指定的文件。 | 使用 `—domain-ou` 参数指定的组织单位（OU）的格式或位置无效。通过 AWS Secrets Manager 指定的域服务账户缺少加入 OU 所需的权限。 | 查看 `—domain-ou` 参数。确保域服务账户拥有相应的 OU 权限。有关更多信息，请参阅 [配置您的 AD 域服务账户](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)。 | 
| 错误 5/0x5 | 访问被拒绝。 | 域服务账户的权限配置不正确，或者域中已经存在该计算机账户。 | 查看域中的域服务账户权限，并验证 RDS 计算机账户在域中是否重复。您可以通过在 RDS for SQL Server 数据库实例上运行 `SELECT @@SERVERNAME` 来验证 RDS 计算机账户的名称。如果您使用的是多可用区，请尝试通过失效转移重启，然后再次验证 RDS 计算机账户。有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。 | 
| 错误 87/0x57 | 参数不正确。 | 通过 AWS Secrets Manager 指定的域服务账户不具备相应的权限。用户配置文件也可能已损坏。 | 查看域服务账户的要求。有关更多信息，请参阅 [配置您的 AD 域服务账户](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)。 | 
| 错误 234/0xEA | 指定的组织单位（OU）不存在。 | 使用 `—domain-ou` 参数指定的 OU 在您的自托管式 AD 中不存在。 | 查看 `—domain-ou` 参数并确保指定的 OU 在您的自托管式 AD 中存在。 | 
| 错误 1326/0x52E | 用户名或密码不正确。 | AWS Secrets Manager 中提供的域服务账户凭证包含未知的用户名或错误的密码。您的自托管式 AD 中也可能已禁用域账户。 | 确保 AWS Secrets Manager 中提供的凭证正确无误，并且在您的自托管式 AD 中启用了域账户。 | 
| 错误 1355/0x54B | 指定的域不存在或无法访问。 | 域已关闭、指定的 DNS IP 集无法访问，或指定的 FQDN 无法访问。 | 查看 `—domain-dns-ips` 和 `—domain-fqdn` 参数，确保正确。查看您的 RDS for SQL Server 数据库实例的网络配置，并确保您的自托管式 AD 可以访问。有关更多信息，请参阅 [配置您的网络连接](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)。 | 
| 错误 1722/0x6BA | RPC 服务器不可用。 | 连接您的 AD 域的 RPC 服务时出现问题。这可能由于服务或网络问题导致。 | 验证 RPC 服务是否正在您的域控制器上运行，以及是否可以在您的域上从 RDS for SQL Server 数据库实例访问 TCP 端口 `135` 和 `49152-65535`。 | 
|  错误 1727 / 0x6BF  |  远程过程调用失败且未执行。  |  网络连接问题或防火墙限制阻碍了与域控制器的 RPC 通信。  |  如果使用跨 VPC 域加入，请使用 VPC 对等连接或 Transit Gateway 验证跨 VPC 通信的设置是否正确。确保您的 RDS for SQL Server 数据库实例能访问域中的 TCP 高端口 `49152-65535`，包括任何可能的防火墙限制。  | 
| 错误 2224/0x8b0 | 用户账户已存在。 | 正在尝试添加到您自托管式 AD 的计算机账户已经存在。 | 通过在您的 RDS for SQL Server 数据库实例上运行 `SELECT @@SERVERNAME` 来识别计算机账户，然后小心地将其从您的自托管式 AD 中删除。 | 
| 错误 2242/0x8c2 | 此用户的密码已过期。 | 通过 AWS Secrets Manager 指定的域服务账户的密码已过期。 | 更新用于将 RDS for SQL Server 数据库实例加入自托管式 AD 的域服务账户的密码。 | 

将数据库实例加入自托管式 Active Directory 域后，您可能会收到与您的域运行状况相关的 RDS 事件。

```
Unhealthy domain state detected while attempt to verify or 
configure your Kerberos endpoint in your domain on 
node node_n. message
```

对于多可用区实例，您可能会注意到 node1 和 node2 的错误报告，这表明您的实例的 Kerberos 配置尚未准备好进行失效转移。在失效转移时，使用 Kerberos 可能会遇到身份验证问题。解决配置问题，确保 Kerberos 设置有效且最新。对于多可用区实例，只要所有网络和权限配置都已到位，则无需执行任何操作即可在新的主要主机上使用 Kerberos 身份验证。

对于单可用区实例，node1 是主节点。如果您的 Kerberos 身份验证未按预期运行，请检查实例事件并解决配置问题，确保 Kerberos 设置有效且最新。

## 还原 SQL Server 数据库实例，然后将其添加到自托管式 Active Directory 域
<a name="USER_SQLServer_SelfManagedActiveDirectory.Restore"></a>

您可以还原数据库快照或对 SQL Server 数据库实例执行时间点恢复（PITR），然后将其添加到自托管式 Active Directory 域。还原数据库实例后，使用[步骤 1：创建或修改 SQL Server 数据库实例](USER_SQLServer_SelfManagedActiveDirectory.Joining.md#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateModify)中介绍的过程修改此实例，以将数据库实例添加到自托管式 AD 域。

# 将 AWS Managed Active Directory 用于 RDS for SQL Server
<a name="USER_SQLServerWinAuth"></a>

当用户连接您的 RDS for SQL Server 数据库实例时，您可以使用 AWS Managed Microsoft AD 通过 Windows 身份验证对用户进行身份验证。数据库实例使用 AWS Directory Service for Microsoft Active Directory（也称为 AWS Managed Microsoft AD）来启用 Windows 身份验证。当用户对联接到信任域的 SQL Server 数据库实例进行身份验证时，身份验证请求将转发至您使用 Directory Service 创建的域目录。

## 区域和版本可用性
<a name="USER_SQLServerWinAuth.RegionVersionAvailability"></a>

Amazon RDS 支持仅使用 AWS Managed Microsoft AD 进行 Windows 身份验证。RDS 不支持使用 AD Connector。有关更多信息，请参阅下列内容：
+ [ 的应用程序兼容性策略AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_app_compatibility.html)
+ [AD Connector 的应用程序兼容性策略](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_app_compatibility.html)

有关版本和区域可用性的信息，请参阅 [RDS for SQL Server 的 Kerberos 身份验证](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.html#Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.sq)。

## 设置 Windows 身份验证概述
<a name="USER_SQLServerWinAuth.overview"></a>

Amazon RDS 使用混合模式进行 Windows 身份验证。此方式意味着，*主用户*（用于创建 SQL Server 数据库实例的名称和密码）使用 SQL 身份验证。由于主用户账户是特权凭证，您应限制对此账户的访问。

要使用本地或自托管式 Microsoft Active Directory 获取 Windows 身份验证，请创建林信任。信任可以是单向或双向的。有关使用 Directory Service 设置林信任的更多信息，请参阅 *AWS Directory Service 管理指南* 中的[何时创建信任关系](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)。

要为 SQL Server 数据库实例设置 Windows 身份验证，请执行下列步骤（[为 SQL Server 数据库实例设置 Windows 身份验证](USER_SQLServerWinAuth.SettingUp.md) 中更为详细地介绍）：

1. 从 AWS Managed Microsoft AD或 AWS 管理控制台 API 使用 Directory Service 创建 AWS Managed Microsoft AD 目录。

1. 如果使用 AWS CLI 或 Amazon RDS API 创建 SQL Server 数据库实例，请创建 AWS Identity and Access Management（IAM）角色。此角色使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 并允许 Amazon RDS 调用您的目录。如果您使用控制台创建 SQL Server 数据库实例，则 AWS 将为您创建 IAM 角色。

   为了让角色允许访问，AWS Security Token Service (AWS STS) 终端节点必须在您的 AWS 账户的 AWS 区域中激活。AWS STS 终端节点默认在所有 AWS 区域中保持活跃，且您无需任何进一步动作即可使用它们。有关更多信息，请参阅《IAM 用户指南》**中的[在 AWS 区域中管理 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

1. 使用 Microsoft Active Directory 工具在 AWS Managed Microsoft AD 目录中创建和配置用户与组。有关在 Microsoft Active Directory 中创建用户的更多信息，请参阅 *AWS Directory Service管理指南*中的[管理 AWS Managed Microsoft AD 中的用户和组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)。

1. 如果您计划在不同 VPC 中查找目录和数据库实例，请启用跨 VPC 流量。

1. 使用 Amazon RDS 从控制台、AWS CLI 或 Amazon RDS API 新建 SQL Server 数据库实例。在创建请求中，提供在创建目录时生成的域标识符（“`d-*`”标识符）和您创建的角色的名称。通过为数据库实例设置域和 IAM 角色参数，您还可将现有 SQL Server 数据库实例修改为使用 Windows 身份验证。

1. 使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例，就像连接到任何其他数据库实例一样。由于数据库实例已联接到 AWS Managed Microsoft AD 域，您可从域中的 Active Directory 用户和组中预配置 SQL Server 登录名和用户。（这称为 SQL Server“Windows”登录。） 通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。

当您使用 Amazon RDS 控制台创建与域连接的 RDS for SQL Server 数据库实例时，AWS 会自动创建 `rds-directoryservice-access-role` IAM 角色。此角色对于管理与域连接的实例至关重要，并且是以下操作所必需的：
+ 对与域连接的 SQL Server 实例进行配置更改
+ 管理 Active Directory 集成设置
+ 对加入域的实例执行维护操作

**重要**  
如果您删除 `rds-directoryservice-access-role` IAM 角色，则无法通过 Amazon RDS 控制台或 API 更改与域连接的 SQL Server 实例。尝试修改实例会导致一条错误消息，内容如下：You don't have permission to iam:CreateRole. To request access, copy the following text and send it to your AWS administrator.  
出现此错误是因为 Amazon RDS 需要重新创建该角色来管理域连接，但缺少必要的权限。此外，此错误不记录在 CloudTrail 中，而这会使故障排除变得更加困难。

如果您不小心删除了 `rds-directoryservice-access-role`，则必须拥有重新创建它的 `iam:CreateRole` 权限，然后才能对与域连接的 SQL Server 实例进行任何更改。要手动重新创建角色，请确保该角色已附加了 `AmazonRDSDirectoryServiceAccess` 托管式策略以及支持 RDS 服务代入该角色的相应信任关系。

# 为 Kerberos 身份验证创建终端节点
<a name="USER_SQLServerWinAuth.KerberosEndpoint"></a>

基于 Kerberos 的身份验证需要终端节点是客户指定的主机名、句点，然后是完全限定的域名 (FQDN)。例如，以下是您可以用于基于 Kerberos 身份验证的终端节点的示例。在此示例中，SQL Server 数据库实例主机名为 `ad-test`，域名为 `corp-ad.company.com`。

```
ad-test.corp-ad.company.com
```

如果您要确保连接使用的是 Kerberos，请运行以下查询：

```
1. SELECT net_transport, auth_scheme 
2.   FROM sys.dm_exec_connections 
3.  WHERE session_id = @@SPID;
```

# 为 SQL Server 数据库实例设置 Windows 身份验证
<a name="USER_SQLServerWinAuth.SettingUp"></a>

使用 AWS Directory Service for Microsoft Active Directory（也称为 AWS Managed Microsoft AD）为 SQL Server 数据库实例设置 Windows 身份验证。要设置 Windows 身份验证，请执行下列步骤。

## 步骤 1：使用 AWS Directory Service for Microsoft Active Directory 创建目录
<a name="USER_SQLServerWinAuth.SettingUp.CreateDirectory"></a>

Directory Service 将在 AWS 云中创建完全托管的 Microsoft Active Directory。创建 AWS Managed Microsoft AD 目录时，Directory Service 将代表您创建两个域控制器和域名服务 (DNS) 服务器。目录服务器在 VPC 内的两个不同可用区中的两个子网中创建。这种冗余有助于确保即使发生故障，目录仍可访问。

 创建 AWS Managed Microsoft AD 目录时，Directory Service 代表您执行以下任务：
+ 在 VPC 中设置 Microsoft Active Directory。
+ 使用用户名 Admin 和指定密码创建目录管理员账户。您可以使用此账户管理您的目录。
+ 为目录控制器创建安全组。

在启动 AWS Directory Service for Microsoft Active Directory 时，AWS 创建一个组织单位 (OU)，其中包含目录的所有对象。此 OU (具有您在创建目录时键入的 NetBIOS 名称) 位于域根目录中。此域根目录由 AWS 拥有和管理。

 使用您的 AWS Managed Microsoft AD 目录创建的 *admin* 账户对您的 OU 的最常见管理活动具有以下权限：
+ 创建、更新或删除用户、组和计算机。
+ 将资源添加到域 (如文件或打印服务器)，然后为 OU 中的用户和组分配这些资源的权限。
+ 创建额外的 OU 和容器。
+ 委托授权。
+ 创建和链接组策略。
+ 从 Active Directory 回收站还原删除的对象。
+ 在 Active Directory Web 服务上运行 AD 和 DNS Windows PowerShell 模块。

admin 账户还具有执行下列域范围活动的权限：
+ 管理 DNS 配置（添加、删除或更新记录、区域和转发器）。
+ 查看 DNS 事件日志。
+ 查看安全事件日志。

**使用 AWS Managed Microsoft AD 创建目录**

1. 在 [Directory Service 控制台](https://console.aws.amazon.com/directoryservicev2/)导航窗格中，选择**目录**，然后选择**设置目录**。

1. 选择 **AWS Managed Microsoft AD**。这是当前唯一支持用于 Amazon RDS 的选项。

1. 选择 **Next (下一步)**。

1. 在**输入目录信息**页面上，提供以下信息：  
**版本**  
 选择符合您要求的版本。  
**目录 DNS 名称**  
目录的完全限定名称，例如 `corp.example.com`。SQL Server 不支持超过 47 个字符的名称。  
**目录 NetBIOS 名称**  
可选的目录短名称，如 `CORP`。  
**目录描述**  
目录的可选描述。  
**管理员密码**  
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。  
目录管理员密码不能包含单词 `admin`。此密码区分大小写，且长度必须介于 8 – 64 个字符之间。至少，它还必须包含下列四种类别中三种类别的一个字符：  
   + 小写字母 (a-z)
   + 大写字母 (A-Z)
   + 数字 (0-9)
   + 非字母数字字符 (\$1\$1@\$1\$1%^&\$1\$1-\$1=`\$1\$1()\$1\$1[]:;"'<>,.?/)   
**确认密码**  
重新键入管理员密码。

1. 选择 **Next (下一步)**。

1. 在**选择 VPC 和子网**页面上，提供以下信息：  
**VPC**  
为目录选择 VPC。  
您可以在不同 VPC 中查找目录和数据库实例，但如果这样做，请确保启用跨 VPC 流量。有关更多信息，请参阅“[步骤 4：在目录和数据库实例之间启用跨 VPC 流量](#USER_SQLServerWinAuth.SettingUp.VPC-Peering)”。  
**子网**  
为目录服务器选择子网。两个子网必须位于不同的可用区。

1. 选择 **Next (下一步)**。

1. 检查目录信息。如果需要进行更改，请选择**上一步**。如果信息正确，请选择 **Create directory (创建目录)**。  
![\[审核和创建页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth2.png)

目录创建需要几分钟时间。创建成功后，**Status (状态)** 值将更改为 **Active (活动)**。

要查看有关您的目录的信息，请在目录列表中选择目录。记下**目录 ID**。在创建或修改 SQL Server 数据库实例时，您将需要此值。

![\[“目录详细信息”页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth3.png)


## 步骤 2：创建 Amazon RDS 使用的 IAM 角色
<a name="USER_SQLServerWinAuth.SettingUp.CreateIAMRole"></a>

如果您使用控制台创建您的 SQL Server 数据库实例，则可跳过此步。如果您已使用 CLI 或 RDS API 创建 SQL Server 数据库实例，则必须创建使用 `AmazonRDSDirectoryServiceAccess` 托管 IAM 策略的 IAM 角色。此角色允许 Amazon RDS 为您调用 Directory Service。

如果您使用自定义策略来加入域，而不是使用 AWS 托管的 `AmazonRDSDirectoryServiceAccess` 策略，请确保允许 `ds:GetAuthorizedApplicationDetails` 操作。由于 Directory Service API 发生变化，这一要求自 2019 年 7 月起生效。

以下 IAM 策略 `AmazonRDSDirectoryServiceAccess` 提供对 Directory Service 的访问权限。

**Example 用于提供 Directory Service 访问权限的 IAM 策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
            "ds:DescribeDirectories", 
            "ds:AuthorizeApplication", 
            "ds:UnauthorizeApplication",
            "ds:GetAuthorizedApplicationDetails"
        ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
+ 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
+ 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 Windows 身份验证，请确保包含数据库实例，如以下示例所示。

**Example 与 Windows 身份验证的全局条件上下文键的信任关系**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": [
                        "arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                    ]
                }
            }
        }
    ]
}
```

使用此 IAM 策略和信任关系创建 IAM 角色。有关创建 IAM 角色的更多信息，请参阅 *IAM 用户指南* 中的[创建客户托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#create-managed-policy-console)。

## 步骤 3：创建和配置用户和组
<a name="USER_SQLServerWinAuth.SettingUp.CreateUsers"></a>

您可以使用“Active Directory 用户和计算机”工具创建用户和组。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具之一。用户表示有权访问您的目录的独立个人或实体。对于针对用户组授予或拒绝权限非常有用，从而不必将这些权限应用于每个独立用户。

要在 Directory Service 目录中创建用户和组，您必须连接到属于 Directory Service 目录成员的 Windows EC2 实例。您还必须以具有创建用户和组权限的用户身份登录。有关更多信息，请参阅 *AWS Directory Service管理指南*中的[添加用户和组（Simple AD 和 AWS Managed Microsoft AD）](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/creating_ad_users_and_groups.html)。

## 步骤 4：在目录和数据库实例之间启用跨 VPC 流量
<a name="USER_SQLServerWinAuth.SettingUp.VPC-Peering"></a>

如果您打算将目录和数据库实例放在同一 VPC 中，请跳过该步骤，然后转到[步骤 5：创建或修改 SQL Server 数据库实例](#USER_SQLServerWinAuth.SettingUp.CreateModify)。

如果您计划在不同 VPC 中查找目录和数据库实例，请使用 VPC 对等连接或 [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 配置跨 VPC 流量。

以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 *Amazon Virtual Private Cloud 对等连接指南*中的[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/Welcome.html)操作。

**使用 VPC 对等连接启用跨 VPC 流量**

1. 设置适合的 VPC 路由规则，以便确保网络流量可以双向流动。

1. 确保数据库实例的安全组可以从目录的安全组接收入站流量。

1. 确保没有任何网络访问控制列表 (ACL) 规则会阻止流量。

如果该目录由不同的 AWS 账户拥有，则您必须共享该目录。

**在 AWS 账户之间共享目录**

1. 按照 *AWS 管理指南*中的[教程：共享 AWS Managed Microsoft AD 目录以实现无缝 EC2 域加入](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html)中的说明，开始与将要在其中创建数据库实例的 Directory Service 账户共享目录。

1. 使用数据库实例的账户登录到 Directory Service 控制台，并确保在处理之前域具有 `SHARED` 状态。

1. 使用数据库实例的账户登录 Directory Service 控制台时，请记录**目录 ID** 值。您可以使用此目录 ID 将数据库实例加入域。

## 步骤 5：创建或修改 SQL Server 数据库实例
<a name="USER_SQLServerWinAuth.SettingUp.CreateModify"></a>

创建或修改 SQL Server 数据库实例，以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作：
+ 使用控制台、[create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 SQL Server 数据库实例。

  有关说明，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 使用控制台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有 SQL Server 数据库实例。

  有关说明，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+ 使用控制台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，从数据库快照还原 SQL Server 数据库实例。

  有关说明，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。
+ 使用控制台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，将 SQL Server 数据库实例还原到某个时间点。

  有关说明，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

 只有 VPC 中的 SQL Server 数据库实例才支持 Windows 身份验证。

 要使数据库实例能够使用您创建的域目录，需要满足以下条件：
+  对于**目录**，您必须选择创建目录时生成的域标识符 (`d-ID`)。
+  确保 VPC 安全组具有允许数据库实例与目录通信的出站规则。

![\[Microsoft SQL Server Windows 身份验证目录\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth1.png)


使用 AWS CLI 时，数据库实例需要以下参数才能使用您创建的目录：
+ 对于 `--domain` 参数，请使用创建目录时生成的域标识符 (`d-ID`)。
+ 对于 `--domain-iam-role-name` 参数，请使用您通过托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 创建的角色。

例如，以下 CLI 命令会修改数据库实例以使用目录。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --domain d-ID \
    --domain-iam-role-name role-name
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier mydbinstance ^
    --domain d-ID ^
    --domain-iam-role-name role-name
```

**重要**  
如果您修改数据库实例以启用 Kerberos 身份验证，请在进行更改之后重启数据库实例。

## 步骤 6：创建 Windows 身份验证 SQL Server 登录名
<a name="USER_SQLServerWinAuth.CreateLogins"></a>

使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例，就像连接到任何其他数据库实例一样。由于数据库实例已加入 AWS Managed Microsoft AD 域，因此您可以预配置 SQL Server 登录名和用户。您可以从域中的 Active Directory 用户和组执行此操作。通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。

对于 Active Directory 用户，要对 SQL Server 进行身份验证，此用户或其所属的组必须存在 SQL Server Windows 登录名。访问权限的精细控制是通过对这些 SQL Server 登录名授予和撤销权限来处理的。用户没有 SQL Server 登录名，或者用户所属组中的登录名无法访问 SQL Server 数据库实例。

创建 Active Directory SQL Server 登录名需要 ALTER ANY LOGIN 权限。如果您未使用此权限创建任何登录名，请使用 SQL Server 身份验证作为数据库实例的主用户进行连接。

运行数据定义语言 (DDL) 命令（如以下示例）为 Active Directory 用户或组创建 SQL Server 登录名。

**注意**  
使用 Windows 2000 之前的登录名称指定用户和组，格式为 `domainName\login_name`。您不能使用 *`login_name`*`@`*`DomainName`* 格式的用户主体名 (UPN)。  
您只能使用 T-SQL 语句在 RDS for SQL Server 实例上创建 Windows 身份验证登录名。您无法使用 SQL Server Management Studio 创建 Windows 身份验证登录名。

```
USE [master]
GO
CREATE LOGIN [mydomain\myuser] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english];
GO
```

有关更多信息，请参阅 Microsoft 开发人员网络文档中的 [CREATE LOGIN (Transact-SQL)](https://msdn.microsoft.com/en-us/library/ms189751.aspx)。

域中用户（人和应用程序）现在均可从加入域的客户端计算机使用 Windows 身份验证连接到 RDS for SQL Server 实例。

# 在域中管理数据库实例
<a name="USER_SQLServerWinAuth.Managing"></a>

 您可以使用控制台、AWS CLI 或 Amazon RDS API 来管理数据库实例及其与您的域的关系。例如，您可以将数据库实例移入域、移出域或在域之间移动。

 例如，使用 Amazon RDS API，您可以执行下列操作：
+  要为失败的成员资格重新尝试域加入，请使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) API 操作并指定当前成员资格的目录 ID。
+  要为成员资格更新 IAM 角色名称，请使用 `ModifyDBInstance` API 操作并指定当前成员资格的目录 ID 和新的 IAM 角色。
+  要从域中删除数据库实例，请使用 `ModifyDBInstance` API 操作并指定 `none` 作为域参数。
+  要将数据库实例从一个域移至另一个域，请使用 `ModifyDBInstance` API 操作并指定新域的域标识符作为域参数。
+  要列出每个数据库实例的成员资格，请使用 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/DescribeDBInstances.html) API 操作。

## 了解域成员资格
<a name="USER_SQLServerWinAuth.Understanding"></a>

 在创建或修改数据库实例后，实例将成为域的成员。AWS 控制台将指示数据库实例的域成员资格状态。数据库实例的状态可以是以下状态之一：
+  **已联接** – 实例是域的成员。
+  **正在联接** – 实例正处于成为域成员的过程中。
+  **待联接** – 实例成员资格待定。
+  **pending-maintenance-join** – AWS将在下一计划维护期间尝试使实例成为域成员。
+  **待删除** – 等待从域中删除实例。
+  **pending-maintenance-removal** – AWS将在下一计划维护期间尝试从域中删除实例。
+  **失败** – 配置问题阻碍实例联接域。在重新发出实例修改命令之前检查并修复配置。
+  **正在删除** – 正从域中删除实例。

成为域成员的请求可能因网络连接问题或不正确的 IAM 角色而失败。例如，您可能会创建数据库实例或修改现有实例，并且尝试使数据库成为某个域的成员会失败。在这种情况下，您重新发出命令以创建或修改数据库实例，或者修改新创建的实例以加入域。

# 使用 Windows 身份验证连接到 SQL Server
<a name="USER_SQLServerWinAuth.Connecting"></a>

要使用 Windows 身份验证连接到 SQL Server，您必须作为域用户登录联接域的计算机。在启动 SQL Server Management Studio 之后，请选择 **Windows 身份验证**作为身份验证类型，如下所示。

![\[使用 Windows 身份验证连接到 SQL Server\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth4.png)


## 还原 SQL Server 数据库实例，然后将其添加到域中
<a name="USER_SQLServerWinAuth.Restore"></a>

您可还原数据库快照或为 SQL Server 数据库实例执行时间点恢复 (PITR)，然后将其添加到域中。数据库实例还原后，使用[步骤 5：创建或修改 SQL Server 数据库实例](USER_SQLServerWinAuth.SettingUp.md#USER_SQLServerWinAuth.SettingUp.CreateModify)中介绍的过程修改此实例以将数据库实例添加到域中。

# 升级 Microsoft SQL Server 数据库引擎
<a name="USER_UpgradeDBInstance.SQLServer"></a>

如果 Amazon RDS 支持数据库引擎的新版本，您可以将您的数据库实例升级到新版本。SQL Server 数据库实例具有两种升级：主要版本升级和次要版本升级。

*主要版本升级*会包含不与现有应用程序向后兼容的数据库更改。因此，您必须*手动*为数据库实例执行主要版本升级。您可以通过修改数据库实例来启动主要版本升级。不过，在执行主要版本升级之前，建议您按照[测试 RDS for SQL Server 升级](USER_UpgradeDBInstance.SQLServer.UpgradeTesting.md)中所述的步骤测试升级。

*次要版本升级*仅包含与现有应用程序向后兼容的更改。您可以通过两种方式升级数据库实例的次要版本：
+ *手动*：修改您的数据库实例以启动升级
+ *自动*：为数据库实例启用自动次要版本升级

启用自动次要版本升级后，当较新的次要版本中有关键安全更新可用时，RDS for SQL Server 会在计划的维护时段内自动升级数据库实例。

对于 `16.00.4120.1`、`15.00.4365.2`、`14.00.3465.1`、`13.00.6435.1` 之后的次要引擎版本，默认情况下会禁用以下安全协议：
+ `rds.tls10`（TLS 1.0 协议）
+ `rds.tls11`（TLS 1.1 协议）
+ `rds.rc4`（RC4 密码）
+ `rds.curve25519`（Curve25519 加密）
+ `rds.3des168`（三重 DES 加密）

对于较早的引擎版本，Amazon RDS 默认情况下启用这些安全协议。

```
...

"ValidUpgradeTarget": [
    {
        "Engine": "sqlserver-se",
        "EngineVersion": "14.00.3281.6.v1",
        "Description": "SQL Server 2017 14.00.3281.6.v1",
        "AutoUpgrade": false,
        "IsMajorVersionUpgrade": false
    }
...
```

有关执行升级的更多信息，请参阅[升级 SQL Server 数据库实例](#USER_UpgradeDBInstance.SQLServer.Upgrading)。有关在 Amazon RDS 上可用的 SQL Server 版本的信息，请参阅 [Amazon RDS for Microsoft SQL Server](CHAP_SQLServer.md)。

Amazon RDS 还支持升级推出策略，以管理跨多个数据库资源和 AWS 账户的自动次要版本升级。有关更多信息，请参阅 [使用 AWS Organizations 升级推出策略自动升级次要版本](RDS.Maintenance.AMVU.UpgradeRollout.md)。

**Topics**
+ [RDS for SQL Server 的主要版本升级](USER_UpgradeDBInstance.SQLServer.Major.md)
+ [SQL Server 升级的注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md)
+ [测试 RDS for SQL Server 升级](USER_UpgradeDBInstance.SQLServer.UpgradeTesting.md)
+ [升级 SQL Server 数据库实例](#USER_UpgradeDBInstance.SQLServer.Upgrading)
+ [在支持结束之前升级已弃用的数据库实例](#USER_UpgradeDBInstance.SQLServer.DeprecatedVersions)

# RDS for SQL Server 的主要版本升级
<a name="USER_UpgradeDBInstance.SQLServer.Major"></a>

Amazon RDS 当前支持对 Microsoft SQL Server 数据库实例进行以下主要版本升级。

您可以将现有数据库实例从 SQL Server 2008 之外的任何版本升级到 SQL Server 2017 或 2019。要从 SQL Server 2008 升级，请先升级到其他版本之一。


****  

| 当前版本 | 支持的升级版本 | 
| --- | --- | 
|  SQL Server 2019  |  SQL Server 2022  | 
|  SQL Server 2017  |  SQL Server 2022 SQL Server 2019  | 
|  SQL Server 2016  |  SQL Server 2022 SQL Server 2019 SQL Server 2017  | 

您可以使用 AWS CLI 查询（如以下示例）来查找特定数据库引擎版本的可用升级。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds describe-db-engine-versions \
    --engine sqlserver-se \
    --engine-version 14.00.3281.6.v1 \
    --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" \
    --output table
```
对于 Windows：  

```
aws rds describe-db-engine-versions ^
    --engine sqlserver-se ^
    --engine-version 14.00.3281.6.v1 ^
    --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" ^
    --output table
```
输出显示您可以将版本 14.00.3281.6 升级到最新推出的 SQL Server 2017 或 2019 版本。  

```
--------------------------
|DescribeDBEngineVersions|
+------------------------+
|      EngineVersion     |
+------------------------+
|  14.00.3294.2.v1       |
|  14.00.3356.20.v1      |
|  14.00.3381.3.v1       |
|  14.00.3401.7.v1       | 
|  14.00.3421.10.v1      |
|  14.00.3451.2.v1       |
|  15.00.4043.16.v1      |
|  15.00.4073.23.v1      |
|  15.00.4153.1.v1       |
|  15.00.4198.2.v1       |
|  15.00.4236.7.v1       |
+------------------------+
```

## 数据库兼容性级别
<a name="USER_UpgradeDBInstance.SQLServer.Major.Compatibility"></a>

您可以使用 Microsoft SQL Server 数据库兼容性级别调整某些数据库行为，以模仿之前版本的 SQL Server。有关更多信息，请参阅 Microsoft 文档中的[兼容性级别](https://msdn.microsoft.com/en-us/library/bb510680.aspx)。在升级数据库实例时，任何现有的数据库将保持其原始兼容性级别。

您可以使用 ALTER DATABASE 命令更改数据库的兼容性级别。例如，要将名为 `customeracct` 的数据库更改为与 SQL Server 2016 兼容，请发出以下命令：

```
1. ALTER DATABASE customeracct SET COMPATIBILITY_LEVEL = 130
```

# SQL Server 升级的注意事项
<a name="USER_UpgradeDBInstance.SQLServer.Considerations"></a>

在升级流程期间，Amazon RDS 会创建两个数据库快照。第一个数据库快照是数据库实例在进行任何升级更改前的。第二个数据库快照是在升级结束后制作的。

**注意**  
如果您将数据库实例的备份保留期设置为大于 0 的数字，则 Amazon RDS 只需创建数据库快照。要更改您的备份保留期，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

升级完成后，您无法恢复为之前版本的数据库引擎。如果您想恢复到以前的版本，请从升级前创建的数据库快照还原以创建新的数据库实例。

在 SQL Server 的次要或主要版本升级期间，**Free Storage Space**和 **Disk Queue Depth** 指标将显示 `-1`。升级完毕后，这两个指标都将恢复正常。

在升级 SQL Server 实例之前，请查看以下信息。

**Topics**
+ [启动升级之前的最佳实践](#USER_UpgradeDBInstance.SQLServer.BestPractices)
+ [多可用区注意事项](#USER_UpgradeDBInstance.SQLServer.MAZ)
+ [只读副本注意事项](#USER_UpgradeDBInstance.SQLServer.readreplica)
+ [选项组注意事项](#USER_UpgradeDBInstance.SQLServer.OGPG.OG)
+ [参数组注意事项](#USER_UpgradeDBInstance.SQLServer.OGPG.PG)

## 启动升级之前的最佳实践
<a name="USER_UpgradeDBInstance.SQLServer.BestPractices"></a>

在开始升级过程之前，请实施以下准备步骤，以实现最佳的升级性能并最大限度地减少潜在问题：

时间和工作负载管理  
+ 安排在事务量较低的时段进行升级。
+ 在升级时段内尽量减少写入操作。
这样，Amazon RDS 就能够通过减少 RDS 在次要到主要配对期间需要还原的事务日志备份文件的数量，来更快地完成升级。

事务管理  
+ 确定并监控长时间运行的事务。
+ 在开始升级之前，确保所有关键事务都已提交。
+ 防止在升级时段内具有长时间运行的事务。

日志文件优化  
查看和优化事务日志文件：  
+ 缩小大小过大的日志文件。
+ 减少较高的日志消耗模式。
+ 管理虚拟日志文件（VLF）。
+ 为正常操作保留充足的可用空间。

## 多可用区注意事项
<a name="USER_UpgradeDBInstance.SQLServer.MAZ"></a>

Amazon RDS 通过使用 SQL Server 数据库镜像 (DBM) 或 Always On 可用性组 (AG) 支持为运行 Microsoft SQL Server 的数据库实例进行多可用区部署。有关更多信息，请参阅 [Amazon RDS for Microsoft SQL Server 多可用区部署](USER_SQLServerMultiAZ.md)。

在多可用区部署（Mirroring/AlwaysOn）中，当请求升级时，RDS 会对主实例和辅助实例采用滚动升级策略。滚动升级可确保在辅助实例升级期间至少有一个实例可用于事务。预计中断只会持续失效转移的这段期间。

在升级期间，RDS 会将辅助实例从多可用区配置中移除，对辅助实例执行升级，并还原在主实例断开连接期间从主实例获取的所有事务日志备份。还原所有日志备份后，RDS 会将升级后的辅助实例加入主实例。当所有数据库都处于同步状态时，RDS 会失效转移到已升级的辅助实例。失效转移完成后，RDS 将继续升级旧的主实例，还原所有事务日志备份，并使其与新的主实例配对。

为了尽量减少此失效转移持续时间，我们建议，当使用在连接字符串中支持 `MultiSubnetFailover` 连接选项的客户端库时，使用 AlwaysOn AG 可用性组侦听器端点。使用可用性组侦听器端点时，失效转移时间通常少于 10 秒，但是，此持续时间不包括任何额外的崩溃恢复时间。

## 只读副本注意事项
<a name="USER_UpgradeDBInstance.SQLServer.readreplica"></a>

在数据库版本升级期间，Amazon RDS 会升级所有只读副本以及主数据库实例。Amazon RDS 不支持单独对只读副本进行数据库版本升级。有关只读副本的更多信息，请参阅 [在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本](SQLServer.ReadReplicas.md)。

当您执行主数据库实例的数据库版本升级时，该实例的所有只读副本也会自动升级。Amazon RDS 将在升级主数据库实例之前同时升级所有只读副本。在主数据库实例上的数据库版本升级完成之前，只读副本可能不可用。

## 选项组注意事项
<a name="USER_UpgradeDBInstance.SQLServer.OGPG.OG"></a>

如果数据库实例使用自定义数据库选项组，则在某些情况下，Amazon RDS 无法自动向数据库实例分配新的选项组。例如，在您升级到新的主要版本时，必须指定新的选项组。我们建议您创建新的选项组，然后向该组添加与现有自定义选项组相同的选项。

有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create) 或 [复制选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Copy)。

## 参数组注意事项
<a name="USER_UpgradeDBInstance.SQLServer.OGPG.PG"></a>

如果您的数据库实例使用自定义数据库参数组：
+ Amazon RDS 在升级后自动重新启动数据库实例。
+ 在某些情况下，RDS 无法自动为您的数据库实例分配新参数组。

  例如，在升级到新的主要版本时，必须指定新参数组。我们建议您创建新参数组，然后配置您现有的自定义参数组中的那些参数。

有关更多信息，请参阅 [在 Amazon RDS 中创建数据库参数组](USER_WorkingWithParamGroups.Creating.md) 或 [在 Amazon RDS 中复制数据库参数组](USER_WorkingWithParamGroups.Copying.md)。

# 测试 RDS for SQL Server 升级
<a name="USER_UpgradeDBInstance.SQLServer.UpgradeTesting"></a>

在数据库实例上执行主要版本升级前，应该彻底地测试数据库以及访问该数据库的所有应用程序，了解是否与新版本兼容。我们建议您使用以下过程。

**测试主要版本升级**

1. 对于数据库引擎的新版本，查看 Microsoft 文档中的[升级 SQL Server](https://docs.microsoft.com/en-us/sql/database-engine/install-windows/upgrade-sql-server)，以了解是否存在可能会影响数据库或应用程序的兼容性问题。

1. 如果数据库实例使用自定义选项组，则创建与您正升级到的新版本兼容的新选项组。有关更多信息，请参阅“[选项组注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md#USER_UpgradeDBInstance.SQLServer.OGPG.OG)”。

1. 如果数据库实例使用自定义参数组，则创建与您正升级到的新版本兼容的新参数组。有关更多信息，请参阅“[参数组注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md#USER_UpgradeDBInstance.SQLServer.OGPG.PG)”。

1. 为要升级的数据库实例创建数据库快照。有关更多信息，请参阅“[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)”。

1. 恢复数据库快照，以便创建一个新的测试数据库实例。有关更多信息，请参阅“[还原到数据库实例](USER_RestoreFromSnapshot.md)”。

1. 使用下面介绍的一种方法来修改此新测试数据库实例，以将其升级到新版本：
   + [控制台](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.Console)
   + [AWS CLI](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.CLI)
   + [RDS API](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.API)

1. 计算升级的实例使用的存储容量以决定升级是否需要额外的存储容量。

1. 对升级的数据库实例运行所需次数的质量保证测试以确保数据库和应用程序可正常使用新版本。实施任何必需的新测试，评估您在步骤 1 中发现的任何兼容性问题的影响。测试所有的存储过程和功能。将应用程序的测试版本指向所升级的数据库实例。

1. 如果所有测试通过，那么请在生产数据库实例上执行升级。我们建议您直到确认一切正常后，再允许对数据库实例执行写入操作。

## 升级 SQL Server 数据库实例
<a name="USER_UpgradeDBInstance.SQLServer.Upgrading"></a>

有关手动或自动升级 SQL Server 数据库实例的信息，请参阅以下信息：
+ [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)
+ [在 Amazon RDS for SQL Server 上将 SQL Server 2008 R2 升级到 SQL Server 2016 的最佳实践](https://aws.amazon.com/blogs/database/best-practices-for-upgrading-sql-server-2008-r2-to-sql-server-2016-on-amazon-rds-for-sql-server/)

**重要**  
如果您有任何使用 AWS KMS 进行加密的快照，建议您在支持结束之前启动升级。

## 在支持结束之前升级已弃用的数据库实例
<a name="USER_UpgradeDBInstance.SQLServer.DeprecatedVersions"></a>

主要版本被弃用之后，您不能在新数据库实例上安装它。RDS 将尝试自动升级所有现有数据库实例。

如果您需要恢复已弃用的数据库实例，可以执行时间点恢复 (PITR) 或还原快照。这样做可让您获得使用已弃用版本的数据库实例的临时访问权。但是，在主要版本完全弃用之后，这些数据库实例也将自动升级到支持的版本。

# 在 RDS for SQL Server 中使用存储
<a name="Appendix.SQLServer.CommonDBATasks.DatabaseStorage"></a>

使用 RDS for SQL Server，您最多可以将三个附加卷连接到 RDS for SQL Server 实例，每个卷映射到一个唯一的 Windows 驱动器盘符。这支持您在默认 `D:` 驱动器之外的多个卷上分配数据库文件。添加存储卷后，可以提高数据库文件管理和存储优化的灵活性。

优势包括：
+ **灵活的文件分配**：将数据库数据文件和日志文件分配到多个卷上，以提高 I/O 性能。
+ **存储优化**：使用不同的存储类型和配置来满足不同的工作负载要求。
+ **可扩展性**：无需修改现有卷，即可增加存储容量。

**Topics**
+ [将附加存储卷与 RDS for SQL Server 结合使用的注意事项](#SQLServer.ASV.Considerations)
+ [使用 RDS for SQL Server 添加、移除或修改存储卷](#SQLServer.ASV.Management)
+ [适用于 RDS for SQL Server 的附加存储卷的还原操作](#SQLServer.ASV.Restore)
+ [适用于 RDS for SQL Server 的附加存储卷的使用案例](#SQLServer.ASV.UseCases)

## 将附加存储卷与 RDS for SQL Server 结合使用的注意事项
<a name="SQLServer.ASV.Considerations"></a>

将附加存储卷与 RDS for SQL Server 结合使用时，请注意以下功能和限制：
+ 您只能在 SQL Server 标准版（SE）、企业版（EE）和开发版（DEV-EE）上添加存储卷。
+ 您最多可以为每个实例添加 3 个附加存储卷。
+ 卷名称自动映射到 Windows 驱动器盘符，如下所示：
  + `rdsdbdata2`：`H:` 驱动器
  + `rdsdbdata3`：`I:` 驱动器
  + `rdsdbdata4`：`J:` 驱动器
+ 使用 NVMe 实例存储时，TempDB 文件将继续使用 `T:` 驱动器。SQL Server 审计文件和 Microsoft 商业智能（MSBI）文件保留在 `D:` 驱动器上。
+ 您只能添加通用型 SSD（gp3）和预调配 IOPS SSD（io2）存储类型。
+ 额外存储卷的最小存储大小与为默认 `D:` 驱动器设置的限制相同。数据库实例在所有卷上的最大存储大小总计为 256 TiB。
+ 不支持向带有只读副本的实例或只读副本实例添加存储卷。
+ 不支持向启用了跨区域自动备份的实例添加存储卷。
+ 不支持配置附加存储卷来实现存储自动扩缩。
+ 不支持在创建卷后在卷之间移动文件。
+ 您无法删除 `D:` 卷，但只要其它存储卷为空，就可以将其删除。
+ 不支持在快照还原或时间点故障恢复（PITR）期间修改现有卷的大小。但是，您可以在还原操作期间添加新的存储卷。

## 使用 RDS for SQL Server 添加、移除或修改存储卷
<a name="SQLServer.ASV.Management"></a>

您可以使用 AWS CLI或 AWS 管理控制台 添加、修改和移除附加存储卷。所有操作都使用带 `additional-storage-volumes` 参数的 `modify-db-instance` API 操作。

**重要**  
添加或移除附加存储卷会触发一个备份待处理操作，并进入时间点恢复中断时段。备份工作流程完成后，此时段结束。

**Topics**
+ [添加存储卷](#SQLServer.ASV.Adding)
+ [扩展附加存储卷](#SQLServer.ASV.Scaling)
+ [移除附加存储卷](#SQLServer.ASV.Removing)

### 添加存储卷
<a name="SQLServer.ASV.Adding"></a>

您最多可以在默认 `D:` 驱动器之外添加三个存储卷。要向 RDS for SQL Server 实例添加新的存储卷，请使用带 `additional-storage-volumes` 参数的 `modify-db-instance` 命令。

以下示例添加一个名为 `rdsdbdata4` 的新的 4000 GiB 通用型 SSD（gp3）卷。

```
aws rds modify-db-instance \
  --db-instance-identifier my-sql-server-instance \
  --region us-east-1 \
  --additional-storage-volumes '[{"VolumeName":"rdsdbdata4","StorageType":"gp3","AllocatedStorage":4000}]' \
  --apply-immediately
```

### 扩展附加存储卷
<a name="SQLServer.ASV.Scaling"></a>

除存储大小外，您可以修改附加存储卷的任何存储设置。以下示例修改 `rdsdbdata2` 卷的 IOPS 设置。

```
aws rds modify-db-instance \
  --db-instance-identifier my-sql-server-instance \
  --region us-east-1 \
  --additional-storage-volumes '[{"VolumeName":"rdsdbdata2","IOPS":4000}]' \
  --apply-immediately
```

### 移除附加存储卷
<a name="SQLServer.ASV.Removing"></a>

您无法删除 `D:` 卷，但可以在附加存储卷为空时将其删除。

**警告**  
在移除附加存储卷之前，请确保该卷上未存储任何数据库文件。

以下示例移除 `rdsdbdata4` 卷。

```
aws rds modify-db-instance \
  --db-instance-identifier my-sql-server-instance \
  --region us-east-1 \
  --additional-storage-volumes '[{"VolumeName":"rdsdbdata4","SetForDelete":true}]' \
  --apply-immediately
```

## 适用于 RDS for SQL Server 的附加存储卷的还原操作
<a name="SQLServer.ASV.Restore"></a>

还原数据库时，可以添加存储卷。也可以修改现有卷的存储设置。

**Topics**
+ [快照还原](#SQLServer.ASV.SnapshotRestore)
+ [时间点故障恢复](#SQLServer.ASV.PITR)
+ [原生数据库还原](#SQLServer.ASV.NativeRestore)

### 快照还原
<a name="SQLServer.ASV.SnapshotRestore"></a>

从快照还原时，您可以添加新的附加存储卷，或修改现有卷的 IOPS、吞吐量和存储类型设置。

以下示例从快照还原数据库实例，并修改 `rdsdbdata2` 卷的 IOPS 设置：

```
aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier my-restored-instance \
  --db-snapshot-identifier my-snapshot \
  --region us-east-1 \
  --additional-storage-volumes '[{"VolumeName":"rdsdbdata2","IOPS":5000}]'
```

### 时间点故障恢复
<a name="SQLServer.ASV.PITR"></a>

在时间点故障恢复（PITR）期间，您可以使用自定义配置添加新的附加存储卷。

以下示例执行 PITR 并添加一个新的 5000 GiB 通用型 SSD（gp3）卷：

```
aws rds restore-db-instance-to-point-in-time \
  --source-db-instance-identifier my-source-instance \
  --target-db-instance my-pitr-instance \
  --use-latest-restorable-time \
  --region us-east-1 \
  --additional-storage-volumes '[{"VolumeName":"rdsdbdata4","StorageType":"gp3","AllocatedStorage":5000,"IOPS":5000,"StorageThroughput":200}]'
```

### 原生数据库还原
<a name="SQLServer.ASV.NativeRestore"></a>

您可以使用 `rds_restore_database` 存储过程将数据库还原到特定的附加存储卷。两个新参数支持卷选择：

**`data_file_volume`**  
指定数据库数据文件的驱动器盘符

**`log_file_volume`**  
指定数据库日志文件的驱动器盘符

以下示例还原一个数据库，其数据文件位于 `H:` 驱动器上，而日志文件位于 `I:` 驱动器上：

```
EXEC msdb.dbo.rds_restore_database    
    @restore_db_name='my_database',
    @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/backup-file.bak',
    @data_file_volume='H:',
    @log_file_volume='I:';
```

如果您未指定卷参数，或者为这两个参数指定了 `D:` 驱动器，则数据库文件将还原到默认 `D:` 驱动器：

```
EXEC msdb.dbo.rds_restore_database    
    @restore_db_name='my_database',
    @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/backup-file.bak';
```

## 适用于 RDS for SQL Server 的附加存储卷的使用案例
<a name="SQLServer.ASV.UseCases"></a>

附加存储卷支持各种数据库管理方案。以下各节介绍了常见的使用案例和实施方法。

**Topics**
+ [在附加存储卷上创建数据库](#SQLServer.ASV.NewDatabase)
+ [扩展存储容量](#SQLServer.ASV.ExtendStorage)
+ [在卷之间移动数据库](#SQLServer.ASV.MoveDatabase)
+ [将数据归档到经济高效的存储](#SQLServer.ASV.ArchiveData)

### 在附加存储卷上创建数据库
<a name="SQLServer.ASV.NewDatabase"></a>

您可以使用标准 SQL Server `CREATE DATABASE` 语句直接在附加存储卷上创建新的数据库。

以下示例创建一个数据库，其数据文件位于 `H:` 驱动器上，而日志文件位于 `I:` 驱动器上：

```
CREATE DATABASE MyDatabase
ON (
    NAME = 'MyDatabase_Data',
    FILENAME = 'H:\rdsdbdata\data\MyDatabase_Data.mdf',
    SIZE = 100MB,
    FILEGROWTH = 10MB
)
LOG ON (
    NAME = 'MyDatabase_Log',
    FILENAME = 'I:\rdsdbdata\data\MyDatabase_Log.ldf',
    SIZE = 10MB,
    FILEGROWTH = 10%
);
```

### 扩展存储容量
<a name="SQLServer.ASV.ExtendStorage"></a>

当默认 `D:` 驱动器达到其最大容量时，您可以添加附加存储卷，扩展现有卷，并在新卷上创建新的数据文件或日志文件。

**扩展存储容量**

1. 使用 `modify-db-instance` 命令向实例添加存储卷。

1. 向附加存储卷中添加新的数据文件：

   ```
   ALTER DATABASE MyDatabase
   ADD FILE (
       NAME = 'MyDatabase_Data2',
       FILENAME = 'H:\rdsdbdata\data\MyDatabase_Data2.ndf',
       SIZE = 500MB,
       FILEGROWTH = 50MB
   );
   ```

### 在卷之间移动数据库
<a name="SQLServer.ASV.MoveDatabase"></a>

要将数据库移动到其它卷，请将备份和还原方法与 `rds_backup_database` 和 `rds_restore_database` 存储过程结合使用。有关更多信息，请参阅 [使用本机备份和还原](SQLServer.Procedural.Importing.Native.Using.md)。

**将数据库移至其它卷**

1. 使用 `rds_backup_database` 备份数据库：

   ```
   EXEC msdb.dbo.rds_backup_database 
       @source_db_name='MyDatabase',
       @s3_arn_to_backup_to='arn:aws:s3:::my-bucket/database-backup.bak';
   ```

1. 将数据库还原到目标卷：

   ```
   EXEC msdb.dbo.rds_restore_database    
       @restore_db_name='MyDatabase_New',
       @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/database-backup.bak',
       @data_file_volume='H:',
       @log_file_volume='I:';
   ```

1. 从旧驱动器中删除数据库以释放空间。有关更多信息，请参阅 [删除 Amazon RDS for Microsoft SQL Server 数据库实例中的数据库](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)。

### 将数据归档到经济高效的存储
<a name="SQLServer.ASV.ArchiveData"></a>

对于分区表，您可以将较旧的数据归档到具有不同性能特征的附加存储卷。

**归档分区数据**

1. 添加具有适当存储类型和容量的存储卷。

1. 在附加存储卷上创建新的文件组：

   ```
   ALTER DATABASE MyDatabase
   ADD FILEGROUP ArchiveFileGroup;
   
   ALTER DATABASE MyDatabase
   ADD FILE (
       NAME = 'Archive_Data',
       FILENAME = 'H:\rdsdbdata\data\Archive_Data.ndf',
       SIZE = 1GB,
       FILEGROWTH = 100MB
   ) TO FILEGROUP ArchiveFileGroup;
   ```

1. 使用 SQL Server 分区管理命令将分区移动到新的文件组。

# 使用本机备份和还原导入和导出 SQL Server 数据库
<a name="SQLServer.Procedural.Importing"></a>

Amazon RDS 支持使用完整备份文件 (.bak 文件) 对 Microsoft SQL Server 数据库进行本机备份和还原。当您使用 RDS 时，您将访问存储在 Amazon S3 中的文件，而不是使用数据库服务器上的本地文件系统。

例如，您可以从本地服务器创建完整备份，将该备份存储到 S3 上，然后将其还原到现有 Amazon RDS 数据库实例。您还可以从 RDS 进行备份，将其存储在 S3 上，然后在需要的任何位置还原它们。

本机备份和还原适用于所有 AWS 区域中的单可用区和多可用区数据库实例，包括具有只读副本的多可用区数据库实例。本机备份和还原适用于 Amazon RDS 支持的所有 Microsoft SQL Server 版本。

下图说明了支持的方案。

![\[本机备份和还原架构\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQL-bak-file.png)


使用本机 .bak 文件备份和还原数据库通常是备份和还原数据库的最快方法。此外，使用本机备份和还原还提供了很多其他优势。例如，您可以执行以下操作：
+ 将数据库迁移到 Amazon RDS 或从后者迁移数据库。
+ 在 RDS for SQL Server 数据库实例之间移动数据库。
+ 迁移 .bak 文件中的数据、架构、存储过程、触发器和其他数据库代码。
+ 备份和还原单个数据库，而不是整个数据库实例。
+ 创建用于开发、测试、培训和演示的数据库副本。
+ 通过 Amazon S3 传输备份文件，为您提供一层额外保护以进行灾难恢复。
+ 创建开启了透明数据加密 (TDE) 的数据库的本机备份，并将这些备份还原到本地数据库。有关更多信息，请参阅 [SQL Server 中的透明数据加密支持](Appendix.SQLServer.Options.TDE.md)。
+ 将开启了 TDE 的本地数据库的本机备份还原到 RDS for SQL Server 数据库实例。有关更多信息，请参阅 [SQL Server 中的透明数据加密支持](Appendix.SQLServer.Options.TDE.md)。

**Contents**
+ [限制和建议](#SQLServer.Procedural.Importing.Native.Limitations)
+ [针对本机备份和还原进行设置](SQLServer.Procedural.Importing.Native.Enabling.md)
  + [为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)
+ [使用本机备份和还原](SQLServer.Procedural.Importing.Native.Using.md)
  + [备份数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Backup)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Backup.Syntax)
    + [示例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Backup.Examples)
  + [还原数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Syntax)
    + [示例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Examples)
  + [还原日志](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log.Syntax)
    + [示例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log.Examples)
  + [完成数据库还原](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Finish.Restore)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Finish.Restore.Syntax)
  + [处理部分还原的数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Partially.Restored)
    + [删除部分还原的数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Drop.Partially.Restored)
    + [部分还原的数据库的快照还原和时间点恢复行为](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Snapshot.Restore)
  + [取消任务](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Cancel)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Cancel.Syntax)
  + [跟踪任务的状态](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking)
    + [用法](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Syntax)
    + [示例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Examples)
    + [响应](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Response)
+ [压缩备份文件](SQLServer.Procedural.Importing.Native.Compression.md)
+ [故障排除](SQLServer.Procedural.Importing.Native.Troubleshooting.md)
+ [使用其他方法导入和导出 SQL Server 数据](SQLServer.Procedural.Importing.Snapshots.md)
  + [使用快照将数据导入 RDS for SQL Server](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Importing.Procedure)
    + [导入数据](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.Import)
      + [生成和发布脚本向导](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.ScriptWizard)
      + [导入和导出向导](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.ImportExportWizard)
      + [批量复制](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.BulkCopy)
  + [从 RDS for SQL Server 中导出数据](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting)
    + [SQL Server 导入和导出向导](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting.SSIEW)
    + [SQL Server 生成和发布脚本向导与 bcp 实用工具](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting.SSGPSW)
+ [从 Linux 中使用 BCP 实用程序导入和导出数据](SQLServer.Procedural.Importing.BCP.Linux.md)
  + [先决条件](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Prerequisites)
  + [在 Linux 上安装 SQL Server 命令行工具](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Installing)
  + [从 RDS for SQL Server 中导出数据](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting)
    + [基本导出语法](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting.Basic)
    + [导出示例](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting.Example)
  + [将数据导入到 RDS for SQL Server](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing)
    + [基本导入语法](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing.Basic)
    + [导入示例](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing.Example)
  + [常用 BCP 选项](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Options)
  + [最佳实践和注意事项](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.BestPractices)
  + [排查常见 问题](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Troubleshooting)

## 限制和建议
<a name="SQLServer.Procedural.Importing.Native.Limitations"></a>

以下是有关对本机备份和还原的使用的一些限制：
+ 您不能备份到与您的 Amazon RDS 数据库实例不同的AWS区域中的某个 Amazon S3 存储桶或从该存储桶中进行还原。
+ 如果存在同名的现有数据库，则无法还原数据库。数据库名称是唯一的。
+ 强烈建议您不要将备份从一个时区还原到另一个时区。如果您将备份从一个时区还原到另一个时区，则必须审核您的查询和应用程序以查看时区更改的影响。
+ RDS for Microsoft SQL Server 具有每个文件 5TB 的大小限制。若要在本机备份更大的数据库，则可以使用多文件备份。
+ 可以备份到 S3 的最大数据库大小取决于数据库实例上的可用内存、CPU、I/O 和网络资源。数据库越大，备份代理占用的内存就越多。
+ 不能同时对 10 个以上的备份文件执行备份或还原操作。
+ 差异备份基于上一个完整备份。要使差异备份起作用，您不能在上一个完整备份和差异备份之间拍摄快照。如果您需要差异备份，但存在手动或自动快照，请先进行另一个完整备份，然后再继续进行差异备份。
+ 其文件的 file\$1guid（唯一标识符）设置为 `NULL` 的数据库不支持差异还原和日志还原。
+ 您最多可以同时运行两个备份或还原任务。
+ 您无法在 Amazon RDS 上从 SQL Server 执行本机日志备份。
+ RDS 支持最大 64 TiB 的数据库本机还原。SQL Server Express Edition 上的数据库的本机还原限制为 10 GB。
+ 您无法在维护时段内或在 Amazon RDS 处于创建数据库快照过程中的任何时间对数据库进行本机备份。如果本机备份任务与 RDS 每日备份时段重叠，则会取消本机备份任务。
+ 在多可用区数据库实例上，您只能在本机还原在完全恢复模式下备份的数据库。
+ 不支持在事务内调用 RDS 过程进行本机备份和还原。
+ 请使用对称加密 AWS KMS key 来加密您的备份。Amazon RDS 不支持非对称 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。
+ 本机备份文件使用“仅加密”加密模式通过指定的 KMS 密钥加密。当您还原加密的备份文件时，注意它们是使用“仅加密”加密模式加密的。
+ 您无法还原包含 FILESTREAM 文件组的数据库。
+ 当您将 `@enable_bucket_default_encryption=1` 传入备份存储过程时，Amazon S3 使用 AWS KMS（SSE-KMS）的服务器端加密可通过 S3 存储桶的默认加密配置进行支持。默认情况下，还原支持 S3 对象的服务器端加密。

  当您向存储过程提供 KMS 密钥时，任何原生备份和还原都将使用该 KMS 密钥在客户端上进行加密和解密。如果 `@enable_bucket_default_encryption=0`，AWS 使用 SSE-S3 将备份存储在 S3 存储桶中；如果 `@enable_bucket_default_encryption=1`，则使用 S3 存储桶配置的默认加密密钥。
+ 使用 S3 接入点时，无法将接入点配置为使用 RDS 内部 VPC。
+ 为了获得最高性能，我们建议您使用目录存储桶或目录存储桶的接入点（如果您所在的地区提供接入点）。

如果在创建、复制和还原备份文件时，您的数据库可处于脱机状态，建议您使用本机备份和还原将其迁移到 RDS。如果您的本地数据库不能处于脱机状态，建议您使用 AWS Database Migration Service 将您的数据库迁移到 Amazon RDS。有关更多信息，请参阅[什么是 AWS Database Migration Service？](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 

本机备份和还原不是为了替换跨区域快照复制功能的数据恢复功能。建议您使用快照复制为 Amazon RDS 中的跨区域灾难恢复将数据库快照复制到另一AWS区域。有关更多信息，请参阅 [复制 Amazon RDS 的数据库快照](USER_CopySnapshot.md)。

# 针对本机备份和还原进行设置
<a name="SQLServer.Procedural.Importing.Native.Enabling"></a>

要设置本机备份和还原，您需要三个组件：

1. 用于存储备份文件的 Amazon S3 存储桶。

   您必须将 S3 存储桶用于备份文件，然后上传您要迁移到 RDS 的备份。如果您已有一个 Amazon S3 存储桶，则可以使用它。如果没有，则可以[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)。或者，您可以选择在使用 `SQLSERVER_BACKUP_RESTORE` 添加 AWS 管理控制台 选项时为自己创建新的存储桶。

   有关使用 S3 的信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)

1. 用于访问存储桶的 AWS Identity and Access Management (IAM) 角色。

   如果您已有一个 IAM 角色，则可以使用它。您可以选择在使用AWS 管理控制台添加 `SQLSERVER_BACKUP_RESTORE` 选项时为自己创建新的 IAM 角色。或者，您可以手动创建一个新的角色。

   如果您想要手动创建新的 IAM 角色，请使用下一部分中介绍的方法。如果要将信任关系和权限策略附加到现有 IAM 角色，请执行相同操作。

1. 已添加到数据库实例上选项组的 `SQLSERVER_BACKUP_RESTORE` 选项。

   要在数据库实例上启用本机备份和还原，请将 `SQLSERVER_BACKUP_RESTORE` 选项添加到数据库实例上的选项组。有关更多信息和说明，请参阅 [SQL Server 中对本机备份和还原的支持](Appendix.SQLServer.Options.BackupRestore.md)。

## 为本机备份和还原手动创建 IAM 角色
<a name="SQLServer.Procedural.Importing.Native.Enabling.IAM"></a>

如果要手动创建新的 IAM 角色以用于本机备份和还原，可以这样做。在这种情况下，您将创建一个角色，以将权限从 Amazon RDS 服务委派给 Amazon S3 存储桶。创建 IAM 角色时，您将附加信任关系和权限策略。信任关系允许 RDS 代入此角色。这些权限策略定义此角色可以执行的操作。有关创建角色的更多信息，请参阅[创建将权限委派给 AWS 服务的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

对于本机备份和还原功能，可使用类似于本节中以下示例的信任关系和权限策略。在下面的示例中，我们使用服务委托人名称 `rds.amazonaws.com` 作为所有服务账户的别名。在其他示例中，我们指定 Amazon Resource Name (ARN) 以标识我们在信任策略中授予访问权限的其他账户、用户或角色。

我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
+ 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
+ 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 ARN。对于本机备份和还原，请确保同时包含数据库选项组和数据库实例，如以下示例所示。

**Example 与本机备份和还原的全局条件上下文键的信任关系**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": [
                        "arn:aws:rds:Region:0123456789:db:db_instance_identifier",
                        "arn:aws:rds:Region:0123456789:og:option_group_name"
                    ],
                    "aws:SourceAccount": "0123456789"
                }
            }
        }
    ]
}
```

以下示例使用 ARN 指定资源。有关使用 ARN 的更多信息，请参阅 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

**Example 不带加密支持的适用于本机备份和还原的权限策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:GetObjectAttributes",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

**Example 带加密支持的适用于本机备份和还原的权限策略**  
若要对备份文件进行加密，可在权限策略中包含加密密钥。有关加密密钥的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[入门](https://docs.aws.amazon.com/kms/latest/developerguide/getting-started.html)。  
您必须使用对称加密 KMS 密钥来加密您的备份。Amazon RDS 不支持非对称 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。  
IAM 角色还必须是 KMS 密钥的密钥用户和密钥管理员，也就是说，必须在密钥策略中指定该密钥。有关更多信息，请参阅 [AWS Key Management Service开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。  
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessToKey",
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id"
    },
    {
      "Sid": "AllowAccessToS3",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
    },
    {
      "Sid": "GetS3Info",
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectAttributes",
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
    }
  ]
}
```

**Example 使用不支持加密的接入点进行本机备份和还原的权限策略**  
使用 S3 接入点所需的操作与 S3 存储桶相同。资源路径已更新，以匹配 S3 接入点 ARN 模式。  
接入点必须配置为使用**网络来源：互联网**，因为 RDS 不发布私有 VPC。来自 RDS 实例的 S3 流量不会经过公共互联网，因为它会经过私有 VPC。  
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
                ],
            "Resource": [
            "arn:aws:s3:us-east-1:111122223333:accesspoint/amzn-s3-demo-ap",
            "arn:aws:s3:::underlying-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectAttributes",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
                ],
                "Resource": [
                "arn:aws:s3:us-east-1:111122223333:accesspoint/amzn-s3-demo-ap/*",
                    "arn:aws:s3:::underlying-bucket/*"
                    ]
                }
            ]   
}
```

**Example 使用不支持加密的目录存储桶中的接入点进行本机备份和还原的权限策略**  
目录存储桶使用的[基于会话的授权机制](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-authenticating-authorizing.html)与通用型存储桶不同，因此本机备份还原所需的唯一权限是存储桶级别的“s3express:CreateSession”权限。要配置对象级别的访问权限，必须使用[目录存储桶的接入点](https://docs.aws.amazon.com//AmazonS3/latest/userguide/access-points-directory-buckets-policies.html)。  
接入点必须配置为使用**网络来源：互联网**，因为 RDS 不发布私有 VPC。来自 RDS 实例的 S3 流量不会经过公共互联网，因为它会经过私有 VPC。  
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action": "s3express:CreateSession",
        "Resource": 
            [
                "arn:aws:s3express:us-east-1:111122223333:accesspoint/amzn-s3-demo-accesspoint--use1-az6--xa-s3",
                "arn:aws:s3express:us-east-1:111122223333:bucket/amzn-s3-demo-bucket--use1-az6--x-s3"
            ]
        }
    ]
}
```

# 使用本机备份和还原
<a name="SQLServer.Procedural.Importing.Native.Using"></a>

在启用并配置本机备份和还原功能后，可以开始使用该功能。先连接到您的 Microsoft SQL Server 数据库，然后调用 Amazon RDS 存储过程来执行该操作。有关连接到数据库的说明，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

某些存储过程要求您向 Amazon S3 存储桶和文件提供 Amazon Resource Name (ARN)。您的 ARN 的格式为 `arn:aws:s3:::bucket_name/file_name.extension`。Amazon S3 不需要在 ARN 中使用账号或 AWS 区域。

如果您还提供可选 KMS 密钥，则密钥 ARN 的格式为 `arn:aws:kms:region:account-id:key/key-id`。有关更多信息，请参阅 [Amazon Resource Name (ARN) 和 AWS 服务命名空间](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。您必须使用对称加密 KMS 密钥来加密您的备份。Amazon RDS 不支持非对称 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。

**注意**  
无论您是否使用 KMS 密钥，本机备份和还原任务都会对上传到 S3 的文件默认通过 SSE-S3 启用服务器端高级加密标准（AES）256 位加密。将 `@enable_bucket_default_encryption=1` 传入备份存储过程时，使用 S3 存储桶配置的默认加密密钥。

有关如何调用每个存储过程的说明，请参阅以下主题：
+ [备份数据库](#SQLServer.Procedural.Importing.Native.Using.Backup)
+ [还原数据库](#SQLServer.Procedural.Importing.Native.Using.Restore)
+ [还原日志](#SQLServer.Procedural.Importing.Native.Restore.Log)
+ [完成数据库还原](#SQLServer.Procedural.Importing.Native.Finish.Restore)
+ [处理部分还原的数据库](#SQLServer.Procedural.Importing.Native.Partially.Restored)
+ [取消任务](#SQLServer.Procedural.Importing.Native.Using.Cancel)
+ [跟踪任务的状态](#SQLServer.Procedural.Importing.Native.Tracking)

## 备份数据库
<a name="SQLServer.Procedural.Importing.Native.Using.Backup"></a>

要备份数据库，请使用 `rds_backup_database` 存储过程。

**注意**  
您无法在维护时段内对数据库进行备份，也无法在 Amazon RDS 拍摄快照时对数据库进行备份。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Backup.Syntax"></a>

```
exec msdb.dbo.rds_backup_database
	@source_db_name='database_name',
	@s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name.extension',
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],	
	[@overwrite_s3_backup_file=0|1],
	[@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n],
	[@type='DIFFERENTIAL|FULL'],
	[@number_of_files=n],
	[@enable_bucket_default_encryption=0|1];
```

以下参数为必需参数：
+ `@source_db_name` – 要备份的数据库的名称。
+ `@s3_arn_to_backup_to`：ARN，指示要用于备份的 Amazon S3 存储桶、接入点、目录存储桶或目录存储桶的接入点，以及备份文件的名称。

  此文件可以具有任何扩展名，但通常使用 `.bak`。请注意，接入点 ARN 的格式必须为 `arn:aws:s3:us-east-1:111122223333:access-point-name/object/key`。

以下参数可选：
+ `@kms_master_key_arn` – 用于加密项目的对称加密 KMS 密钥的 ARN。
  + 您不能使用默认加密密钥。如果使用默认密钥，则不会备份数据库。
  +  如果未指定 KMS 密钥标识符，则不会对备份文件进行加密。有关更多信息，请参阅[加密 Amazon RDS 资源](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html)。
  + 指定 KMS 密钥时，将使用客户端加密。
  + Amazon RDS 不支持非对称 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。
+ `@overwrite_s3_backup_file` – 指示是否覆盖现有备份文件的值。
  + `0` – 不覆盖现有文件。此值是默认值。

    如果文件已存在，则将 `@overwrite_s3_backup_file` 设置为 0 会返回错误。
  + `1` – 覆盖具有指定名称的现有文件，即使该文件不是备份文件也是如此。
+ `@type` – 备份的类型。
  + `DIFFERENTIAL` – 进行差异备份。
  + `FULL` – 进行完整备份。此值是默认值。

  差异备份基于上一个完整备份。要使差异备份起作用，您不能在上一个完整备份和差异备份之间拍摄快照。如果您需要差异备份，但快照存在，请先进行另一个完整备份，然后再继续进行差异备份。

  您可以使用以下示例 SQL 查询来查找上一个完整备份或快照：

  ```
  select top 1
  database_name
  , 	backup_start_date
  , 	backup_finish_date
  from    msdb.dbo.backupset
  where   database_name='mydatabase'
  and     type = 'D'
  order by backup_start_date desc;
  ```
+ `@number_of_files` – 备份将被划分（分块）成的文件数。最大文件数为 10。
  + 完整备份和差异备份都支持多文件备份。
  + 如果您输入值 1 或省略该参数，则会创建单个备份文件。

  请提供文件拥有的通用前缀，然后使用星号 (`*`) 为其添加后缀。星号可位于 S3 ARN 的 *file\$1name* 部分中的任意位置。星号由所生成文件中的一系列字母数字字符串替换，从 `1-of-number_of_files` 开始。

  例如，如果 S3 ARN 中的文件名为 `backup*.bak` 并且您已设置 `@number_of_files=4`，则生成的备份文件为 `backup1-of-4.bak`、`backup2-of-4.bak`、`backup3-of-4.bak` 和 `backup4-of-4.bak`。
  + 如果任意文件名已存在，并且 `@overwrite_s3_backup_file` 设置为 0，则会返回错误。
  + 在 S3 ARN 的 *file\$1name* 部分，多文件备份只能有一个星号。
  + 单文件备份可以在 S3 ARN 的 *file\$1name* 部分中包含任意数量的星号。星号不会从所生成的文件名中删除。
+ `@block_size` – 块大小（以字节为单位），指定备份操作的物理块大小。有效值为 512、1024、2048、4096、8192、16384、32768 和 65536
+ `@max_transfer_size` – 最大传输大小表示备份过程中每次 I/O 操作传输的数据量（以字节为单位）的上限。有效值是 65536 字节（64 KB）到 4194304 字节（4 MB）的倍数。
+ `@buffer_count` – 用于备份过程的 I/O 缓冲区总数。
+ `@enable_bucket_default_encryption`：一个值，指示是否使用 S3 存储桶的默认加密配置，在 S3 中进行服务器端加密。无论此设置如何，目录存储桶始终使用存储桶的默认加密配置。
  + `0` – 服务器端加密通过 SSE-S3 使用 256 位高级加密标准（AES）。
  + `1` – 服务器端加密使用 S3 存储桶配置的[默认加密](https://docs.aws.amazon.com//AmazonS3/latest/userguide/bucket-encryption.html)。

### 示例
<a name="SQLServer.Procedural.Importing.Native.Backup.Examples"></a>

**Example 差异备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup1.bak',
@overwrite_s3_backup_file=1,
@type='DIFFERENTIAL';
```

**Example 使用客户端加密的完整备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup1.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE',
@overwrite_s3_backup_file=1,
@type='FULL';
```

**Example 多文件备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=4;
```

**Example 多文件差异备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@type='DIFFERENTIAL',
@number_of_files=4;
```

**Example 使用加密的多文件备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE',
@number_of_files=4;
```

**Example 使用 S3 覆盖进行多文件备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@overwrite_s3_backup_file=1,
@number_of_files=4;
```

**Example 使用块大小进行备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@block_size=512;
```

**Example 使用 `@max_transfer_size` 和 `@buffer_count` 进行多文件备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=4,
@max_transfer_size=4194304,
@buffer_count=10;
```

**Example 使用 @number\$1of\$1files 参数进行单文件备份**  
此示例生成一个名为 `backup*.bak` 的备份文件。  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=1;
```

**Example 使用服务器端加密的完整备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@overwrite_s3_backup_file=1,
@type='FULL',
@enable_bucket_default_encryption=1;
```

**Example 使用接入点进行完整备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/object/backup1.bak',
@overwrite_s3_backup_file=1,
@type='FULL';
```

**Example 使用目录存储桶的接入点进行完整备份**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3express:us-east-1:123456789012:accesspoint/my-access-point--use1-az6--xa-s3/object/backup1.bak',
@overwrite_s3_backup_file=1,
@type='FULL';
```

## 还原数据库
<a name="SQLServer.Procedural.Importing.Native.Using.Restore"></a>

要还原数据库，请调用 `rds_restore_database` 存储过程。还原任务完成且数据库打开后，Amazon RDS 将创建数据库的初始快照。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Restore.Syntax"></a>

```
exec msdb.dbo.rds_restore_database
	@restore_db_name='database_name',
	@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name.extension',
	@with_norecovery=0|1,
	[@keep_cdc=0|1],
	[@data_file_volume='D:|H:|I:|J:'],
	[@log_file_volume='D:|H:|I:|J:'],
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
        [@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n],
	[@type='DIFFERENTIAL|FULL'];
```

以下参数为必需参数：
+ `@restore_db_name`– 要还原的数据库的名称。数据库名称是唯一的。如果存在同名的现有数据库，则无法还原数据库。
+ `@s3_arn_to_restore_from` – 指示用于还原数据库的备份文件的 Amazon S3 前缀和名称的 ARN。
  + 对于单文件备份，请提供整个文件名。
  + 对于多文件备份，请提供文件拥有的通用前缀，然后使用星号 (`*`) 为其添加后缀。
    + 如果使用目录存储桶，则由于[目录存储桶的差异](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-differences.html)，ARN 必须以 `/*` 结尾。
  + 如果 `@s3_arn_to_restore_from` 为空，则返回以下错误消息：S3 ARN prefix cannot be empty (S3 ARN 前缀不能为空)。

以下参数对于差异还原是必需的，但对于完整还原是可选的：
+ `@with_norecovery` – 用于还原操作的恢复子句。
  + 将它设置为 `0` 来使用 RECOVERY 进行还原。在这种情况下，在还原后，数据库将处于在线状态。
  + 将它设置为 `1` 来使用 NORECOVERY 进行还原。在这种情况下，在还原任务完成后，数据库将保持 RESTORING 状态。使用这种方法，您可以执行以后的差异还原。
  + 对于 DIFFERENTIAL 还原，请指定 `0` 或 `1`。
  + 对于 `FULL` 还原，此值默认为 `0`。

以下参数可选：
+ `@keep_cdc` – 表示是否在还原的数据库上保留更改数据捕获（CDC）配置。设为 `1` 可启用 KEEP\$1CDC，设为 `0` 可禁用。默认值为 `0`。
+ `@data_file_volume`：指定数据库数据文件的驱动器盘符。默认值为 `D:`。
+ `@log_file_volume`：指定数据库日志文件的驱动器盘符。默认值为 `D:`。
+ `@kms_master_key_arn` - 如果您已对备份文件进行加密，则 KMS 密钥用于解密文件。

  指定 KMS 密钥时，将使用客户端加密。
+ `@type` – 还原的类型。有效类型为 `DIFFERENTIAL` 和 `FULL`。默认值为 `FULL`。
+ `@block_size` – 块大小（以字节为单位），指定备份操作的物理块大小。有效值为 512、1024、2048、4096、8192、16384、32768 和 65536
+ `@max_transfer_size` – 最大传输大小表示备份过程中每次 I/O 操作传输的数据量（以字节为单位）的上限。有效值是 65536 字节（64 KB）到 4194304 字节（4 MB）的倍数。
+ `@buffer_count` – 用于备份过程的 I/O 缓冲区总数。

**注意**  
对于差异还原，数据库必须处于 RESTORING 状态，或者必须已存在使用 NORECOVERY 还原的任务。  
在数据库处于在线状态时，您无法还原以后的差异备份。  
您无法为已具有使用 RECOVERY 的挂起还原任务的数据库提交还原任务。  
不支持同时使用 NORECOVERY 和 KEEP\$1CDC 的完整还原。  
具有跨区域只读副本的实例并不支持所有原生还原。  
对于支持的配置，在具有只读副本的多可用区实例上还原数据库类似于在多可用区实例上还原数据库。您无需执行任何其他操作，即可在副本上还原数据库。

### 示例
<a name="SQLServer.Procedural.Importing.Native.Restore.Examples"></a>

**Example 单文件还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak';
```

**Example 多文件还原**  
为避免还原多个文件时出错，请确保所有备份文件有相同的前缀且没有任何其他文件使用该前缀。  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup*';
```

**Example 使用 RECOVERY 的完整数据库还原**  
以下三个示例执行相同的任务，即使用 RECOVERY 进行完整还原。  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak';
```

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
[@type='DIFFERENTIAL|FULL'];
```

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='FULL',
@with_norecovery=0;
```

**Example 使用加密进行完整数据库还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

**Example 使用块大小进行还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@block_size=512;
```

**Example 使用 @max\$1transfer\$1size 和 @buffer\$1count 进行多文件还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup*',
@max_transfer_size=4194304,
@buffer_count=10;
```

**Example 使用 NORECOVERY 进行完整数据库还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='FULL',
@with_norecovery=1;
```

**Example 使用 NORECOVERY 的差异还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='DIFFERENTIAL',
@with_norecovery=1;
```

**Example 使用 RECOVERY 的差异还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='DIFFERENTIAL',
@with_norecovery=0;
```

**Example 使用 RECOVERY 的完整数据库还原（使用接入点）**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/object/backup1.bak',
@with_norecovery=0;
```

**Example 使用 KEEP\$1CDC 的完整数据库还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@keep_cdc=1;
```

## 还原日志
<a name="SQLServer.Procedural.Importing.Native.Restore.Log"></a>

要还原日志，请调用 `rds_restore_log` 存储过程。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Restore.Log.Syntax"></a>

```
exec msdb.dbo.rds_restore_log 
	@restore_db_name='database_name',
	@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/log_file_name.extension',
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
	[@with_norecovery=0|1],
	[@keep_cdc=0|1],
	[@stopat='datetime'],
	[@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n];
```

以下参数为必需参数：
+ `@restore_db_name` – 要还原其日志的数据库的名称。
+ `@s3_arn_to_restore_from` – 指示用于还原日志的日志文件的 Amazon S3 前缀和名称的 ARN。此文件可以具有任何扩展名，但通常使用 `.trn`。

  如果 `@s3_arn_to_restore_from` 为空，则返回以下错误消息：S3 ARN prefix cannot be empty (S3 ARN 前缀不能为空)。

以下参数可选：
+ `@keep_cdc` – 表示是否在还原的数据库上保留更改数据捕获（CDC）配置。设为 1 可启用 KEEP\$1CDC，设为 0 可禁用。默认值是 0。
+ `@kms_master_key_arn` - 如果您已对日志进行加密，则 KMS 密钥用于解密日志。
+ `@with_norecovery` – 用于还原操作的恢复子句。此值默认为 `1`。
  + 将它设置为 `0` 来使用 RECOVERY 进行还原。在这种情况下，在还原后，数据库将处于在线状态。在数据库处于在线状态时，您无法还原其他日志备份。
  + 将它设置为 `1` 来使用 NORECOVERY 进行还原。在这种情况下，在还原任务完成后，数据库将保持 RESTORING 状态。使用这种方法，您可以执行以后的日志还原。
+ `@stopat` – 指定将数据库还原到其在指定的日期和时间的状态的值（采用日期时间格式）。仅将在指定日期和时间之前写入的事务日志记录应用于数据库。

  如果未指定此参数（它为 NULL），则会还原完整的日志。
+ `@block_size` – 块大小（以字节为单位），指定备份操作的物理块大小。有效值为 512、1024、2048、4096、8192、16384、32768 和 65536
+ `@max_transfer_size` – 最大传输大小表示备份过程中每次 I/O 操作传输的数据量（以字节为单位）的上限。有效值是 65536 字节（64 KB）到 4194304 字节（4 MB）的倍数。
+ `@buffer_count` – 用于备份过程的 I/O 缓冲区总数。

**注意**  
对于日志还原，数据库必须处于 restoring 状态，或者必须已存在使用 NORECOVERY 还原的任务。  
在数据库处于在线状态时，您无法还原日志备份。  
您无法在已具有使用 RECOVERY 的挂起还原任务的数据库上提交日志还原任务。

### 示例
<a name="SQLServer.Procedural.Importing.Native.Restore.Log.Examples"></a>

**Example 日志还原**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn';
```

**Example 使用加密的日志还原**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

**Example 使用 NORECOVERY 的日志还原**  
以下两个示例执行相同的任务，即使用 NORECOVERY 进行日志还原。  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=1;
```

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn';
```

**Example 使用块大小进行还原**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@block_size=512;
```

**Example 使用 RECOVERY 的日志还原**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=0;
```

**Example 使用 STOPAT 子句的日志还原**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=0,
@stopat='2019-12-01 03:57:09';
```

**Example 使用 KEEP\$1CDC 的日志还原**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@keep_cdc=1;
```

## 完成数据库还原
<a name="SQLServer.Procedural.Importing.Native.Finish.Restore"></a>

如果数据库上的上一个还原任务是使用 `@with_norecovery=1` 执行的，则数据库现在处于 RESTORING 状态。使用 `rds_finish_restore` 存储过程打开此数据库以执行常规操作。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Finish.Restore.Syntax"></a>

```
exec msdb.dbo.rds_finish_restore @db_name='database_name';
```

**注意**  
要使用此方法，数据库必须处于 RESTORING 状态，且没有任何挂起的还原任务。  
要完成数据库还原，请使用主登录名。或使用最近使用 NORECOVERY 还原数据库或日志的用户登录名。

## 处理部分还原的数据库
<a name="SQLServer.Procedural.Importing.Native.Partially.Restored"></a>

### 删除部分还原的数据库
<a name="SQLServer.Procedural.Importing.Native.Drop.Partially.Restored"></a>

要删除部分还原的数据库（保留为 RESTORING 状态），请使用 `rds_drop_database` 存储过程。

```
exec msdb.dbo.rds_drop_database @db_name='database_name';
```

**注意**  
您无法为已具有挂起的还原或完成还原任务的数据库提交 DROP 数据库请求。  
要删除数据库，请使用主登录名。或使用最近使用 NORECOVERY 还原数据库或日志的用户登录名。

### 部分还原的数据库的快照还原和时间点恢复行为
<a name="SQLServer.Procedural.Importing.Native.Snapshot.Restore"></a>

在快照还原和时间点恢复期间，将从目标实例中删除源实例中的部分还原的数据库（保留为 RESTORING 状态）。

## 取消任务
<a name="SQLServer.Procedural.Importing.Native.Using.Cancel"></a>

要取消备份或还原任务，请调用 `rds_cancel_task` 存储过程。

**注意**  
您无法取消 FINISH\$1RESTORE 任务。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Cancel.Syntax"></a>

```
exec msdb.dbo.rds_cancel_task @task_id=ID_number;
```

以下参数是必需参数：
+ `@task_id`– 要取消的任务的 ID。可以通过调用 `rds_task_status` 获取任务 ID。

## 跟踪任务的状态
<a name="SQLServer.Procedural.Importing.Native.Tracking"></a>

要跟踪备份和还原任务的状态，请调用 `rds_task_status` 存储过程。如果您未提供任何参数，则存储过程将返回所有任务的状态。任务的状态约每 2 分钟更新一次。任务历史记录保留 36 天。

### 用法
<a name="SQLServer.Procedural.Importing.Native.Tracking.Syntax"></a>

```
exec msdb.dbo.rds_task_status
	[@db_name='database_name'],
	[@task_id=ID_number];
```

以下参数可选：
+ `@db_name`– 要显示其任务状态的数据库的名称。
+ `@task_id`– 要显示其任务状态的任务的 ID。

### 示例
<a name="SQLServer.Procedural.Importing.Native.Tracking.Examples"></a>

**Example 列出特定任务的状态**  

```
exec msdb.dbo.rds_task_status @task_id=5;
```

**Example 列出特定数据库和任务的状态**  

```
exec msdb.dbo.rds_task_status
@db_name='my_database',
@task_id=5;
```

**Example 列出特定数据库上的所有任务及其状态**  

```
exec msdb.dbo.rds_task_status @db_name='my_database';
```

**Example 列出当前实例上的所有任务及其状态**  

```
exec msdb.dbo.rds_task_status;
```

### 响应
<a name="SQLServer.Procedural.Importing.Native.Tracking.Response"></a>

`rds_task_status` 存储过程返回以下列。


****  

| 列 | 描述 | 
| --- | --- | 
| `task_id` |  任务的 ID。  | 
| `task_type` |  任务类型取决于输入参数，如下所示： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html) 在完成以下还原任务时打开数据库后，Amazon RDS 创建数据库的初始快照： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html)  | 
| `database_name` |  与任务关联的数据库的名称。  | 
| `% complete` |  用百分比值表示的任务进度。  | 
| `duration (mins)` |  在任务上花费的时间 (以分钟为单位)。  | 
| `lifecycle` |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html)  | 
| `task_info` |  有关任务的其他信息。 如果在备份或还原数据库时出错，则此列将包含有关错误的信息。有关可能的错误列表以及缓解策略，请参阅 [故障排除](SQLServer.Procedural.Importing.Native.Troubleshooting.md)。  | 
| `last_updated` |  上次更新任务状态的日期和时间。状态每隔 5% 的进度更新一次。  | 
| `created_at` | 任务的创建日期和时间。 | 
| S3\$1object\$1arn | 指示要备份或还原的文件的 Amazon S3 前缀和名称的 ARN。 | 
| `overwrite_s3_backup_file` |  调用备份任务时指定的 `@overwrite_s3_backup_file` 参数的值。有关更多信息，请参阅 [备份数据库](#SQLServer.Procedural.Importing.Native.Using.Backup)。  | 
| KMS\$1master\$1key\$1arn | 用于加密 (对于备份) 和解密 (对于还原) 的 KMS 密钥的 ARN。 | 
| filepath | 不适用于本机备份和还原任务。 | 
| overwrite\$1file | 不适用于本机备份和还原任务。 | 

# 压缩备份文件
<a name="SQLServer.Procedural.Importing.Native.Compression"></a>

要节省 Amazon S3 存储桶中的空间，您可以压缩备份文件。有关压缩备份文件的更多信息，请参阅 Microsoft 文档中的[备份压缩](https://msdn.microsoft.com/en-us/library/bb964719.aspx)。

以下数据库版本支持压缩您的备份文件：
+ Microsoft SQL Server 企业版 
+ Microsoft SQL Server 标准版 

要验证备份文件的压缩选项，请运行以下代码：

```
1. exec rdsadmin.dbo.rds_show_configuration 'S3 backup compression';
```

要为备份文件启用压缩，请运行以下代码：

```
1. exec rdsadmin.dbo.rds_set_configuration 'S3 backup compression', 'true';
```

要为备份文件禁用压缩，请运行以下代码：

```
1. exec rdsadmin.dbo.rds_set_configuration 'S3 backup compression', 'false';
```

# 故障排除
<a name="SQLServer.Procedural.Importing.Native.Troubleshooting"></a>

以下是您使用本地备份和还原时可能会遇到的问题。


****  

| 问题 | 故障排除建议 | 
| --- | --- | 
|  数据库备份/恢复选项尚未启用或启用中。请稍后重试。  |  请确保您已将 `SQLSERVER_BACKUP_RESTORE` 选项添加到与数据库实例关联的数据库选项组。有关更多信息，请参阅 [添加本机备份和还原选项](Appendix.SQLServer.Options.BackupRestore.md#Appendix.SQLServer.Options.BackupRestore.Add)。  | 
|  对象“*rds\$1backup\$1database*”（数据库“msdb”，架构“dbo”）上的 EXECUTE 权限遭拒绝。  |  确保在执行存储过程时使用主用户。如果您以主用户身份登录后仍遇到此错误，则可能是由于管理员用户权限不符。要重置主用户，请使用 AWS 管理控制台。请参阅[重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)。  | 
|  对象“*rds\$1restore\$1database*”（数据库“msdb”，架构“dbo”）上的 EXECUTE 权限遭拒绝。  |  确保在执行存储过程时使用主用户。如果您以主用户身份登录后仍遇到此错误，则可能是由于管理员用户权限不符。要重置主用户，请使用 AWS 管理控制台。请参阅[重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)。  | 
|  拒绝访问  | 备份或还原进程无法访问备份文件。这通常由类似于以下的问题导致： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Troubleshooting.html)  | 
|  <edition\$1name> 版本不支持带压缩的备份数据库  |  仅 Microsoft SQL Server 企业版和标准版支持压缩备份文件。 有关更多信息，请参阅“[压缩备份文件](SQLServer.Procedural.Importing.Native.Compression.md)”。  | 
|  不存在密钥 <ARN>  |  您已尝试还原一个加密备份，但未提供有效的加密密钥。检查您的加密密钥并重试。有关更多信息，请参阅“[还原数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)”。  | 
|  请使用正确的类型重新发布任务并覆盖属性  |  如果您尝试备份数据库并提供了已存在文件的名称，但将覆盖策略设置为 false，则保存操作会失败。要修复该错误，请提供不存在的文件名，或者将覆盖属性设置为 true。 有关更多信息，请参阅“[备份数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Backup)”。 还有可能是您希望还原数据库，但意外调用了 `rds_backup_database` 存储过程。在这种情况下，请改为调用 `rds_restore_database` 存储过程。 有关更多信息，请参阅“[还原数据库](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)”。 如果您希望还原数据库并调用 `rds_restore_database` 存储过程，请确保您提供了有效的备份文件名称。 有关更多信息，请参阅“[使用本机备份和还原](SQLServer.Procedural.Importing.Native.Using.md)”。  | 
|  请指定与 RDS 实例位于同一区域的存储桶  |  您不能备份到与您的 Amazon RDS 数据库实例不同的AWS区域中的某个 Amazon S3 存储桶或从该存储桶中进行还原。您可以使用 Amazon S3 复制将备份文件复制到正确的AWS区域。 有关更多信息，请参阅 Amazon S3 文档中的[跨区域复制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/crr.html)。  | 
|  指定的存储桶不存在  | 验证您使用正确格式为存储桶和文件提供了正确的 ARN。 有关更多信息，请参阅“[使用本机备份和还原](SQLServer.Procedural.Importing.Native.Using.md)”。  | 
|  用户 <ARN> 无权对 <ARN> 资源执行 <kms action>  |  您请求了加密操作，但未提供正确的 AWS KMS 权限。确保您具有正确的权限，否则，请添加权限。 有关更多信息，请参阅“[针对本机备份和还原进行设置](SQLServer.Procedural.Importing.Native.Enabling.md)”。  | 
|  还原”任务无法从 10 个以上的备份文件中恢复。请减少匹配的文件数量，然后重试。  |  减少您尝试从中还原的文件数。如有必要，您可以让每个文件变得更大。  | 
|  数据库“*database\$1name*”已存在。不允许存在两个仅大小写或重音不同的数据库。选择其他数据库名称。  |  如果存在同名的现有数据库，则无法还原数据库。数据库名称是唯一的。  | 

# 使用其他方法导入和导出 SQL Server 数据
<a name="SQLServer.Procedural.Importing.Snapshots"></a>

接下来，您可以找到有关使用快照将 Microsoft SQL Server 数据导入到 Amazon RDS 中的信息。还可以找到有关使用快照从运行 SQL Server 的 RDS 数据库实例中导出数据的信息。

如果您的方案支持此方法，则可使用本机备份和还原功能更轻松地将数据移入和移出 Amazon RDS。有关更多信息，请参阅[使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)。

**注意**  
Amazon RDS for Microsoft SQL Server 不支持将数据导入 `msdb` 数据库。

## 使用快照将数据导入 RDS for SQL Server
<a name="SQLServer.Procedural.Importing.Procedure"></a>

**使用快照将数据导入 SQL Server 数据库实例**

1. 创建数据库实例。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。

1. 阻止应用程序访问目标数据库实例。

   如果您在导入数据时阻止应用程序访问数据库实例，数据传输速度会更快。此外，您无需担心在加载数据时会因其他应用程序无法写入到数据库实例而引起冲突。如果因出现问题而必须要回滚到之前的数据库快照，则丢失的唯一更改就是导入的数据。在解决问题后，您可以再次导入这些数据。

   有关控制数据库实例访问权限的信息，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。

1. 创建目标数据库快照。

   如果目标数据库已存有数据，我们建议您先为数据库创建快照，然后再导入数据。如果数据导入过程出现问题或您想要放弃更改，您可以使用此快照将数据库还原到先前的状态。有关数据库快照的信息，请参阅 [为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)。
**注意**  
获取数据库快照时，数据库的 I/O 操作会在备份进行期间暂停一会（以毫秒为单位）。

1. 禁用目标数据库的自动备份。

   禁用目标数据库实例上的自动备份将会提高导入数据时的性能，因为 Amazon RDS 在禁用自动备份后不会记录事务。但需要考虑以下问题。执行时间点恢复时需要使用自动备份。因此，在导入数据时，无法将数据库还原到特定时间点。此外，除非您选择保留先前在数据库实例上创建的所有自动备份，否则系统会将其清除。

   选择保留自动备份有助于防止意外删除数据。Amazon RDS 还会保存数据库实例属性以及每个自动备份以便进行恢复。利用此选项，可将已删除的数据库实例还原到备份保留期内的指定时间点，即使在删除它之后也是如此。由于自动备份是用于有效数据库实例的，它们将在特定备份时段结束后自动被删除。

   您也可使用先前的快照来恢复数据库，并且您创建的所有快照仍然可用。有关自动备份的信息，请参阅 [备份简介](USER_WorkingWithAutomatedBackups.md)。

1. 禁用外键约束 (如适用)。

    如果需要禁用外键约束，可以使用以下脚本。

   ```
   --Disable foreign keys on all tables
       DECLARE @table_name SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables;
       
       OPEN table_cursor;
       FETCH NEXT FROM table_cursor INTO @table_name;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL';
         EXEC (@cmd);
         FETCH NEXT FROM table_cursor INTO @table_name;
       END
       
       CLOSE table_cursor;
       DEALLOCATE table_cursor;
       
       GO
   ```

1. 删除索引 (如果适用)。

1. 禁用触发器 (如果适用)。

    如果您需要禁用触发器，则可使用以下脚本执行该操作。

   ```
   --Disable triggers on all tables
       DECLARE @enable BIT = 0;
       DECLARE @trigger SYSNAME;
       DECLARE @table SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name,
        table_object.name table_name
       FROM sysobjects trigger_object
       JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id
       WHERE trigger_object.type = 'TR';
       
       OPEN trigger_cursor;
       FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         IF @enable = 1
            SET @cmd = 'ENABLE ';
         ELSE
            SET @cmd = 'DISABLE ';
       
         SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' ';
         EXEC (@cmd);
         FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       END
       
       CLOSE trigger_cursor;
       DEALLOCATE trigger_cursor;
       
       GO
   ```

1. 查询源 SQL Server 实例，获取要导入到目标数据库实例的所有登录名。

   SQL Server 将登录名和密码存储在 `master` 数据库中。由于 Amazon RDS 未授予访问 `master` 数据库的权限，因此您无法直接将登录名和密码导入目标数据库实例。您必须在源 SQL Server 实例上查询 `master` 数据库以生成数据定义语言 (DDL) 文件。此文件应包括要添加到目标数据库实例的所有登录名和密码。此文件还应包括要传输的角色成员资格和权限。

   有关查询 `master` 数据库的信息，请参阅 Microsoft 知识库中的 [Transfer logins and passwords between instances of SQL Server](https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/security/transfer-logins-passwords-between-instances) 。

   该脚本输出是可在目标数据库实例上运行的另一个脚本。知识库文章中的脚本包含以下代码：

   ```
   p.type IN 
   ```

   在 `p.type` 出现的所有位置，改用以下代码：

   ```
   p.type = 'S' 
   ```

1. 使用[导入数据](#ImportData.SQLServer.Import)中的方法导入数据。

1. 授予应用程序访问目标数据库实例的权限。

   完成数据导入后，您可以向导入期间被阻止的应用程序授予访问数据库实例的权限。有关控制数据库实例访问权限的信息，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。

1. 启用目标数据库实例的自动备份。

   有关自动备份的信息，请参阅 [备份简介](USER_WorkingWithAutomatedBackups.md)。

1. 启用外键约束。

    如果您之前禁用了外键约束，现在可通过以下脚本重新启用。

   ```
   --Enable foreign keys on all tables
       DECLARE @table_name SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables;
       
       OPEN table_cursor;
       FETCH NEXT FROM table_cursor INTO @table_name;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL';
         EXEC (@cmd);
         FETCH NEXT FROM table_cursor INTO @table_name;
       END
       
       CLOSE table_cursor;
       DEALLOCATE table_cursor;
   ```

1. 启用索引 (如果适用)。

1. 启用触发器 (如果适用)。

    如果您之前禁用了触发器，现在可以通过以下脚本启用触发器。

   ```
   --Enable triggers on all tables
       DECLARE @enable BIT = 1;
       DECLARE @trigger SYSNAME;
       DECLARE @table SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name,
        table_object.name table_name
       FROM sysobjects trigger_object
       JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id
       WHERE trigger_object.type = 'TR';
       
       OPEN trigger_cursor;
       FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         IF @enable = 1
            SET @cmd = 'ENABLE ';
         ELSE
            SET @cmd = 'DISABLE ';
       
         SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' ';
         EXEC (@cmd);
         FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       END
       
       CLOSE trigger_cursor;
       DEALLOCATE trigger_cursor;
   ```

### 导入数据
<a name="ImportData.SQLServer.Import"></a>

Microsoft SQL Server Management Studio 是一种包含在所有 Microsoft SQL Server 版本 (Express 版除外) 中的图像化 SQL Server 客户端。您可以从 Microsoft 上免费下载 SQL Server Management Studio Express。要找到此下载，请访问 [Microsoft 网站](https://www.microsoft.com/en-us/download)。

**注意**  
SQL Server Management Studio 应用程序只能在 Windows 环境中运行。

SQL Server Management Studio 包括能够帮助将数据导入 SQL Server 数据库实例的以下工具：
+ 生成和发布脚本向导
+ 导入和导出向导
+ 批量复制

#### 生成和发布脚本向导
<a name="ImportData.SQLServer.MgmtStudio.ScriptWizard"></a>

生成和发布脚本向导可创建一个包含数据库架构或数据本身，或兼具两者的脚本。您可以在本地 SQL Server 部署中为数据库生成脚本。然后，您可以运行该脚本以将其包含的信息传输到 Amazon RDS 数据库实例。

**注意**  
对于 1GiB 或更大的数据库，只编写数据库架构的脚本会更高效。然后，您可以使用导入和导出向导，或 SQL Server 的批量复制功能来传输数据。

有关生成和发布脚本向导的详细信息，请参阅 [Microsoft SQL Server 文档](http://msdn.microsoft.com/en-us/library/ms178078%28v=sql.105%29.aspx)。

在此向导中，请特别注意**设置脚本选项**页面中的高级选项，确保已选中脚本需要包含的所有选项。例如，默认情况下，脚本不包含数据库触发器。

生成并保存脚本后，您可以使用 SQL Server Management Studio 连接数据库实例，然后运行脚本。

#### 导入和导出向导
<a name="ImportData.SQLServer.MgmtStudio.ImportExportWizard"></a>

导入和导出向导工具可创建一种特殊的集成服务包，您可以使用此集成服务包将数据从本地 SQL Server 数据库复制到目标数据库实例。此向导可筛选要将哪些表格甚至是表格内的哪些元组复制到目标数据库实例。

**注意**  
导入和导出向导在用于大型数据集时非常有效，但是就从本地部署中远程导出数据而言，这可能不是最快的方式。要采用更快的方式，请考虑 SQL Server 批量复制功能。

有关导入和导出向导的详细信息，请参阅 [Microsoft SQL Server 文档](http://msdn.microsoft.com/en-us/library/ms140052%28v=sql.105%29.aspx)。

在此向导中，请在 **Choose a Destination (选择目标)** 页面上执行以下操作：
+ 对于 **Server Name (服务器名称)**，键入数据库实例的终端节点名称。
+ 对于服务器身份验证模式，请选择 **Use SQL Server Authentication**。
+ 对于 **User name (用户名)** 和 **Password (密码)**，请键入您为数据库实例创建的主用户凭证。

#### 批量复制
<a name="ImportData.SQLServer.MgmtStudio.BulkCopy"></a>

SQL Server 批量复制功能是一种将数据从源数据库复制到数据库实例的高效工具。批量复制可将指定的数据写入一个数据文件，如 ASCII 文件。然后您可以再次运行批量复制，将此文件内容写入目标数据库实例。

本部分使用了 **bcp** 实用工具，所有版本的 SQL Server 都包含此工具。有关批量导入和导出操作的详细信息，请参阅 [Microsoft SQL Server 文档](http://msdn.microsoft.com/en-us/library/ms187042%28v=sql.105%29.aspx)。

**注意**  
使用批量复制前，您必须先将数据库架构导入目标数据库实例。本主题前面介绍的生成和发布脚本向导这一工具非常适合用于该操作。

以下命令用于连接到本地 SQL Server 实例。它在您现有 SQL Server 部署的 C:\$1 根目录中生成指定表的制表符定界文件。指定表时需使用完全限定名，文本文件的名称与复制的表相同。

```
bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000 
```

上述代码包含以下选项：
+ `-n` 指定，批量复制将使用待复制数据的本机数据类型。
+ `-S` 指定 *bcp* 实用工具连接到的 SQL Server 实例。
+ `-U` 指定要登录到 SQL Server 实例的账户的用户名。
+ `-P` 为 指定的用户指定密码。`-U`
+ `-b` 指定每批导入数据的行数。

**注意**  
可能有对导入情况来说很重要的其他参数。例如，您可能需要与身份值有关的 `-E` 参数。有关更多信息，请参阅 [Microsoft SQL Server 文档](http://msdn.microsoft.com/en-us/library/ms162802%28v=sql.105%29.aspx)中的 **bcp** 实用工具的命令行语法的完整说明。

例如，假设某一数据库名为 `store`，使用了默认架构 `dbo` 且包含一个名为 `customers` 的表。密码为 `admin` 的用户账户 `insecure` 将 `customers` 表中的 10000 行复制到名为 `customers.txt` 的文件中。

```
bcp store.dbo.customers out C:\customers.txt -n -S localhost -U admin -P insecure -b 10000 
```

生成数据文件后，可以使用类似的命令将数据上传到数据库实例。事先在目标数据库实例上创建数据库和架构。然后使用 `in` 参数指定输入文件，而不是使用 `out` 指定输出文件。您需要指定数据库实例的终端节点，而不是使用 localhost 指定本地 SQL Server 实例。如果您使用的端口不是 1433 端口，也需要执行该指定操作。用户名和密码是数据库实例的主用户名和密码。语法如下所示。

```
bcp dbname.schema_name.table_name 
					in C:\table_name.txt -n -S endpoint,port -U master_user_name -P master_user_password -b 10000
```

为继续上述示例，我们假设主用户名是 `admin`，密码为 `insecure`。数据库实例的终端节点是 `rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com`，且您使用端口 4080。命令如下所示。

```
bcp store.dbo.customers in C:\customers.txt -n -S rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com,4080 -U admin -P insecure -b 10000 
```

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

## 从 RDS for SQL Server 中导出数据
<a name="SQLServer.Procedural.Exporting"></a>

您可以选择以下选项之一来从 RDS for SQL Server 数据库实例中导出数据：
+ **使用完整备份文件 (.bak) 的本机数据库备份** – 使用 .bak 文件备份数据库的过程已得到大幅优化，因此，它通常是最快的导出数据的方法。有关更多信息，请参阅“[使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)”。
+ **SQL Server 导入和导出向导** – 有关更多信息，请参阅 [SQL Server 导入和导出向导](#SQLServer.Procedural.Exporting.SSIEW)。
+ **SQL Server 生成和发布脚本向导与 bcp 实用工具** – 有关更多信息，请参阅 [SQL Server 生成和发布脚本向导与 bcp 实用工具](#SQLServer.Procedural.Exporting.SSGPSW)。

### SQL Server 导入和导出向导
<a name="SQLServer.Procedural.Exporting.SSIEW"></a>

您可以使用 SQL Server 导入和导出向导将一个或多个表、视图或查询从 RDS for SQL Server 数据库实例复制到另一个数据存储。如果目标数据存储不是 SQL Server，这将是最佳选择。有关更多信息，请参阅 SQL Server 文档中的 [ SQL Server 导入和导出向导](http://msdn.microsoft.com/en-us/library/ms141209%28v=sql.110%29.aspx)。

SQL Server 导入和导出向导是 Microsoft SQL Server Management Studio 的一部分。此图形化 SQL Server 客户端包含在所有 Microsoft SQL Server 版本（Express 版除外）中。SQL Server Management Studio 应用程序只能在 Windows 环境中运行。您可以从 Microsoft 上免费下载 SQL Server Management Studio Express。要找到此下载，请访问 [Microsoft 网站](http://www.microsoft.com/en-us/search/Results.aspx?q=sql%20server%20management%20studio)。

**使用 SQL Server 导入和导出向导来导出数据**

1. 在 SQL Server Management Studio 中，连接到 RDS for SQL Server 数据库实例。有关如何执行该操作的详细信息，请参阅[连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

1. 在 **Object Explorer** 中，展开 **Databases (数据库)**，打开源数据库的上下文（右键单击）菜单，选择 **Tasks (任务)**，然后选择 **Export Data (导出数据)**。此时将显示向导。

1. 在 **Choose a Data Source (选择数据源)** 页面上，执行以下操作：

   1. 对于 **Data source (数据源)**，选择 **SQL Server Native Client 11.0**。

   1. 确认**服务器名称**框中显示 RDS for SQL Server 数据库实例的终端节点。

   1. 选择 **Use SQL Server Authentication (使用 SQL Server 身份验证)**。对于 **用户名** 和 **密码**，键入您的数据库实例的主用户名和密码。

   1. 确认 **Database (数据库)** 框中显示要从中导出数据的数据库。

   1. 选择**下一步**。

1. 在 **Choose a Destination (选择目标)** 页面上，执行以下操作：

   1. 对于 **Destination (目标)**，选择 **SQL Server Native Client 11.0**。
**注意**  
提供了其他目标数据源。这些包括 .NET Framework 数据提供程序、OLE DB 提供程序、SQL Server Native Client 提供程序、ADO.NET 提供程序、Microsoft Office Excel、Microsoft Office Access 以及平面文件源。如果您选择这些数据源之一作为目标，请跳过步骤 4 的其余部分。有关接下来要提供的连接信息的详细信息，请参阅 SQL Server 文档中的[选择目标](http://msdn.microsoft.com/en-us/library/ms178430%28v=sql.110%29.aspx)。

   1. 对于 **Server name (服务器名称)**，键入目标 SQL Server 数据库实例的服务器名称。

   1. 选择适当的身份验证类型。如有必要，键入用户名和密码。

   1. 对于 **Database (数据库)**，选择目标数据库的名称，或选择 **New (新建)** 以创建一个包含已导出数据的新数据库。

      如果选择**新建**，请参阅 SQL Server 文档中的[创建数据库](http://msdn.microsoft.com/en-us/library/ms183323%28v=sql.110%29.aspx)，以了解要提供的数据库信息。

   1. 选择**下一步**。

1. 在 **Table Copy or Query (表复制或查询)** 页面上，选择 **Copy data from one or more tables or views (从一个或多个表或视图复制数据)** 或 **Write a query to specify the data to transfer (编写查询以指定要传输的数据)**。选择**下一步**。

1. 如果您选择 **Write a query to specify the data to transfer (编写查询以指定要传输的数据)**，则将看到 **Provide a Source Query (提供源查询)** 页面。键入或贴入 SQL 查询，然后选择 **Parse (分析)** 以进行验证。在验证查询后，选择 **Next (下一步)**。

1. 在 **Select Source Tables and Views (选择源表和视图)** 页面上，执行以下操作：

   1. 选择要导出的表和视图，或确认已选择您提供的查询。

   1. 选择 **Edit Mappings (编辑映射)** 并指定数据库和列映射信息。有关详细信息，请参阅 SQL Server 文档中的[列映射](http://msdn.microsoft.com/en-us/library/ms189660%28v=sql.110%29.aspx)。

   1. (可选) 若要查看要导出的数据的预览，请选择表、视图或查询，然后选择 **Preview**。

   1. 选择**下一步**。

1. 在 **Run Package (运行程序包)** 页面上，确认已选择 **Run immediately (立即运行)**。选择**下一步**。

1. 在 **Complete the Wizard (完成向导)** 页面上，确认数据导出详细信息是预期的详细信息。选择 **Finish (结束)**。

1. 在 **The execution was successful (执行已成功)** 页面上，单击 **Close (关闭)**。

### SQL Server 生成和发布脚本向导与 bcp 实用工具
<a name="SQLServer.Procedural.Exporting.SSGPSW"></a>

您可以使用 SQL Server 生成和发布脚本向导来为整个数据库或仅为所选对象创建脚本。可在目标 SQL Server 数据库实例上运行这些脚本以重新创建已编写脚本的对象。然后，可以使用 bcp 实用工具将选定对象的数据批量导出到目标数据库实例。若要在两个 SQL Server 数据库实例之间移动整个数据库 (包括表以外的对象) 或大量数据，这将是最佳选择。有关 bcp 命令行语法的完整说明，请参阅 Microsoft SQL Server 文档中的 [bcp 实用工具](http://msdn.microsoft.com/en-us/library/ms162802%28v=sql.110%29.aspx)。

SQL Server 生成和发布脚本向导是 Microsoft SQL Server Management Studio 的一部分。此图形化 SQL Server 客户端包含在所有 Microsoft SQL Server 版本（Express 版除外）中。SQL Server Management Studio 应用程序只能在 Windows 环境中运行。您可以从 Microsoft 上[免费下载](http://www.microsoft.com/en-us/search/Results.aspx?q=sql%20server%20management%20studio) SQL Server Management Studio Express。

**使用 SQL Server 生成和发布脚本向导与 bcp 实用工具来导出数据**

1. 在 SQL Server Management Studio 中，连接到 RDS for SQL Server 数据库实例。有关如何执行该操作的详细信息，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

1. 在 **Object Explorer** 中，展开 **Databases (数据库)** 节点并选择要编写脚本的数据库。

1. 按照 SQL Server 文档中的[生成和发布脚本向导](http://msdn.microsoft.com/en-us/library/bb895179%28v=sql.110%29.aspx)中的说明，创建脚本文件。

1. 在 SQL Server Management Studio 中，连接到目标 SQL Server 数据库实例。

1. 在 **Object Explorer**（对象资源管理器）中选择目标 SQL Server 数据库实例后，在 **File**（文件）菜单上选择 **Open**（打开），选择 **File**（文件），然后打开脚本文件。

1. 如果您已编写了整个数据库的脚本，请查看脚本中的 CREATE DATABASE 语句。请确保将在所需位置使用所需参数创建数据库。有关更多信息，请参阅 SQL Server 文档中的 [CREATE DATABASE](http://msdn.microsoft.com/en-us/library/ms176061%28v=sql.110%29.aspx)。

1. 如果在脚本中创建数据库用户，请检查目标数据库实例中是否有这些用户的服务器登录名。如果没有登录名，请为这些用户创建登录名；否则，用于创建数据库用户的脚本命令将失败。有关更多信息，请参阅 SQL Server 文档中的[创建登录名](http://msdn.microsoft.com/en-us/library/aa337562%28v=sql.110%29.aspx)。

1. 选择 SQL 编辑器菜单上的 **\$1Execute** 以运行脚本文件并创建数据库对象。完成脚本后，验证是否存在预期的所有数据库对象。

1. 使用 bcp 实用工具将数据从 RDS for SQL Server 数据库实例导出到文件。打开命令提示符并键入以下命令。

   ```
   bcp database_name.schema_name.table_name out data_file -n -S aws_rds_sql_endpoint -U username -P password
   ```

   上述代码包含以下选项：
   + *table\$1name* 是您已在目标数据库中重新创建且现在需要填充数据的其中一个表的名称。
   + *data\$1file* 是要创建的数据文件的完整路径和名称。
   + `-n` 指定，批量复制将使用待复制数据的本机数据类型。
   + `-S` 指定要从中导出数据的 SQL Server 数据库实例。
   + `-U` 指定在连接到 SQL Server 数据库实例时要使用的用户名。
   + `-P` 为 `-U` 指定的用户指定密码。

   下面显示了示例命令。

   ```
   bcp world.dbo.city out C:\Users\JohnDoe\city.dat -n -S sql-jdoe.1234abcd.us-west-2.rds.amazonaws.com,1433 -U JohnDoe -P ClearTextPassword
   ```

   重复此步骤，直到您获得要导出的所有表的数据文件。

1. 按照 SQL Server 文档中的[批量导入数据基本指南](http://msdn.microsoft.com/en-us/library/ms189989%28v=sql.110%29.aspx)中的说明，准备目标数据库实例以便批量导入数据。

1. 在考虑 SQL Server 文档中的[关于批量导入和批量导出操作](http://msdn.microsoft.com/en-us/library/ms187042%28v=sql.105%29.aspx)中讨论的性能和其他问题后，决定要使用的批量导入方法。

1. 从使用 bcp 实用工具创建的数据文件中批量导入数据。为此，请按照 SQL Server 文档中的[使用 bcp 实用工具导入和导出批量数据](http://msdn.microsoft.com/en-us/library/aa337544%28v=sql.110%29.aspx)或[使用 BULK INSERT 或 OPENROWSET(BULK...) 导入批量数据](http://msdn.microsoft.com/en-us/library/ms175915%28v=sql.110%29.aspx)中的说明进行操作，具体取决于您在步骤 11 中所做的决定。

# 从 Linux 中使用 BCP 实用程序导入和导出数据
<a name="SQLServer.Procedural.Importing.BCP.Linux"></a>

BCP（批量复制程序）实用程序提供了一种在 RDS for SQL Server 数据库实例与数据文件之间传输大量数据的高效方法。您可以从 Linux 环境中使用 BCP 来执行批量数据操作，这使其可用于数据迁移、ETL 处理和常规数据传输。

BCP 既支持将数据从文件导入到 SQL Server 表中，也支持将数据从 SQL Server 表导出到文件。这对于传输包括分隔文本文件在内的各种格式的结构化数据特别有效。

## 先决条件
<a name="SQLServer.Procedural.Importing.BCP.Linux.Prerequisites"></a>

在从 Linux 系统中对 RDS for SQL Server 数据库实例使用 BCP 之前，请确保您已具备以下条件：
+ 一个 Linux 环境，该环境与 RDS for SQL Server 数据库实例具有网络连接
+ 安装在 Linux 系统上的 Microsoft SQL Server 命令行工具，包括：
  + sqlcmd：SQL Server 命令行查询工具
  + bcp：批量复制程序实用程序
+ RDS for SQL Server 数据库实例的有效凭证
+ 通过安全组配置的网络访问权限，以支持通过 SQL Server 端口（通常为 1433）进行连接
+ 针对要执行的操作的相应数据库权限

## 在 Linux 上安装 SQL Server 命令行工具
<a name="SQLServer.Procedural.Importing.BCP.Linux.Installing"></a>

要从 Linux 中使用 BCP，您需要安装 Microsoft SQL Server 命令行工具。有关特定 Linux 发行版的详细安装说明，请参阅以下 Microsoft 文档：
+ [Install sqlcmd and bcp the SQL Server command-line tools on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)
+ [bcp utility](https://docs.microsoft.com/en-us/sql/tools/bcp-utility)：BCP 实用程序的完整参考资料

安装完成后，请运行以下命令以确保工具位于 PATH 下：

```
bcp -v
sqlcmd -?
```

## 从 RDS for SQL Server 中导出数据
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting"></a>

您可以使用 BCP 将数据从 RDS for SQL Server 数据库实例导出到 Linux 系统上的文件。这对于创建备份、执行数据分析或准备数据来进行迁移非常有用。

### 基本导出语法
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Basic"></a>

使用 BCP 导出数据的基本语法是：

```
bcp database.schema.table out output_file -S server_name -U username -P password [options]
```

其中：
+ `database.schema.table`：完全限定的表名称
+ `output_file`：输出文件的路径和名称
+ `server_name`：RDS for SQL Server 端点
+ `username`：数据库用户名
+ `password`：数据库密码

### 导出示例
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Example"></a>

以下示例从 `sales` 数据库中名为 `customers` 的表导出数据：

```
bcp sales.dbo.customers out /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n"
```

此命令：
+ 从 `customers` 表中导出数据
+ 将输出保存到 `/home/user/customers.txt`
+ 使用字符格式 (`-c`)
+ 使用竖线（\$1）作为字段分隔符 (`-t "|"`)
+ 使用换行符作为行分隔符 (`-r "\n"`)

## 将数据导入到 RDS for SQL Server
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing"></a>

您可以使用 BCP 将 Linux 系统上文件中的数据导入到 RDS for SQL Server 数据库实例。这对于数据迁移、加载测试数据或定期更新数据非常有用。

### 基本导入语法
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Basic"></a>

使用 BCP 导入数据的基本语法是：

```
bcp database.schema.table in input_file -S server_name -U username -P password [options]
```

其中：
+ `database.schema.table`：完全限定的目标表名称
+ `input_file`：输入文件的路径和名称
+ `server_name`：RDS for SQL Server 端点
+ `username`：数据库用户名
+ `password`：数据库密码

### 导入示例
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Example"></a>

以下示例将数据从文件导入到名为 `customers` 的表中：

```
bcp sales.dbo.customers in /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n" \
    -b 1000
```

此命令：
+ 将数据导入到 `customers` 表中
+ 读取 `/home/user/customers.txt` 中的数据
+ 使用字符格式 (`-c`)
+ 使用竖线（\$1）作为字段分隔符 (`-t "|"`)
+ 使用换行符作为行分隔符 (`-r "\n"`)
+ 以 1000 行为一批处理数据 (`-b 1000`)

## 常用 BCP 选项
<a name="SQLServer.Procedural.Importing.BCP.Linux.Options"></a>

BCP 提供了许多选项来控制数据格式和传输行为。下表介绍了常用的选项：


| 选项 | 描述 | 
| --- | --- | 
| -c | 对所有列使用字符数据类型 | 
| -n | 使用原生数据库数据类型 | 
| -t | 指定字段分隔符（默认为制表符） | 
| -r | 指定行分隔符（默认为换行符） | 
| -b | 指定批量操作的批次大小 | 
| -F | 指定要导出或导入的第一行 | 
| -L | 指定要导出或导入的最后一行 | 
| -e | 指定用于捕获被拒绝行的错误文件 | 
| -f | 指定用于对数据进行格式化的格式文件 | 
| -q | 将带引号的标识符用于对象名称 | 

## 最佳实践和注意事项
<a name="SQLServer.Procedural.Importing.BCP.Linux.BestPractices"></a>

当从 Linux 中将 BCP 与 RDS for SQL Server 结合使用时，请考虑以下最佳实践：
+ **使用批处理**：对于大型数据集，使用 `-b` 选项来分批处理数据。这可以提高性能并可实现更好的错误恢复。
+ **妥善地处理错误**：使用 `-e` 选项在单独的文件中捕获错误信息和被拒绝的行，以进行分析。
+ **选择适当的数据格式**：当源和目标都是 SQL Server 时，使用字符格式 (`-c`) 来实现跨平台兼容性，或使用原生格式 (`-n`) 来提高性能。
+ **保护您的凭证**：避免直接在命令行中放入密码。考虑使用环境变量或配置文件以及适当的权限。
+ **使用小型数据集进行测试**：在处理大量数据之前，使用较小的数据集测试 BCP 命令以验证格式和连接性。
+ **监控网络连接**：确保稳定的网络连接，特别是对于大型数据传输。考虑使用诸如 `screen` 或 `tmux` 之类的工具执行长时间运行的操作。
+ **验证数据完整性**：在传输数据后，验证行数和样本数据，以确保操作成功完成。

## 排查常见 问题
<a name="SQLServer.Procedural.Importing.BCP.Linux.Troubleshooting"></a>

下表描述了从 Linux 中使用 BCP 时可能遇到的常见问题及其解决方案：


| 事务 | 解决方案 | 
| --- | --- | 
| 连接超时或网络错误 | 验证 Amazon RDS 端点、安全组设置和网络连接。确保可以从 Linux 系统访问 SQL Server 端口（通常为 1433）。 | 
| 身份验证失败次数 | 验证用户名和密码。确保数据库用户对您正在执行的操作具有相应的权限。 | 
| 数据格式错误 | 检查您的字段和行分隔符。确保数据格式符合 BCP 的预期。对复杂的数据结构使用格式文件。 | 
| 权限被拒绝错误 | 请确保数据库用户对目标表具有 INSERT 权限（用于导入）或 SELECT 权限（用于导出）。 | 
| 大文件处理问题 | 通过 -b 选项使用批处理。考虑将大文件拆分成较小的分块，以改善性能和错误恢复。 | 
| 字符编码问题 | 确保数据文件使用兼容的字符编码。对字符格式使用 -c 选项或指定相应的代码页。 | 

# 在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本
<a name="SQLServer.ReadReplicas"></a>

一般使用只读副本配置 Amazon RDS 数据库实例之间的复制。有关只读副本的一般信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在本部分中，您可以找到有关使用 Amazon RDS for SQL Server 上的只读副本的特定信息。
+ [将数据库用户和对象与 SQL Server 只读副本同步](SQLServer.ReadReplicas.ObjectSynchronization.md)
+ [排除 SQL Server 只读副本问题](SQLServer.ReadReplicas.Troubleshooting.md)

## 为 SQL Server 配置只读副本
<a name="SQLServer.ReadReplicas.Configuration"></a>

数据库实例可充当复制的源实例之前，您必须在源数据库实例上启用自动备份。为此，请将备份保留期设定为非 0 值。设置此类部署还会强制启用自动备份。

创建 SQL Server 只读副本不需要中断源数据库实例。Amazon RDS 为源数据库实例和只读副本设置必要的参数和权限，而不会中断任务服务。将创建源数据库实例的快照，此快照将变为只读副本。在删除只读副本时不会发生中断。

您可以从一个源数据库实例创建最多 15 个只读副本。为了有效地进行复制，我们建议您为每个只读副本配置与源数据库实例数量相同的计算和存储资源。如果扩展源数据库实例，则还应扩展只读副本。

源数据库实例及其所有只读副本的 SQL Server 数据库引擎版本必须相同。无论维护时段如何，Amazon RDS 都会在升级只读副本后立即升级主要副本。有关升级数据库引擎版本的更多信息，请参阅[升级 Microsoft SQL Server 数据库引擎](USER_UpgradeDBInstance.SQLServer.md)。

为了让只读副本可以接收和应用源数据库实例的更改，它应具有足够的计算和存储资源。如果只读副本达到计算、网络或存储资源容量，则只读副本会停止接收或应用来自其源实例的更改。您可以单独修改某个只读副本的存储和 CPU 资源，不受其源实例及其他只读副本的影响。

有关如何创建只读副本的更多信息，请参阅[创建只读副本](USER_ReadRepl.Create.md)。

## SQL Server 的只读副本限制
<a name="SQLServer.ReadReplicas.Limitations"></a>

以下限制适用于 Amazon RDS 上的 SQL Server 只读副本：
+ 只读副本仅在 SQL Server 企业版 (EE) 引擎中可用。
+ 只读副本可用于 SQL Server 版本 2016–2022。
+ 您可以从一个源数据库实例创建最多 15 个只读副本。当您的源数据库实例的只读副本超过 5 个时，复制可能会滞后。
+ 只读副本仅适用于在具有四个或更多 vCPU 的数据库实例类上运行的数据库实例。
+ 只读副本支持最多 100 个数据库，具体取决于实例类类型和可用性模式。您必须在源数据库实例上创建数据库，才能自动将数据库复制到只读副本。您无法选择要复制的单独数据库。有关更多信息，请参阅 [Microsoft SQL Server 数据库实例的限制](CHAP_SQLServer.md#SQLServer.Concepts.General.FeatureSupport.Limits)。
+ 您无法从只读副本中删除数据库。要删除数据库，请使用 `rds_drop_database` 存储过程将其从源数据库实例中删除。有关更多信息，请参阅 [删除 Amazon RDS for Microsoft SQL Server 数据库实例中的数据库](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)。
+ 如果源数据库实例使用透明数据加密（TDE）来加密数据，则只读副本还会自动配置 TDE。

  如果源数据库实例使用 KMS 密钥来加密数据，则同一区域中的只读副本使用相同的 KMS 密钥。对于跨区域只读副本，您必须在创建只读副本时，指定只读副本所在区域中的 KMS 密钥。您无法更改只读副本的 KMS 密钥。
+ 只读副本与源数据库实例具有相同的时区和排序规则，无论它们是在哪个可用区中创建的。
+ Amazon RDS for SQL Server 不支持以下内容：
  + 只读副本的备份保留
  + 从只读副本进行时间点恢复
  + 只读副本的手动快照
  + 多可用区只读副本
  + 创建只读副本的只读副本
  + 将用户登录同步到只读副本
+ Amazon RDS for SQL Server 不会通过干预来缓解源数据库实例及其只读副本之间的高副本滞后。确保源数据库实例及其只读副本在计算能力和存储方面具有适当的大小，可以适合其运营负载。
+ 您可以在 AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）区域之间进行复制，但无法复制到 AWS GovCloud (US) Regions 中或从其中复制。

## RDS for SQL Server 副本的选项注意事项
<a name="SQLServer.ReadReplicas.limitations.options"></a>

在创建 RDS for SQL Server 副本之前，请考虑以下要求、限制和建议：
+ 如果 SQL Server 副本与其源数据库实例位于同一区域，请确保它与源数据库实例属于同一选项组。对源选项组或源选项组成员资格做出的修改会传播到副本。不管副本的维护时段是什么，这些更改在应用到源数据库实例后，都会立即应用到副本。

  有关选项组的更多信息，请参阅 [使用选项组](USER_WorkingWithOptionGroups.md)。
+ 在您创建 SQL Server 跨区域副本时，Amazon RDS 会为其创建专用选项组。

  您无法从专用选项组中删除 SQL Server 跨区域副本。任何其他数据库实例都无法使用 SQL Server 跨区域副本的专用选项组。

  以下选项为复制的选项。要将复制的选项添加到 SQL Server 跨区域只读副本，请将其添加到源数据库实例的选项组中。选项还会安装在源数据库实例的所有副本上。
  + `TDE`

  以下选项为非复制的选项。您可以在专用选项组中添加或删除未复制的选项。
  + `MSDTC`
  + `SQLSERVER_AUDIT`
  + 要对跨区域只读副本启用 `SQLSERVER_AUDIT` 选项，请在跨区域只读副本上的专用选项组和源实例的选项组上添加 `SQLSERVER_AUDIT` 选项。通过在 SQL Server 跨区域只读副本的源实例上添加 `SQLSERVER_AUDIT` 选项，可以在源实例的每个跨区域只读副本上创建服务器级审计对象和服务器级审计规范。要允许跨区域只读副本访问以将完成的审核日志上载到 Amazon S3 桶，请将 `SQLSERVER_AUDIT` 选项添加到专用选项组并配置选项设置。您用作审计文件目标的 Amazon S3 桶必须与跨区域只读副本位于同一区域中。您可以单独修改每个跨区域只读副本的 `SQLSERVER_AUDIT` 选项的选项设置，以便每个只读副本都能访问各自区域中的 Amazon S3 桶。

  只读副本不支持以下选项。
  + `SSRS`
  + `SSAS`
  + `SSIS`

  跨区域只读副本部分支持以下选项。
  + `SQLSERVER_BACKUP_RESTORE`
  + SQL Server 跨区域副本的源数据库实例可以具有 `SQLSERVER_BACKUP_RESTORE` 选项，但在删除源数据库实例的所有跨区域副本之前，您无法对源数据库实例执行原生还原。在创建跨区域副本期间，任何现有的原生还原任务都将被取消。您无法将 `SQLSERVER_BACKUP_RESTORE` 选项添加到专用选项组。

    有关原生备份和还原的更多信息，请参阅 [使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)。

  提升 SQL Server 跨区域只读副本时，提升后的副本的行为与其他 SQL Server 数据库实例相同，包括其选项的管理。有关选项组的更多信息，请参阅 [使用选项组](USER_WorkingWithOptionGroups.md)。

# 将数据库用户和对象与 SQL Server 只读副本同步
<a name="SQLServer.ReadReplicas.ObjectSynchronization"></a>

创建只读副本时主数据库实例中存在的任何登录名、自定义服务器角色、SQL 代理任务或其他服务器级对象，都应出现在新创建的只读副本中。但是，在创建只读副本后在主数据库实例中创建的任何服务器级对象不会自动复制，您必须在只读副本中手动创建它们。

数据库用户将自动从主数据库实例复制到只读副本。由于只读副本数据库处于只读模式，因此无法在数据库中更新数据库用户的安全标识符（SID）。因此，当在只读副本中创建 SQL 登录名时，务必确保该登录名的 SID 与主数据库实例中相应 SQL 登录名的 SID 相匹配。如果您未同步 SQL 登录名的 SID，这些登录名将无法访问只读副本中的数据库。经 Windows Active Directory（AD）身份验证的登录名不会遇到此问题，因为 SQL Server 从 Active Directory 获取 SID。

**将 SQL 登录名从主数据库实例同步到只读副本**

1. 连接到主数据库实例。

1. 在主数据库实例中创建新的 SQL 登录名。

   ```
   USE [master]
   GO
   CREATE LOGIN TestLogin1
   WITH PASSWORD = 'REPLACE WITH PASSWORD';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 为数据库中的 SQL 登录名创建新的数据库用户。

   ```
   USE [REPLACE WITH YOUR DB NAME]
   GO
   CREATE USER TestLogin1 FOR LOGIN TestLogin1;
   GO
   ```

1. 检查主数据库实例中新创建的 SQL 登录名的 SID。

   ```
   SELECT name, sid FROM sys.server_principals WHERE name =  'TestLogin1';
   ```

1. 连接到只读副本。创建新的 SQL 登录名。

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'REPLACE WITH PASSWORD', SID=REPLACE WITH sid FROM STEP #4;
   ```

**或者，如果您有权访问只读副本数据库，则可以按如下方式修复孤立用户：**

1. 连接到只读副本。

1. 识别数据库中的孤立用户。

   ```
   USE [REPLACE WITH YOUR DB NAME]
   GO
   EXEC sp_change_users_login 'Report';
   GO
   ```

1. 为孤立的数据库用户创建新的 SQL 登录名。

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'REPLACE WITH PASSWORD', SID=REPLACE WITH sid FROM STEP #2;
   ```

   示例：

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'TestPa$$word#1', SID=0x1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

# 排除 SQL Server 只读副本问题
<a name="SQLServer.ReadReplicas.Troubleshooting"></a>

您可以通过查看 Amazon RDS `ReplicaLag` 指标，在 Amazon CloudWatch 中监控复制滞后。有关使用复制滞后时间的信息，请参阅 [监控只读复制](USER_ReadRepl.Monitoring.md)。

如果复制滞后时间太长，则您可以使用以下查询，获取有关滞后的信息。

```
SELECT AR.replica_server_name
     , DB_NAME (ARS.database_id) 'database_name'
     , AR.availability_mode_desc
     , ARS.synchronization_health_desc
     , ARS.last_hardened_lsn
     , ARS.last_redone_lsn
     , ARS.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states ARS
INNER JOIN sys.availability_replicas AR ON ARS.replica_id = AR.replica_id
--WHERE DB_NAME(ARS.database_id) = 'database_name'
ORDER BY AR.replica_server_name;
```

# Amazon RDS for Microsoft SQL Server 多可用区部署
<a name="USER_SQLServerMultiAZ"></a>

多可用区部署为数据库实例提供了更高的可用性、数据持久性和容错能力。在进行计划的数据维护或发生未计划的服务中断时，Amazon RDS 会自动故障转移到最新的辅助数据库实例。此功能让数据库操作快速恢复，而不需要手动干预。主实例和备用实例使用相同的终端节点，其物理网络地址作为故障转移过程的一部分转换到辅助副本。在故障转移时，您不必重新配置应用程序。

Amazon RDS 通过使用 SQL Server 数据库镜像（DBM）、Always On 可用性组（AG）或块级复制，支持为 Microsoft SQL Server 进行多可用区部署。Amazon RDS 监控并维护您的多可用区部署的运行状况。如果出现问题，RDS 会自动修复运行状况不佳的数据库实例，重新建立同步，并发起故障转移。仅当备用实例和主要实例完全同步时，才会发生故障转移。您不必管理任何内容。

当您设置 SQL Server 多可用区时，RDS 自动将实例上的所有数据库配置为使用 DBM、AG 或块级复制。当您配置 DBM 或 AG 时，Amazon RDS 负责处理主要、见证以及辅助数据库实例。对于块级复制，RDS 负责处理主要和辅助数据库实例。因为配置是自动的，所以 RDS 基于您部署的 SQL Server 版本选择 DBM 、Always On AG 或块级复制。

Amazon RDS 支持在以下 SQL Server 版本中使用带 Always On AG 的多可用区：
+ SQL Server 2022：
  + 标准版
  + Enterprise Edition
+ SQL Server 2019：
  + 标准版 15.00.4073.23 及更高版本
  + Enterprise Edition
+ SQL Server 2017：
  + 标准版 14.00.3401.7 及更高版本
  + 企业版 14.00.3049.1 及更高版本
+ SQL Server 2016：企业版 13.00.5216.0 及更高版本

Amazon RDS 支持以下 SQL Server 版本带 DBM 的多可用区，前面提到的版本除外：
+ SQL Server 2019：标准版 15.00.4043.16
+ SQL Server 2017：标准版和企业版
+ SQL Server 2016：标准版和企业版 

Amazon RDS 对于 SQL Server 2022 Web 版 16.00.4215.2 及更高版本支持具有块级复制功能的多可用区。

**注意**  
只有使用 16.00.4215.2 或更高版本创建的新数据库实例才支持具有块级复制功能的多可用区部署。以下限制适用于现有的 SQL Server 2022 Web 版实例：  
对于版本 16.00.4215.2 上的现有实例，您必须将快照还原到次要版本相同或更高的新实例，才能启用块级复制。
具有较旧次要版本的 SQL Server 2022 Web 实例可以升级到次要版本 16.00.4215.2 或更高版本，以启用块级复制。

您可以使用以下 SQL 查询来确定 SQL Server 数据库实例是单可用区、DBM 多可用区还是 Always On AG 多可用区。此查询不适用于 SQL Server Web 版上的多可用区部署。

```
SELECT CASE WHEN dm.mirroring_state_desc IS NOT NULL THEN 'Multi-AZ (Mirroring)'
    WHEN dhdrs.group_database_id IS NOT NULL THEN 'Multi-AZ (AlwaysOn)'
    ELSE 'Single-AZ'
    END 'high_availability'
FROM sys.databases sd
LEFT JOIN sys.database_mirroring dm ON sd.database_id = dm.database_id
LEFT JOIN sys.dm_hadr_database_replica_states dhdrs ON sd.database_id = dhdrs.database_id AND dhdrs.is_local = 1
WHERE DB_NAME(sd.database_id) = 'rdsadmin';
```

输出与以下内容类似：

```
high_availability
Multi-AZ (AlwaysOn)
```

## 向 Microsoft SQL Server 数据库实例添加多可用区
<a name="USER_SQLServerMultiAZ.Adding"></a>

当您使用 AWS 管理控制台创建新的 SQL Server 数据库实例时，您可以添加带数据库镜像（DBM）、Always On AG 或块级复制的多可用区。您可以通过从**多可用区部署**中选择**是（镜像/Always On/块级复制）**来执行此操作。有关更多信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。

当使用控制台修改现有 SQL Server 数据库实例时，可以通过从**修改数据库实例**页面上的**多可用区部署**中选择**是（镜像/Always On/块级复制）**，以添加带 DBM、AG 或块级复制的多可用区。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

**注意**  
如果您的数据库实例运行的是数据库镜像 (DBM)（并非 Always On 可用性组 (AG)），则可能需要在添加多可用区之前禁用内存中优化。如果数据库实例运行 SQL Server 2016 或 2017 企业版并启用了内存优化，则在添加多可用区之前通过 DBM 禁用内存优化。  
如果您的数据库实例正在运行 SQL Server Web 版的 AG 或块级复制，则不需要此步骤。

## 从 Microsoft SQL Server 数据库实例删除多可用区
<a name="USER_SQLServerMultiAZ.Removing"></a>

当您使用 AWS 管理控制台修改现有 SQL Server 数据库实例时，您可以移除带 DBM、AG 或块级复制的多可用区。您可以通过在**修改数据库实例**页面上的**多可用区部署**中选择**否（镜像/Always On/块级复制）**来实现上述目的。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# Microsoft SQL Server 多可用区部署限制、说明和建议
<a name="USER_SQLServerMultiAZ.Recommendations"></a>

以下是在 RDS for SQL Server 数据库实例上使用多可用区部署时的一些限制：
+ 不支持跨区域多可用区。
+ 不支持停止多可用区部署中的 RDS for SQL Server 数据库实例。
+ 您不能将辅助数据库实例配置为接受数据库读取活动。
+ 带 Always On 可用性组 (AG) 的多可用区支持内存中优化。
+ 带 Always On 可用性组 (AG) 的多可用区不支持对可用性组侦听器进行 Kerberos 身份验证。这是因为侦听器没有服务主体名称 (SPN)。
+ 目前只有 SQL Server Web 版实例支持具有块级复制功能的多可用区。
+ 您不能重命名位于 SQL Server 多可用区部署中的 SQL Server 数据库实例上的数据库。如果您需要在此类实例上重命名一个数据库，请先为数据库实例禁用多可用区，然后重命名数据库。最后，为数据库实例重新启用多可用区。
+ 您只能还原使用完全恢复模式备份的多可用区数据库实例。
+ 多可用区部署具有 10000 个 SQL Server 代理任务的限制。

  如果您需要更高的限制，则可联系 支持 请求增加限制。打开 [AWS 支持 Center (Amazon Web Services Support 中心)](https://console.aws.amazon.com/support/home#/) 页面，登录（如有必要），然后选择 **Create case (创建案例)**。选择 **Service Limit increase (提高服务限制)**。填写并提交表格。
+ 在位于 SQL Server 多可用区部署中的 SQL Server 数据库实例上不能有脱机数据库。
+ RDS for SQL Server 不会将 MSDB 数据库权限复制到辅助实例。如果您对辅助实例需要这些权限，则必须手动重新创建它们。
+ 对于使用块级复制的实例的辅助主机，容量指标不可用。

以下是有关在 RDS for SQL Server 数据库实例上使用多可用区部署的一些说明：
+ Amazon RDS 公开 Always On AG [可用性组侦听器终端节点](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)。此端点显示在控制台中，由 `DescribeDBInstances` API 操作作为端点字段中的条目返回。
+ Amazon RDS 支持[可用性组多子网故障转移](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)。
+ 要对虚拟私有云（VPC）中的 SQL Server 数据库实例使用 SQL Server 多可用区，您需要先创建一个数据库子网组，此数据库子网组在至少两个不同可用区中具有子网。然后，将该数据库子网组分配给 SQL Server 数据库实例的主副本。
+ 在将数据库实例修改为多可用区部署的过程中，数据库实例的状态为 **modifying (正在修改)**。Amazon RDS 创建备用数据库实例，并创建主数据库实例的备份。这个过程完成后，主数据库实例的状态变为 **available (可用)**。
+ 多可用区部署在同一节点上维护所有数据库。如果主要主机上的某个数据库发生故障转移，所有 SQL Server 数据库都将作为一个原子单元故障转移到备用主机。Amazon RDS 预置正常运行的新主机并替换运行状况不佳的主机。
+ 带 DBM、AG 或块级复制的多可用区支持单个备用副本。
+ 在辅助镜像上，将会自动复制用户、登录名和权限。您无需重新创建它们。用户定义的服务器角色仅在对多可用区部署使用 Always On AG 或块级复制的数据库实例中才复制。
+ 在多可用区部署中，RDS for SQL Server 会创建 SQL Server 登录名，来允许 Always On AG 或数据库镜像。RDS 使用模式 `db_<dbiResourceId>_node1_login`、`db_<dbiResourceId>_node2_login` 和 `db_<dbiResourceId>_witness_login` 创建登录名。
+ RDS for SQL Server 创建 SQL Server 登录名来允许访问只读副本。RDS 使用以下模式 `db_<readreplica_dbiResourceId>_node_login` 创建登录名。
+ 在多可用区部署中，启用作业复制功能时，SQL Server Agent 作业将从主要主机复制到辅助主机。有关更多信息，请参阅 [启用 SQL Server Agent 作业复制](Appendix.SQLServer.CommonDBATasks.Agent.md#SQLServerAgent.Replicate)。
+ 您可以看到，由于执行同步数据复制，因此相对于标准数据库实例部署（在单一可用区中），延迟有所提升。
+ 故障转移时间受完成恢复过程所用的时间的影响。大型事务会增加故障转移时间。
+ 在 SQL Server 多可用区部署中，通过故障转移重新启动仅重新启动主数据库实例。故障转移后，主数据库实例将成为新的备用数据库实例。多可用区实例的参数可能不更新。对于不进行失效转移的重新启动，主数据库实例和备用数据库实例将重新启动，并在重新启动后更新参数。如果数据库实例没有响应，我们建议重新启动而不进行故障转移。

以下是有关使用针对 RDS for Microsoft SQL Server 数据库实例的多可用区部署的一些建议：
+ 对于生产或预生产中使用的数据库，我们建议使用以下选项：
  + 多可用区部署，可实现高可用性
  + “Provisioned IOPS (预置 IOPS)”，可实现快速一致的性能
  + “内存优化”而非“通用型”
+ 您无法为辅助实例选择可用区 (AZ)，因此，在部署应用程序主机时请注意这一点。您的数据库可能故障转移到其他可用区，并且应用程序主机与数据库可能不在同一可用区中。因此，我们建议您在给定 AWS 区域中的所有可用区之间平衡应用程序主机。
+ 为了获得最佳性能，请勿在大型数据加载操作期间启用数据库镜像、Always On AG 或块级复制。如果您希望尽可能快地完成数据加载，请先完成数据加载，然后再将数据库实例转换到多可用区部署。
+ 访问 SQL Server 数据库的应用程序应具有可捕获连接错误的异常处理功能。下面的代码示例显示了一个可捕获通信错误的 try/catch 块。在此示例中，如果连接成功，`break` 语句会退出 `while` 循环，但如果引发异常，则最多可重试 10 次。

  ```
  int RetryMaxAttempts = 10;
  int RetryIntervalPeriodInSeconds = 1;
  int iRetryCount = 0;
  while (iRetryCount < RetryMaxAttempts)
  {
     using (SqlConnection connection = new SqlConnection(DatabaseConnString))
     {
        using (SqlCommand command = connection.CreateCommand())
        {
           command.CommandText = "INSERT INTO SOME_TABLE VALUES ('SomeValue');";
           try
           {
              connection.Open();
              command.ExecuteNonQuery();
              break;
           }
           catch (Exception ex) 
           {
              Logger(ex.Message);
              iRetryCount++;
           }
           finally {
              connection.Close();
           }
        }
     }
     Thread.Sleep(RetryIntervalPeriodInSeconds * 1000);
  }
  ```
+ 在处理使用 DBM 或 AG 的多可用区实例时，请勿使用 `Set Partner Off` 命令。使用块级复制的实例不支持此命令。例如，请勿执行以下操作。

  ```
  --Don't do this
  ALTER DATABASE db1 SET PARTNER off
  ```
+ 请勿将恢复模式设置为 `simple`。例如，请勿执行以下操作。

  ```
  --Don't do this
  ALTER DATABASE db1 SET RECOVERY simple
  ```
+ 在多可用区数据库实例上创建新登录名时，请勿使用 `DEFAULT_DATABASE` 参数，除非使用块级复制来实现高可用性，因为这些设置不能应用于备用镜像。例如，请勿执行以下操作。

  ```
  --Don't do this
  CREATE LOGIN [test_dba] WITH PASSWORD=foo, DEFAULT_DATABASE=[db2]
  ```

  此外，请勿执行以下操作。

  ```
  --Don't do this
  ALTER LOGIN [test_dba] WITH DEFAULT_DATABASE=[db3]
  ```

# 确定辅助副本的位置
<a name="USER_SQLServerMultiAZ.Location"></a>

您可以使用 AWS 管理控制台确定辅助副本的位置。如果您在 VPC 中设置主数据库实例，则需要了解辅助副本的位置。

![\[辅助可用区\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQLSvr-MultiAZ.png)


您还可以使用 AWS CLI 命令 `describe-db-instances` 或 RDS API 操作 `DescribeDBInstances` 查看辅助副本的可用区。输出会显示备用镜像所处的辅助可用区。

# 从数据库镜像迁移到 Always On 可用性组
<a name="USER_SQLServerMultiAZ.Migration"></a>

在 Microsoft SQL Server 企业版的版本 14.00.3049.1 中，默认已启用 Always On 可用性组 (AG)。

若要从数据库镜像 (DBM) 迁移到 AG，请先检查您的版本。如果您使用的数据库实例的版本低于企业版 13.00.5216.0，请修改此实例以便将其版本修补到 13.00.5216.0 或更高版本。如果您使用的数据库实例的版本低于企业版 14.00.3049.1，请修改实例以便将其版本修补到 14.00.3049.1 或更高版本。

如果您想要升级镜像的数据库实例以使用 AG，请先运行升级，修改实例以删除多可用区，然后再次修改它以添加多可用区。这会将实例转换为使用 Always On AG。

# Amazon RDS 上的 Microsoft SQL Server 的其他功能
<a name="User.SQLServer.AdditionalFeatures"></a>

在以下各节中，您可以找到有关增强运行 Microsoft SQL Server 数据库引擎的 Amazon RDS 实例的信息。

**Topics**
+ [在 RDS for SQL Server 上为 SQL Server 登录名使用密码策略](SQLServer.Concepts.General.PasswordPolicy.Using.md)
+ [将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)
+ [在 Amazon RDS for SQL Server 上使用数据库邮件](SQLServer.DBMail.md)
+ [Amazon RDS for SQL Server 上 的 tempdb 数据库的实例存储支持。](SQLServer.InstanceStore.md)
+ [通过 Amazon RDS for Microsoft SQL Server 使用扩展事件。](SQLServer.ExtendedEvents.md)
+ [使用 RDS for SQL Server 访问事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.md)

# 在 RDS for SQL Server 上为 SQL Server 登录名使用密码策略
<a name="SQLServer.Concepts.General.PasswordPolicy.Using"></a>

Amazon RDS 支持您为运行 Microsoft SQL Server 的 Amazon RDS 数据库实例设置密码策略。使用这一点为使用 SQL Server 身份验证对数据库实例进行身份验证的登录名设置复杂性、长度和锁定要求。

## 关键术语
<a name="SQLServer.Concepts.General.PasswordPolicy.Using.KT"></a>

**登录**  
在 SQL Server 中，可以对数据库实例进行身份验证的服务器级主体称为**登录名**。其它数据库引擎可能会将此主体称为*用户*。在 RDS for SQL Server 中，登录名可以使用 SQL Server 身份验证或 Windows 身份验证进行身份验证。

**SQL Server 登录名**  
使用用户名和密码通过 SQL Server 身份验证进行身份验证的登录名是 SQL Server 登录名。您通过数据库参数配置的密码策略仅适用于 SQL Server 登录名。

**Windows 登录名**  
基于 Windows 主体并使用 Windows 身份验证进行身份验证的登录名是 Windows 登录名。您可以在 Active Directory 中为 Windows 登录名配置密码策略。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

## 为每个登录名启用和禁用策略
<a name="SQLServer.Concepts.General.PasswordPolicy.EnableDisable"></a>

 每个 SQL Server 登录名都有用于 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的标志。默认情况下，创建新登录名时，`CHECK_POLICY` 设置为 `ON`，而 `CHECK_EXPIRATION` 设置为 `OFF`。

如果为登录名启用 `CHECK_POLICY`，则 RDS for SQL Server 会根据复杂性和最小长度要求验证密码。锁定策略也适用。用于启用 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的示例 T-SQL 语句：

```
ALTER LOGIN [master_user] WITH CHECK_POLICY = ON, CHECK_EXPIRATION = ON;
```

如果启用 `CHECK_EXPIRATION`，则密码受密码使用期限策略的约束。用于检查是否设置了 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的 T-SQL 语句：

```
SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins;
```

## 密码策略参数
<a name="SQLServer.Concepts.General.PasswordPolicy.PWDPolicyParams"></a>

所有密码策略参数都是动态的，不需要重启数据库即可生效。下表列出了您可以设置来修改 SQL Server 登录名的密码策略的数据库参数：


****  

| 数据库参数 | 描述 | 允许的值 | 默认值 | 
| --- | --- | --- | --- | 
| rds.password\$1complexity\$1enabled | 创建或更改 SQL Server 登录名的密码时，必须满足密码复杂性要求。必须满足以下约束：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Concepts.General.PasswordPolicy.Using.html)  | 0、1 | 0 | 
| rds.password\$1min\$1length | SQL Server 登录名的密码中所需的最小字符数。 | 0-14 | 0 | 
| rds.password\$1min\$1age | 用户在更改 SQL Server 登录名密码之前必须使用该密码的最少天数。当设置为 0 时，可以立即更改密码。 | 0-998 | 0 | 
| rds.password\$1max\$1age | 可以使用 SQL Server 登录名密码的最大天数，之后用户需要更改密码。设置为 0 时，密码从不过期。 | 0-999 | 42 | 
| rds.password\$1lockout\$1threshold | 导致 SQL Server 登录名被锁定的连续失败登录尝试次数。 | 0-999 | 0 | 
| rds.password\$1lockout\$1duration | 锁定的 SQL Server 登录名在被解锁之前必须等待的分钟数。 | 1-60 | 10 | 
| rds.password\$1lockout\$1reset\$1counter\$1after | 登录尝试失败后必须经过的分钟数，之后才会将失败的登录尝试计数器重置为 0。 | 1-60 | 10 | 

**注意**  
有关 SQL Server 密码策略的更多信息，请参阅[密码策略](https://learn.microsoft.com/en-us/sql/relational-databases/security/password-policy)。  
密码复杂性和最小长度策略也适用于所包含的数据库中的数据库用户。有关更多信息，请参阅[包含的数据库](https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases)。

以下约束适用于密码策略参数：
+ 除非 `rds.password_max_age` 设置为 0，否则 `rds.password_min_age` 参数必须小于 `rds.password_max_age parameter`
+ `rds.password_lockout_reset_counter_after` 参数必须小于或等于 `rds.password_lockout_duration` 参数。
+ 如果 `rds.password_lockout_threshold` 设置为 0，则 `rds.password_lockout_duration` 和 `rds.password_lockout_reset_counter_after` 不适用。

### 现有登录名的注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.ExistingLogins"></a>

修改实例上的密码策略后，**不会**根据新的密码复杂性和长度要求对登录名的现有密码进行追溯性评估。只有新密码才会根据新策略进行验证。

SQL Server **确实**会根据使用期限要求评估现有密码。

修改密码策略后，密码可能会立即过期。例如，如果登录名已启用 `CHECK_EXPIRATION`，其密码上次更改是在 100 天前，并且您将 `rds.password_max_age` 参数设置为 5 天，则密码将立即过期，并且登录名需要在下次尝试登录时更改其密码。

**注意**  
RDS for SQL Server 不支持密码历史记录策略。历史记录策略可禁止登录名重用以前用过的密码。

### 多可用区部署的注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.MAZPasswords"></a>

多可用区实例的失败登录尝试计数器和锁定状态不会在节点之间复制。如果在多可用区实例失效转移时登录名被锁定，则登录名可能已经在新节点上被解锁。

# 主登录名的密码注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin"></a>

创建 RDS for SQL Server 数据库实例时，不会根据密码策略评估主用户密码。在对主用户执行操作时，特别是在 `ModifyDBInstance` 命令中设置 `MasterUserPassword` 时，也不会根据密码评估新的主密码。在这两种情况下，您都可以为不符合密码策略的主用户设置密码，并且操作仍然会成功。如果不符合该策略，则 RDS 会尝试引发 RDS 事件，并建议设置强密码。请注意，只对主用户使用强密码。

当主用户密码不符合密码策略要求时，RDS 会尝试生成以下事件消息：
+ 已创建主用户，但密码不符合密码策略的最小长度要求。请考虑使用更强的密码。
+ 已创建主用户，但密码不符合密码策略的复杂性要求。请考虑使用更强的密码。
+ 已重置主用户密码，但密码不符合密码策略的最小长度要求。请考虑使用更强的密码。
+ 已重置主用户密码，但密码不符合密码策略的复杂性要求。请考虑使用更强的密码。

默认情况下，创建主用户时，`CHECK_POLICY` 和 `CHECK_EXPIRATION` 设置为 `OFF`。要将密码策略应用于主用户，必须在创建数据库实例后，手动为主用户启用这些标志。启用这些标志后，直接在 SQL Server 中修改主用户密码（例如，通过 T-SQL 语句或 SSMS），来根据密码策略验证新密码。

**注意**  
如果主用户被锁定，则可以通过使用 `ModifyDBInstance` 命令重置主用户密码来为该用户解锁。

## 修改主用户密码
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin.Reset"></a>

可以使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) 命令修改主用户密码。

**注意**  
重置主用户密码时，RDS 会为主用户重置各种权限，而主用户可能会失去某些权限。如果主用户已被锁定，则重置主用户密码也会解除其锁定。

RDS 会验证新的主用户密码，如果密码不符合策略，则尝试发出 RDS 事件。即使密码不符合密码策略，RDS 也会设置密码。

# 将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成
<a name="User.SQLServer.Options.S3-integration"></a>

您可以在运行 Amazon RDS for SQL Server 的数据库实例和 Amazon S3 存储桶之间传输文件。通过执行此操作，您可以结合使用 Amazon S3 和 SQL Server 功能，例如批量插入。例如，您可以将 .csv、.xml、.txt 和其他文件从 Amazon S3 下载到数据库实例主机，并将数据从 `D:\S3\` 导入到数据库中。所有文件都存储在数据库实例上的 `D:\S3\` 中。

适用以下限制：

**注意**  
对于所有使用 S3 的 SQL Server 功能，RDS 主机和 S3 之间的流量通过 RDS 内部 VPC 中的 VPC 端点进行路由。此流量不使用 RDS 实例端点 ENI。S3 存储桶策略无法通过网络条件限制 RDS 流量。
+ 在多可用区实例上进行故障转移后，将在备用副本上删除 `D:\S3` 文件夹中的文件。有关更多信息，请参阅“[S3 集成的多可用区限制](#S3-MAZ)”。
+ 数据库实例和 S3 存储桶必须位于同一 AWS 区域。
+ 如果您一次运行多个 S3 集成任务，则这些任务将按顺序运行，而不是并行运行。
**注意**  
S3 集成任务与本机备份和还原任务共享相同的队列。在此队列中，任何时候最多只能有两个正在进行的任务。因此，两个正在运行的本机备份和还原任务将阻止所有 S3 集成任务。
+ 您必须在已还原的实例上重新启用 S3 集成功能。S3 集成不会从源实例传播到已还原的实例。`D:\S3` 中的文件在还原的实例上被删除。
+ 下载到数据库实例的文件数不能超过 100 个。换句话说，`D:\S3\` 中的文件数不能超过 100 个。
+ 仅支持下载无文件扩展名或具有以下文件扩展名的文件：.abf、.asdatabase、.bcp、configsettings、.csv、.dat、.deploymentoptions、.deploymenttargets、.fmt、.info、.ispac、.lst、.tbl、.txt、.xml 和 .xmla。
+ S3 存储桶必须与相关 AWS Identity and Access Management (IAM) 角色具有同一所有者。因此，不支持跨账户 S3 集成。
+ S3 存储桶不能向公众开放。
+ 从 RDS 上传到 S3 的文件大小限制为每个文件 50 GB。
+ 从 S3 下载到 RDS 的文件大小限制为 S3 支持的最大文件大小。

**Topics**
+ [将 RDS for SQL Server 与 S3 集成的先决条件](Appendix.SQLServer.Options.S3-integration.preparing.md)
+ [启用 RDS for SQL Server 与 S3 的集成](Appendix.SQLServer.Options.S3-integration.enabling.md)
+ [在 RDS for SQL Server 和 Amazon S3 之间传输文件](Appendix.SQLServer.Options.S3-integration.using.md)
+ [列出 RDS 数据库实例上的文件](Appendix.SQLServer.Options.S3-integration.using.listing-files.md)
+ [删除 RDS 数据库实例上的文件](Appendix.SQLServer.Options.S3-integration.using.deleting-files.md)
+ [监控文件传输任务的状态](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md)
+ [取消任务](Appendix.SQLServer.Options.S3-integration.canceltasks.md)
+ [S3 集成的多可用区限制](#S3-MAZ)
+ [禁用 RDS for SQL Server 与 S3 的集成](Appendix.SQLServer.Options.S3-integration.disabling.md)

有关使用 Amazon S3 中的文件的更多信息，请参阅 [Amazon Simple Storage Service 入门](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3)。

# 将 RDS for SQL Server 与 S3 集成的先决条件
<a name="Appendix.SQLServer.Options.S3-integration.preparing"></a>

在开始之前，请找到或创建要使用的 S3 存储桶。另外，添加权限，以便 RDS 数据库实例可以访问 S3 存储桶。要配置此访问权限，请同时创建 IAM 策略和 IAM 角色。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.preparing.console"></a>

**创建用于访问 Amazon S3 的 IAM 策略**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**策略**。

1. 创建新策略，并使用 **Visual editor (可视化编辑器)** 选项卡执行以下步骤。

1. 对于 **Service (服务)**，输入 **S3**，然后选择 **S3** 服务。

1. 对于**操作**，选择以下各项以授予数据库实例所需的访问权限：
   + `ListAllMyBuckets` – 必需
   + `ListBucket` – 必需
   + `GetBucketAcl` – 必需
   + `GetBucketLocation` – 必需
   + `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
   + `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 对于 **Resources (资源)**，显示的选项取决于您在上一步中选择的操作。您可能会看到针对 **bucket (存储桶)** 和/或 **object (对象)** 的选项。对于其中的每一个，添加适当的 Amazon Resource Name (ARN)。

   对于 **bucket (存储桶)**，为要使用的存储桶添加 ARN。例如，如果存储桶名为 *amzn-s3-demo-bucket*，请将 ARN 设置为 `arn:aws:s3:::amzn-s3-demo-bucket`。

   对于 **object (对象)**，为存储桶输入 ARN，然后选择以下各项之一：
   + 要授予对指定存储桶中所有文件的访问权限，请为 **Bucket name (存储桶名称)** 和 **Object name (对象名称)** 选择 **Any (任何)**。
   + 要授予对存储桶中特定文件或文件夹的访问权限，请提供您希望 SQL Server 访问的特定存储桶和对象的 ARN。

1. 按照控制台中的说明进行操作，直到您完成策略创建。

   前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明，请参阅 *IAM 用户指南*中的 [创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

**创建使用上一过程中的 IAM 策略的 IAM 角色**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**角色**。

1. 创建新的 IAM 角色，然后选择控制台中显示的以下选项：
   + **AWS 服务**
   + **RDS**
   + **RDS – Add Role to Database (将角色添加到数据库**

   然后选择底部的 **Next:Permissions (下一步: 权限)**。

1. 对于 **Attach permissions policies (附加权限策略)**，输入您之前创建的 IAM 策略的名称。然后，从列表中选择该策略。

1. 按照控制台中的说明进行操作，直到您完成角色创建。

   前面是设置角色的简要指南。如果您需要有关创建角色的更多详细说明，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.preparing.CLI"></a>

要授予 Amazon RDS 对 Amazon S3 存储桶的访问权限，请使用以下过程：

1. 创建向 Amazon RDS 授予对 S3 存储桶的访问权限的 IAM 策略。

1. 创建一个让 Amazon RDS 可代表您访问 S3 存储桶的 IAM 角色。

   有关更多信息，请参阅《IAM 用户指南》**中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

1. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

**创建 IAM policy**

包括适当的操作以授予数据库实例所需的访问权限：
+ `ListAllMyBuckets` – 必需
+ `ListBucket` – 必需
+ `GetBucketAcl` – 必需
+ `GetBucketLocation` – 必需
+ `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
+ `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 以下 AWS CLI 命令使用这些选项创建一个名为 `rds-s3-integration-policy` 的 IAM 策略。该策略授予对名为 *amzn-s3-demo-bucket* 的存储桶的访问权限。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws iam create-policy \
   	 --policy-name rds-s3-integration-policy \
   	 --policy-document '{
   	        "Version": "2012-10-17",		 	 	 
   	        "Statement": [
   	            {
   	                "Effect": "Allow",
   	                "Action": "s3:ListAllMyBuckets",
   	                "Resource": "*"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:ListBucket",
   	                    "s3:GetBucketAcl",
   	                    "s3:GetBucketLocation"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:GetObject",
   	                    "s3:PutObject",
   	                    "s3:ListMultipartUploadParts",
   	                    "s3:AbortMultipartUpload"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
   	            }
   	        ]
   	    }'
   ```

   对于：Windows

   确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

   首先，创建包含以下权限策略的 `policy.json` 文件：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:ListAllMyBuckets",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketACL",
                   "s3:GetBucketLocation"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:ListMultipartUploadParts",
                   "s3:AbortMultipartUpload"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
           }
       ]
   }
   ```

------

   然后使用以下命令创建策略：

   ```
   aws iam create-policy ^
        --policy-name rds-s3-integration-policy ^
        --policy-document file://file_path/assume_role_policy.json
   ```

1. 创建策略之后，请记下策略的 Amazon Resource Name (ARN)。后续步骤需要该 ARN。

**创建 IAM 角色**
+ 以下 AWS CLI 命令创建 `rds-s3-integration-role` IAM 角色来实现此目的。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws iam create-role \
  	   --role-name rds-s3-integration-role \
  	   --assume-role-policy-document '{
  	     "Version": "2012-10-17",		 	 	 
  	     "Statement": [
  	       {
  	         "Effect": "Allow",
  	         "Principal": {
  	            "Service": "rds.amazonaws.com"
  	          },
  	         "Action": "sts:AssumeRole"
  	       }
  	     ]
  	   }'
  ```

  对于：Windows

  确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

  首先，创建包含以下策略的 `assume_role_policy.json` 文件：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

------

  然后使用以下命令创建 IAM 角色：

  ```
  aws iam create-role ^
       --role-name rds-s3-integration-role ^
       --assume-role-policy-document file://file_path/assume_role_policy.json
  ```  
**Example 使用全局条件上下文键创建 IAM 角色**  

  我们建议在基于资源的策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

  您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
  + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
  + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

  在此策略中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 S3 集成，请确保包含数据库实例 ARN，如以下示例所示。

  对于 Linux、macOS 或 Unix：

  ```
  aws iam create-role \
  	   --role-name rds-s3-integration-role \
  	   --assume-role-policy-document '{
  	     "Version": "2012-10-17",		 	 	 
  	     "Statement": [
  	       {
  	         "Effect": "Allow",
  	         "Principal": {
  	            "Service": "rds.amazonaws.com"
  	          },
  	         "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                      }
                  }
  	       }
  	     ]
  	   }'
  ```

  对于：Windows

  将全局条件上下文键添加至 `assume_role_policy.json`。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                  }
              }
          }
      ]
  }
  ```

------

**将 IAM 策略附加到 IAM 角色**
+ 以下 AWS CLI 命令将策略附加到名为 `rds-s3-integration-role` 的角色。将 `your-policy-arn` 替换为您在上一步中记下的策略 ARN。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws iam attach-role-policy \
  	   --policy-arn your-policy-arn \
  	   --role-name rds-s3-integration-role
  ```

  对于：Windows

  ```
  aws iam attach-role-policy ^
  	   --policy-arn your-policy-arn ^
  	   --role-name rds-s3-integration-role
  ```

# 启用 RDS for SQL Server 与 S3 的集成
<a name="Appendix.SQLServer.Options.S3-integration.enabling"></a>

在以下部分中，您可以找到如何启用 Amazon S3 与 Amazon RDS for SQL Server 的集成。要使用 S3 集成，您的数据库实例必须与您先前创建的 IAM 角色相关联，然后才能使用 `S3_INTEGRATION` feature-name 参数。

**注意**  
要将 IAM 角色添加到数据库实例，数据库实例的状态必须为 **available**。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.enabling.console"></a>

**将您的 IAM 角色与数据库实例关联**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 选择 RDS for SQL Server 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security (连接性和安全性)** 选项卡上的 **Manage IAM roles (管理 IAM 角色)** 部分中，为 **Add IAM roles to this instance (向此实例添加 IAM 角色)** 选择要添加的 IAM 角色。

1. 对于 **Feature (功能)**，选择 **S3\$1INTEGRATION**。  
![\[添加 S3_INTEGRATION 角色\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ora-s3-integration-role.png)

1. 选择 **Add role (添加角色)**。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.enabling.cli"></a>

**将 IAM 角色添加到 RDS for SQL Server 数据库实例**
+ 以下 AWS CLI 命令将您的 IAM 角色添加到名为 `mydbinstance` 的 RDS for SQL Server 数据库实例中。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-role-to-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  对于 Windows：

  ```
  aws rds add-role-to-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  将 `your-role-arn` 替换为您在上一步中记下的角色 ARN。必须为 `S3_INTEGRATION` 选项指定 `--feature-name`。

# 在 RDS for SQL Server 和 Amazon S3 之间传输文件
<a name="Appendix.SQLServer.Options.S3-integration.using"></a>

您可以使用 Amazon RDS 存储过程在 Amazon S3 和 RDS 数据库实例之间下载和上传文件。您还可以使用 Amazon RDS 存储过程来列出和删除 RDS 实例上的文件。

您从 S3 下载和上传到 S3 的文件存储在 `D:\S3` 文件夹中。这是可用于访问文件的唯一文件夹。您可以将文件组织到子文件夹中，这些子文件夹是您在下载过程中包含目标文件夹时为您创建的。

某些存储过程要求您向 &S3 存储桶和文件提供 Amazon Resource Name (ARN)。您的 ARN 的格式为 `arn:aws:s3:::amzn-s3-demo-bucket/file_name`。Amazon S3 不需要在 ARN 中使用账号或AWS区域。

S3 集成任务按顺序运行，并且与本机备份和还原任务共用同一队列。在此队列中，任何时候最多只能有两个正在进行的任务。任务可能需要长达五分钟时间才能开始处理。

## 将文件从 Amazon S3 存储桶下载到 SQL Server 数据库实例
<a name="Appendix.SQLServer.Options.S3-integration.using.download"></a>

要将文件从 S3 存储桶下载到 RDS for SQL Server 数据库实例，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_download_from_s3`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  必需  |  要下载的文件的 S3 ARN，例如：`arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  可选  |  RDS 实例的文件路径。如果未指定，则文件路径为 `D:\S3\<filename in s3>`。RDS 支持绝对路径和相对路径。如果要创建子文件夹，请将其包含在文件路径中。  | 
|  `@overwrite_file`  |  INT  |  0  |  可选  | 覆盖现有文件： 0 = 不覆盖 1 = 覆盖 | 

您可以下载不带文件扩展名的文件和具有以下文件扩展名的文件：.bcp、.csv、.dat、.fmt、.info、.lst、.tbl、.txt 和 .xml。

**注意**  
启用 SQL Server Integration Services 时，支持下载具有 .ispac 文件扩展名的文件。有关启用 SSIS 的更多信息，请参阅[SQL Server Integration Services](Appendix.SQLServer.Options.SSIS.md)。  
启用 SQL Server Analysis Services 时，支持下载具有以下文件扩展名的文件：.abf、.asdatabase、.configsettings、.deploymentoptions、.deploymenttargets 和 .xmla。有关启用 SSAS 的更多信息，请参阅[SQL Server Analysis Services](Appendix.SQLServer.Options.SSAS.md)。

以下示例显示了从 S3 下载文件的存储过程。

```
exec msdb.dbo.rds_download_from_s3
	    @s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/bulk_data.csv',
	    @rds_file_path='D:\S3\seed_data\data.csv',
	    @overwrite_file=1;
```

示例 `rds_download_from_s3` 操作在 `seed_data` 中创建一个名为 `D:\S3\` 的文件夹（如果该文件夹尚不存在）。然后，该示例将源文件 `bulk_data.csv` 从 S3 下载到数据库实例上名为 `data.csv` 的新文件。如果以前存在此文件，则会覆盖它，因为 `@overwrite_file` 参数设置为 `1`。

## 将文件从 SQL Server 数据库实例上传到 Amazon S3 存储桶
<a name="Appendix.SQLServer.Options.S3-integration.using.upload"></a>

要将文件从 RDS for SQL Server 数据库实例上传到 S3 存储桶，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_upload_to_s3`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  必需  |  要在 S3 中创建的文件的 S3 ARN，例如：`arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  必需  | 要上传到 S3 的文件的文件路径。支持绝对路径和相对路径。 | 
|  `@overwrite_file`  |  INT  |  –  |  可选  |  覆盖现有文件： 0 = 不覆盖 1 = 覆盖  | 

以下示例将名为 `data.csv` 的文件从 `D:\S3\seed_data\` 中的指定位置上传到 ARN 指定的 S3 存储桶中的 `new_data.csv` 文件。

```
exec msdb.dbo.rds_upload_to_s3 
		@rds_file_path='D:\S3\seed_data\data.csv',
		@s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/new_data.csv',
		@overwrite_file=1;
```

如果 S3 中以前存在此文件，则会覆盖它，因为 @overwrite\$1file 参数设置为 `1`。

# 列出 RDS 数据库实例上的文件
<a name="Appendix.SQLServer.Options.S3-integration.using.listing-files"></a>

要列出数据库实例上可用的文件，请同时使用存储过程和函数。首先，运行以下存储过程来从 `D:\S3\` 中的文件收集文件详细信息。

```
exec msdb.dbo.rds_gather_file_details;
```

此存储过程返回任务的 ID。像其他任务一样，此存储过程异步运行。一旦任务的状态为 `SUCCESS`，您就可以在 `rds_fn_list_file_details` 函数中使用任务 ID 来列出 D:\$1S3\$1 中的现有文件和目录，如下所示。

```
SELECT * FROM msdb.dbo.rds_fn_list_file_details(TASK_ID);
```

`rds_fn_list_file_details` 函数将返回具有以下列的表格。


| 输出参数 | 描述 | 
| --- | --- | 
| filepath | 文件的绝对路径（例如，D:\$1S3\$1mydata.csv） | 
| size\$1in\$1bytes | 文件大小（以字节为单位） | 
| last\$1modified\$1utc | 上次修改日期和时间（采用 UTC 格式） | 
| is\$1directory | 指示项目是否为目录的选项 (true/false) | 

# 删除 RDS 数据库实例上的文件
<a name="Appendix.SQLServer.Options.S3-integration.using.deleting-files"></a>

要删除数据库实例上可用的文件，请使用具有以下参数的 Amazon RDS 存储过程 `msdb.dbo.rds_delete_from_filesystem`。


| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  必需  | 要删除的文件的文件路径。支持绝对路径和相对路径。 | 
|  `@force_delete`  |  INT  | 0 |  可选  |  要删除目录，必须包含此标志并将其设置为 `1`。 `1` = 删除目录 如果要删除文件，则忽略此参数。  | 

要删除目录，`@rds_file_path` 必须以反斜杠 (`\`) 结尾，并且 `@force_delete` 必须设置为 `1`。

以下示例将删除 `D:\S3\delete_me.txt` 文件。

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\delete_me.txt';
```

以下示例将删除 `D:\S3\example_folder\` 目录。

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\example_folder\',
    @force_delete=1;
```

# 监控文件传输任务的状态
<a name="Appendix.SQLServer.Options.S3-integration.using.monitortasks"></a>

要跟踪 S3 集成任务的状态，请调用 `rds_fn_task_status` 函数。它获取两个参数。第一个参数应该始终为 `NULL`，因为它不适用于 S3 集成。第二个参数接受任务 ID。

要查看所有任务的列表，请将第一个参数设置为 `NULL`，将第二个参数设置为 `0`，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

要获取特定任务，请将第一个参数设置为 `NULL`，将第二个参数设置为任务 ID，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 函数将返回以下信息。


|  输出参数  |  描述  | 
| --- | --- | 
|  `task_id`  |  任务的 ID。  | 
|  `task_type`  |  对于 S3 集成，任务可以具有以下任务类型： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `database_name`  | 不适用于 S3 集成任务。 | 
|  `% complete`  |  用百分比表示的任务进度。  | 
|  `duration(mins)`  |  在任务上花费的时间 (以分钟为单位)。  | 
|  `lifecycle`  |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `task_info`  |  有关任务的其他信息。如果在处理过程中发生错误，则此列包含有关错误的信息。  | 
|  `last_updated`  |  上次更新任务状态的日期和时间。  | 
|  `created_at`  |  任务的创建日期和时间。  | 
|  `S3_object_arn`  |  从中下载或上传到其中的 S3 对象的 ARN。  | 
|  `overwrite_S3_backup_file`  |  不适用于 S3 集成任务。  | 
|  `KMS_master_key_arn`  |  不适用于 S3 集成任务。  | 
|  `filepath`  |  RDS 数据库实例上的文件路径。  | 
|  `overwrite_file`  |  指示是否覆盖现有文件的选项。  | 
|  `task_metadata`  |  不适用于 S3 集成任务。  | 

# 取消任务
<a name="Appendix.SQLServer.Options.S3-integration.canceltasks"></a>

要取消 S3 集成任务，请使用带有 `msdb.dbo.rds_cancel_task` 参数的 `task_id` 存储过程。无法取消正在进行的删除和列出任务。以下示例显示了取消任务的请求。

```
exec msdb.dbo.rds_cancel_task @task_id = 1234;
```

要获取所有任务及其任务 ID 的概述，请使用`rds_fn_task_status`中介绍的 [监控文件传输任务的状态](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md) 函数。

## S3 集成的多可用区限制
<a name="S3-MAZ"></a>

在多可用区实例上，故障转移之后将删除备用副本上 `D:\S3` 文件夹中的文件。故障转移可以是预先计划的，例如在数据库实例修改（如更改实例类或升级引擎版本）期间。或者，故障转移可能是未计划的，在主实例停机时进行。

**注意**  
我们不建议将 `D:\S3` 文件夹用于文件存储。最佳做法是将创建的文件上传到 Amazon S3 以使其持久，并在需要导入数据时下载文件。

要确定上次故障转移时间，您可以使用 `msdb.dbo.rds_failover_time` 存储过程。有关更多信息，请参阅“[确定 Amazon RDS for SQL Server 的上次失效转移时间](Appendix.SQLServer.CommonDBATasks.LastFailover.md)”。

**Example 最近无故障转移示例**  
此示例显示错误日志中最近没有故障转移的输出。自 2020-04-29 23:59:00.01 以来，没有发生故障转移。  
因此，在该时间之后下载的所有文件，如未使用 `rds_delete_from_filesystem` 存储过程删除，则仍可在当前主机上访问。在该时间之前下载的文件可能也可用。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  null  | 

**Example 最近故障转移示例**  
此示例显示错误日志中最近有故障转移的输出。最近一次故障转移的时间是在 2020-05-05 18:57:51.89。  
在该时间之后下载的所有文件，如未使用 `rds_delete_from_filesystem` 存储过程删除，则仍可在当前主机上访问。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  2020-05-05 18:57:51.8900000  | 

# 禁用 RDS for SQL Server 与 S3 的集成
<a name="Appendix.SQLServer.Options.S3-integration.disabling"></a>

在下面，您可以找到如何禁用 Amazon S3 与 Amazon RDS for SQL Server 的集成。禁用 S3 集成时，不会删除 `D:\S3\` 中的文件。

**注意**  
要从数据库实例中删除 IAM 角色，数据库实例的状态必须为 `available`。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.disabling.console"></a>

**从数据库实例中取消关联您的 IAM 角色**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 选择 RDS for SQL Server 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security (连接性和安全性)** 选项卡上的 **Manage IAM roles (管理 IAM 角色)** 部分中，选择要删除的 IAM 角色。

1. 选择**删除**。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.disabling.cli"></a>

**从 RDS for SQL Server 数据库实例中删除 IAM 角色**
+ 以下 AWS CLI 命令从名为 `mydbinstance` 的 RDS for SQL Server 数据库实例中删除 IAM 角色。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-role-from-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  对于 Windows：

  ```
  aws rds remove-role-from-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  使用 `your-role-arn` 选项的适当 IAM 角色 ARN 替换 `--feature-name`。

# 在 Amazon RDS for SQL Server 上使用数据库邮件
<a name="SQLServer.DBMail"></a>

您可以使用数据库邮件从 Amazon RDS on SQL Server 数据库实例向用户发送电子邮件。这些消息可以包含文件和查询结果。数据库邮件包括以下组件：
+ **配置和安全对象** – 这些对象可以创建配置文件和账户，并存储在 `msdb` 数据库中。
+ **消息收发对象** – 这些对象包括用于发送消息的 [sp\$1send\$1dbmail](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql) 存储过程以及保存有关消息信息的数据结构。相关内容均存储在 `msdb` 数据库中。
+ **日志记录和审计对象** – 数据库邮件将日志记录信息写入 `msdb` 数据库和 Microsoft Windows 应用程序事件日志中。
+ **数据库邮件可执行文件** – `DatabaseMail.exe` 读取 `msdb` 数据库中的队列并发送电子邮件。

RDS 在 Web 版、标准版和企业版上支持所有 SQL Server 版本的数据库邮件。

## 限制
<a name="SQLServer.DBMail.Limitations"></a>

以下限制适用于在 SQL Server 数据库实例上使用数据库邮件：
+ SQL Server 精简版不支持数据库邮件。
+ 不支持修改数据库邮件配置参数。如欲查看预设（默认）值，请使用 [sysmail\$1help\$1configure\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-configure-sp-transact-sql) 存储过程。
+ 不完全支持文件附件。有关更多信息，请参阅“[使用文件附件](#SQLServer.DBMail.Files)”。
+ 文件附件的最大大小为 1 MB。
+ 数据库邮件需要对多可用区数据库实例进行额外配置 有关更多信息，请参阅“[多可用区部署的注意事项](#SQLServer.DBMail.MAZ)”。
+ 不支持将 SQL Server Agent 配置为向预定义运算符发送电子邮件。

# 启用数据库邮件
<a name="SQLServer.DBMail.Enable"></a>

使用以下过程为数据库实例启用数据库邮件：

1. 创建新的参数组。

1. 修改参数组以将 `database mail xps` 参数设置为 1。

1. 将参数组与数据库实例相关联。

## 为数据库邮件创建参数组
<a name="DBMail.CreateParamGroup"></a>

为与 SQL Server 版本和数据库实例版本对应的 `database mail xps` 参数创建参数组。

**注意**  
您也可以修改现有参数组。按照[修改启用数据库邮件的参数](#DBMail.ModifyParamGroup)中过程操作。

### 控制台
<a name="DBMail.CreateParamGroup.Console"></a>

以下示例为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择**创建参数组**。

1. 在**创建参数组**窗格中，执行以下操作：

   1. 对于**参数组系列**，选择 **sqlserver-se-13.0**。

   1. 对于**组名称**，输入参数组的标识符，如 **dbmail-sqlserver-se-13**。

   1. 对于**描述**，输入 **Database Mail XPs**。

1. 选择**创建**。

### CLI
<a name="DBMail.CreateParamGroup.CLI"></a>

以下示例为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-parameter-group \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --db-parameter-group-family "sqlserver-se-13.0" \
      --description "Database Mail XPs"
  ```

  对于：Windows

  ```
  aws rds create-db-parameter-group ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --db-parameter-group-family "sqlserver-se-13.0" ^
      --description "Database Mail XPs"
  ```

## 修改启用数据库邮件的参数
<a name="DBMail.ModifyParamGroup"></a>

修改与 SQL Server 版本和数据库实例版本对应的参数组中的 `database mail xps` 参数。

要启用数据库邮件，请将 `database mail xps` 参数设置为 1。

### 控制台
<a name="DBMail.ModifyParamGroup.Console"></a>

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择参数组，例如 **dbmail-sqlserver-se-13**。

1. 在**参数**下，从参数列表中筛选 **mail**。

1. 选择**数据库邮件 xps**。

1. 选择**编辑参数**。

1. 输入 **1**。

1. 选择**保存更改**。

### CLI
<a name="DBMail.ModifyParamGroup.CLI"></a>

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-parameter-group \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --parameters "ParameterName='database mail xps',ParameterValue=1,ApplyMethod=immediate"
  ```

  对于：Windows

  ```
  aws rds modify-db-parameter-group ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --parameters "ParameterName='database mail xps',ParameterValue=1,ApplyMethod=immediate"
  ```

## 将参数组与数据库实例相关联
<a name="DBMail.AssocParamGroup"></a>

您可以使用 AWS 管理控制台 或 AWS CLI 将数据库邮件参数组与数据库实例相关联。

### 控制台
<a name="DBMail.AssocParamGroup.Console"></a>

您可以将数据库邮件参数组与新的或现有的数据库实例相关联。
+ 对于新的数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="DBMail.AssocParamGroup.CLI"></a>

您可以将数据库邮件参数组与新的或现有的数据库实例相关联。

**如欲使用数据库邮件参数组创建数据库实例**
+ 指定在创建参数组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mydbinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 13.00.5426.0.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li
      --db-parameter-group-name dbmail-sqlserver-se-13
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 13.00.5426.0.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --db-parameter-group-name dbmail-sqlserver-se-13
  ```

**如欲修改数据库实例并关联数据库邮件参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mydbinstance \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --apply-immediately
  ```

# 配置数据库邮件
<a name="SQLServer.DBMail.Configure"></a>

您可以执行以下任务来配置数据库邮件：

1. 创建数据库邮件配置文件。

1. 创建数据库邮件账户。

1. 将数据库邮件账户添加到数据库邮件配置文件中。

1. 将用户添加到数据库邮件配置文件中。

**注意**  
如欲配置数据库邮件，请确保您对 `execute` 数据库中的存储过程拥有 `msdb` 权限。

## 创建数据库邮件配置文件
<a name="SQLServer.DBMail.Configure.Profile"></a>

如欲创建数据库邮件配置文件，请使用 [sysmail\$1add\$1profile\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql) 存储过程。以下示例创建一个名为 `Notifications` 的配置文件。

**如欲创建配置文件**
+ 使用以下 SQL 语句。

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_profile_sp  
      @profile_name         = 'Notifications',  
      @description          = 'Profile used for sending outgoing notifications using Amazon SES.';
  GO
  ```

## 创建数据库邮件账户
<a name="SQLServer.DBMail.Configure.Account"></a>

如欲创建数据库邮件账户，请使用 [sysmail\$1add\$1account\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql) 存储过程。以下示例使用 Amazon Simple Email Service 在私有 VPC 中的 RDS for SQL Server 数据库实例上创建一个名为 `SES` 的账户。

使用 Amazon SES 需要以下参数：
+ `@email_address` – 经过 Amazon SES 验证的身份。有关更多信息，请参阅[在 Amazon SES 中验证身份](https://docs.aws.amazon.com/ses/latest/dg/verify-addresses-and-domains.html)。
+ `@mailserver_name` – Amazon SES SMTP 端点。有关更多信息，请参阅[连接到 Amazon SES SMTP 端点](https://docs.aws.amazon.com/ses/latest/dg/smtp-connect.html)。
+ `@username` – Amazon SES SMTP 用户名。有关更多信息，请参阅[获取 Amazon SES SMTP 凭证](https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html)。

  请勿使用AWS Identity and Access Management用户名。
+ `@password` – Amazon SES SMTP 密码。有关更多信息，请参阅[获取 Amazon SES SMTP 凭证](https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html)。

**如欲创建账户**
+ 使用以下 SQL 语句。

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_account_sp
      @account_name        = 'SES',
      @description         = 'Mail account for sending outgoing notifications.',
      @email_address       = 'nobody@example.com',
      @display_name        = 'Automated Mailer',
      @mailserver_name     = 'vpce-0a1b2c3d4e5f-01234567.email-smtp.us-west-2.vpce.amazonaws.com',
      @port                = 587,
      @enable_ssl          = 1,
      @username            = 'Smtp_Username',
      @password            = 'Smtp_Password';
  GO
  ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的凭证。

## 将数据库邮件账户添加到数据库邮件配置文件中
<a name="SQLServer.DBMail.Configure.AddAccount"></a>

如欲将数据库邮件账户添加到数据库邮件配置文件中，请使用 [sysmail\$1add\$1profileaccount\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql) 存储过程。以下示例将 `SES` 账户添加到 `Notifications` 配置文件中。

**如欲将账户添加到配置文件中**
+ 使用以下 SQL 语句。

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
      @profile_name        = 'Notifications',
      @account_name        = 'SES',
      @sequence_number     = 1;
  GO
  ```

## 将用户添加到数据库邮件配置文件中
<a name="SQLServer.DBMail.Configure.AddUser"></a>

如欲向 `msdb` 数据库委托人授予使用数据库邮件配置文件的权限，请使用 [sysmail\$1add\$1principalprofile\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-principalprofile-sp-transact-sql) 存储过程。*委托人*指可以请求获取 SQL Server 资源的实体。数据库委托人必须映射到 SQL Server 身份验证用户、Windows 身份验证用户或 Windows 身份验证组。

以下示例授予对 `Notifications` 配置文件的公有访问权限。

**如欲将用户添加到配置文件**
+ 使用以下 SQL 语句。

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_principalprofile_sp  
      @profile_name       = 'Notifications',  
      @principal_name     = 'public',  
      @is_default         = 1;
  GO
  ```

## 数据库邮件的 Amazon RDS 存储过程和函数
<a name="SQLServer.DBMail.StoredProc"></a>

Microsoft 提供[存储过程](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/database-mail-stored-procedures-transact-sql)用于使用数据库邮件，例如创建、列出、更新和删除帐户和配置文件。此外，RDS 还提供了数据库邮件的存储过程和函数，如下表所示。


| 过程/功能 | 描述 | 
| --- | --- | 
| rds\$1fn\$1sysmail\$1allitems | 显示已发送的消息，包括其他用户提交的消息。 | 
| rds\$1fn\$1sysmail\$1event\$1log | 显示事件，包括其他用户提交的消息事件。 | 
| rds\$1fn\$1sysmail\$1mailattachments | 显示附件，包括其他用户提交的消息附件。 | 
| rds\$1sysmail\$1control | 启动和停止邮件队列（DatabaseMail.exe 进程）。 | 
| rds\$1sysmail\$1delete\$1mailitems\$1sp | 从数据库邮件内部表中删除所有用户发送的电子邮件。 | 

# 使用数据库邮件发送电子邮件
<a name="SQLServer.DBMail.Send"></a>

您可以使用数据库邮件的 [sp\$1send\$1dbmail](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql) 存储过程发送电子邮件。

## 用法
<a name="SQLServer.DBMail.Send.Usage"></a>

```
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile_name',
@recipients = 'recipient1@example.com[; recipient2; ... recipientn]',
@subject = 'subject',
@body = 'message_body',
[@body_format = 'HTML'],
[@file_attachments = 'file_path1; file_path2; ... file_pathn'],
[@query = 'SQL_query'],
[@attach_query_result_as_file = 0|1]';
```

以下参数为必需参数：
+ `@profile_name` – 要从中发送消息的数据库邮件配置文件的名称。
+ `@recipients` – 要向其发送消息的电子邮件地址列表，用分号分隔。
+ `@subject` – 消息主题。
+ `@body` – 消息的正文。您也可以使用声明的变量作为主体。

以下参数为可选参数：
+ `@body_format` – 此参数与声明的变量一起使用，从而以 HTML 格式发送电子邮件。
+ `@file_attachments` – 以分号分隔的消息附件列表。文件路径必须是绝对路径。
+ `@query` – 要运行的 SQL 查询。查询结果可以作为文件附加，也可以包含在消息正文中。
+ `@attach_query_result_as_file` – 是否将查询结果附加为文件。设置为 0 表示“否”，设置为 1 表示“是”。默认值是 0。

## 示例
<a name="SQLServer.DBMail.Send.Examples"></a>

以下示例演示了如何发送电子邮件。

**Example 向单个收件人发送消息**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Automated DBMail message - 1',
     @body               = 'Database Mail configuration was successful.';
GO
```

**Example 向多个收件人发送消息**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'recipient1@example.com;recipient2@example.com',
     @subject            = 'Automated DBMail message - 2',
     @body               = 'This is a message.';
GO
```

**Example 将 SQL 查询结果作为文件附件发送**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Test SQL query',
     @body               = 'This is a SQL query test.',
     @query              = 'SELECT * FROM abc.dbo.test',
     @attach_query_result_as_file = 1;
GO
```

**Example 以 HTML 格式发送消息**  

```
USE msdb
GO

DECLARE @HTML_Body as NVARCHAR(500) = 'Hi, <h4> Heading </h4> </br> See the report. <b> Regards </b>';

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Test HTML message',
     @body               = @HTML_Body,
     @body_format        = 'HTML';
GO
```

**Example 数据库中发生特定事件时，使用触发器发送消息**  

```
USE AdventureWorks2017
GO
IF OBJECT_ID ('Production.iProductNotification', 'TR') IS NOT NULL
DROP TRIGGER Purchasing.iProductNotification
GO

CREATE TRIGGER iProductNotification ON Production.Product
   FOR INSERT
   AS
   DECLARE @ProductInformation nvarchar(255);
   SELECT
   @ProductInformation = 'A new product, ' + Name + ', is now available for $' + CAST(StandardCost AS nvarchar(20)) + '!'
   FROM INSERTED i;

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'New product information',
     @body               = @ProductInformation;
GO
```

# 查看消息、日志和附件
<a name="SQLServer.DBMail.View"></a>

您可以使用 RDS 存储过程查看消息、事件日志和附件。

**如欲查看所有电子邮件**
+ 使用以下 SQL 查询。

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_allitems(); --WHERE sent_status='sent' or 'failed' or 'unsent'
  ```

**如欲查看所有电子邮件事件日志**
+ 使用以下 SQL 查询。

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_event_log();
  ```

**如欲查看所有电子邮件附件**
+ 使用以下 SQL 查询。

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_mailattachments();
  ```

# 删除消息
<a name="SQLServer.DBMail.Delete"></a>

您可以使用 `rds_sysmail_delete_mailitems_sp` 存储过程删除消息。

**注意**  
当 DBMail 历史数据大小达到 1 GB 时，RDS 会自动删除邮件表项目，且保留期至少为 24 小时。  
如果您希望延长邮件项目的保留时间，可以将其存档。有关详细信息，请参阅 Microsoft 文档中的[创建 SQL Server Agent 作业以对数据库邮件消息和事件日志进行存档](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/create-a-sql-server-agent-job-to-archive-database-mail-messages-and-event-logs)。

**如欲删除所有电子邮件**
+ 使用以下 SQL 语句。

  ```
  DECLARE @GETDATE datetime
  SET @GETDATE = GETDATE();
  EXECUTE msdb.dbo.rds_sysmail_delete_mailitems_sp @sent_before = @GETDATE;
  GO
  ```

**如欲删除具有特定状态的所有电子邮件**
+ 使用以下 SQL 语句删除所有失败的消息。

  ```
  DECLARE @GETDATE datetime
  SET @GETDATE = GETDATE();
  EXECUTE msdb.dbo.rds_sysmail_delete_mailitems_sp @sent_status = 'failed';
  GO
  ```

# 启动和停止邮件队列
<a name="SQLServer.DBMail.StartStop"></a>

使用以下说明启动和停止数据库邮件队列：

**Topics**
+ [启动邮件队列](#SQLServer.DBMail.Start)
+ [停止邮件队列](#SQLServer.DBMail.Stop)

## 启动邮件队列
<a name="SQLServer.DBMail.Start"></a>

您可以使用 `rds_sysmail_control` 存储过程启动数据库邮件过程。

**注意**  
启用数据库邮件会自动启动邮件队列。

**如欲启动邮件队列**
+ 使用以下 SQL 语句。

  ```
  EXECUTE msdb.dbo.rds_sysmail_control start;
  GO
  ```

## 停止邮件队列
<a name="SQLServer.DBMail.Stop"></a>

您可以使用 `rds_sysmail_control` 存储过程停止数据库邮件过程。

**如欲停止邮件队列**
+ 使用以下 SQL 语句。

  ```
  EXECUTE msdb.dbo.rds_sysmail_control stop;
  GO
  ```

## 使用文件附件
<a name="SQLServer.DBMail.Files"></a>

在 SQL Server 上，来自 RDS 的数据库邮件消息不支持以下文件扩展名：.ade、.adp、.apk、.appx、.appxbundle、.bat、.bak、.cab、.chm、.cmd、.com、.cpl、.dll、.dmg、.exe、.hta、.inf1、.ins、.isp、.iso、.jar、.job、.js、.jse、.ldf、.lib、.lnk、.mde、.mdf、.msc、.msi、.msix、.msixbundle、.msp、.mst、.nsh、.pif、.ps、.ps1、.psc1、.reg、.rgs、.scr、.sct、.shb、.shs、.svg、.sys、.u3p、.vb、.vbe、.vbs、.vbscript、.vxd、.ws、.wsc、.wsf 和.wsh。

数据库邮件使用当前用户的 Microsoft Windows 安全环境来控制对文件的访问。使用 SQL Server 身份验证登录的用户无法使用带 `@file_attachments` 存储过程的 `sp_send_dbmail` 参数来附加文件。Windows 不允许 SQL Server 从一台远程计算机向另一台远程计算机提供凭证。因此，当命令从运行 SQL Server 的计算机以外的计算机运行时，数据库邮件无法从网络共享中的附加文件。

但是，您可以使用 SQL Server Agent 作业来附加文件。有关 SQL Server Agent 的详细信息，请参阅 Microsoft 文档中的 [使用 SQL Server Agent for Amazon RDS](Appendix.SQLServer.CommonDBATasks.Agent.md) 和 [SQL Server Agent](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent)。

## 多可用区部署的注意事项
<a name="SQLServer.DBMail.MAZ"></a>

在多可用区数据库实例上配置数据库邮件时，配置不会自动传播到辅助节点。我们建议将多可用区实例转换为单可用区实例，配置数据库邮件，然后将数据库实例转换回多可用区实例。然后，主节点和辅助节点都具有数据库邮件配置。

如果您从配置了数据库邮件的多可用区实例中创建只读副本，则副本将继承配置，但不会向 SMTP 服务器提供密码。使用密码更新数据库邮件账户。

## 删除 SMTP（端口 25）限制
<a name="SQLServer.DBMail.SMTP"></a>

默认情况下，AWS 会阻止 RDS for SQL Server 数据库实例的 SMTP（端口 25）上的出站流量。这样做是为了根据弹性网络接口所有者的策略来阻止垃圾邮件。如果需要，您可以删除此限制。有关更多信息，请参阅[如何删除 Amazon EC2 实例或 Lambda 函数的端口 25 的限制？](https://repost.aws/knowledge-center/ec2-port-25-throttle)。

# Amazon RDS for SQL Server 上 的 tempdb 数据库的实例存储支持。
<a name="SQLServer.InstanceStore"></a>

*实例存储*为数据库实例提供临时性块级存储。此存储位于已物理附加到主机的磁盘上。这些磁盘具有基于固态硬盘 (SSD) 的非易失性存储规范(NVMe) 实例存储。此存储针对低延迟、极高随机 I/O 性能和高速连续读取吞吐量进行了优化。

与基于 Amazon EBS 的标准存储相比，将 `tempdb` 数据文件和 `tempdb` 日志文件放置于实例存储之上可实现更低的读写延迟。

**注意**  
SQL Server 数据库文件和数据库日志文件不会放置于实例存储之上。

## 启用实例存储
<a name="SQLServer.InstanceStore.Enable"></a>

当 RDS 预置具有以下实例类之一的数据库实例时，会自动将 `tempdb` 数据库放置到实例存储中：
+ db.m5d
+ db.r5d
+ db.x2iedn

要启用实例存储，请执行下列操作之一：
+ 使用这些实例类型其中之一创建 SQL Server 数据库实例。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 修改现有 SQL Server 数据库实例以使用其中一个实例。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

在支持其中一种或多种实例类型的所有 AWS 区域均可使用实例存储。有关 `db.m5d` 和 `db.r5d` 实例类的更多信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。有关 Amazon RDS for SQL Server 支持的实例类的更多信息，请参阅 [Microsoft SQL Server 的数据库实例类支持](SQLServer.Concepts.General.InstanceClasses.md)。

## 文件位置和大小注意事项
<a name="SQLServer.InstanceStore.Files"></a>

在没有实例存储的实例上，RDS 将 `tempdb` 数据和日志文件存储在 `D:\rdsdbdata\DATA` 目录中。默认情况下，两个文件的初始大小均为 8 MB。

在具有实例存储的实例上，RDS 将 `tempdb` 数据和日志文件存储在 `T:\rdsdbdata\DATA` 目录中。

当 `tempdb` 只有一个数据文件 (`tempdb.mdf`) 和一个日志文件 (`templog.ldf`)时，默认情况下，`templog.ldf` 的初始大小为 8 MB，而 `tempdb.mdf` 的初始大小为实例存储容量的 80％ 或更多。存储容量的 20％ 或 200 GB（以较低者为准）可以免费作为初始大小。多个 `tempdb` 数据文件均匀分配 80％ 的磁盘空间，而日志文件的初始大小始终为 8 MB。

例如，如果将数据库实例类从 `db.m5.2xlarge` 修改为 `db.m5d.2xlarge`，则 `tempdb` 数据文件的大小从每个 8 MB 增加到总共 234 GB。

**注意**  
除了实例存储 (`tempdb`) 上的 `T:\rdsdbdata\DATA` 数据和日志文件，您还可以在数据卷 (`tempdb`) 上创建额外的 `D:\rdsdbdata\DATA` 数据和日志文件。这些文件的初始大小始终为 8 MB。

## 备份注意事项
<a name="SQLServer.InstanceStore.Backups"></a>

您可能需要长时间保留备份，这会随着时间的推移产生成本。`tempdb` 数据和日志数据块可能会经常发生变化，具体取决于工作负载。这可以大大增加数据库快照的大小。

`tempdb` 位于实例存储上时，快照不包括临时文件。这意味着与仅限 EBS 的存储相比，快照大小更小，占用的免费备份分配更少。

## 磁盘已满错误
<a name="SQLServer.InstanceStore.DiskFull"></a>

如果您使用了实例存储中的所有可用空间，则可能会收到以下等错误：
+  The transaction log for database 'tempdb' is full due to 'ACTIVE\$1TRANSACTION'.(由于“ACTIVE\$1TRANSACTION”，数据库“tempdb”的事务日志已满。)
+ Could not allocate space for object 'dbo.SORT temporary run storage: 140738941419520' in database 'tempdb' because the 'PRIMARY' filegroup is full. (由于 “PRIMARY”文件组已满，无法为数据库“tempdb”中的对象“dbo.SORT temporary run storage: 140738941419520”分配空间。） Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup. (通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来增加磁盘空间。)

实例存储已满时，您可以执行以下一项或多项操作：
+ 调整工作负载或使用方式 `tempdb`。
+ 向上扩展以使用具有更多 NVMe 存储空间的数据库实例类。
+ 停止使用实例存储，然后使用仅限 EBS 存储的实例类。
+ 通过为 EBS 卷上的 `tempdb` 添加辅助数据或日志文件来使用混合模式。

## 删除实例存储
<a name="SQLServer.InstanceStore.Disable"></a>

要删除实例存储，请修改 SQL Server 数据库实例以使用不支持实例存储的实例类型，如 db.m5、db.r5 或 db.x1e。

**注意**  
删除实例存储时，会将临时文件移至 `D:\rdsdbdata\DATA` 目录，并将其大小缩减到 8 MB。

# 通过 Amazon RDS for Microsoft SQL Server 使用扩展事件。
<a name="SQLServer.ExtendedEvents"></a>

您可以使用 Microsoft SQL Server 中的扩展事件来捕获 Amazon RDS for SQL Server 的调试和故障排除信息。扩展事件取代了已被微软弃用的 SQL Trace 和 Server Profiler。扩展事件类似于 Profiler 跟踪，但对跟踪的事件进行更精细的控制。Amazon RDS 上的 SQL Server 版本 2016 及更高版本支持扩展事件。有关更多信息，请参阅微软文档中的[扩展事件概述](https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events)。

对于在 Amazon RDS for SQL Server 中具有主用户权限的用户，将自动打开扩展事件。

**Topics**
+ [限制和建议](#SQLServer.ExtendedEvents.Limits)
+ [在 RDS for SQL Server 上配置扩展事件](#SQLServer.ExtendedEvents.Config)
+ [多可用区部署的注意事项](#SQLServer.ExtendedEvents.MAZ)
+ [查询扩展事件文件](#SQLServer.ExtendedEvents.Querying)

## 限制和建议
<a name="SQLServer.ExtendedEvents.Limits"></a>

在 RDS for SQL Server 上使用扩展事件时，适用以下限制：
+ 仅企业版和标准版支持扩展事件。
+ 您无法更改默认的扩展事件会话。
+ 确保将会话内存分区模式设置为`NONE`。
+ 会话事件保留模式可以是`ALLOW_SINGLE_EVENT_LOSS`或`ALLOW_MULTIPLE_EVENT_LOSS`。
+ 不支持 Event Tracing for Windows (ETW) 目标。
+ 确保文件目标位于`D:\rdsdbdata\log`目录中。
+ 为了匹配目标，请将`respond_to_memory_pressure`属性设置为`1`。
+ 环形缓冲区目标内存不能大于 4 MB。
+ 不支持以下操作：
  + `debug_break`
  + `create_dump_all_threads`
  + `create_dump_single_threads`
+ 以下版本及更高版本支持该 `rpc_completed` 活动：15.0.4083.2、14.0.3370.1、13.0.5865.1、12.0.6433.1、11.0.7507.2。

## 在 RDS for SQL Server 上配置扩展事件
<a name="SQLServer.ExtendedEvents.Config"></a>

在 RDS for SQL Server 上，您可以配置扩展事件会话的某些参数的值。下表介绍了可配置的参数。


| 参数名称 | 描述 | RDS 默认值 | 最小值 | 最大值 | 
| --- | --- | --- | --- | --- | 
| xe\$1session\$1max\$1memory | 指定分配给会话以进行事件缓冲的最大内存量。此值对应于事件会话的max\$1memory设置。 | 4MB | 4MB | 8 MB | 
| xe\$1session\$1max\$1event\$1size | 指定允许用于大型事件的最大内存大小。此值对应于事件会话的max\$1event\$1size设置。 | 4MB | 4MB | 8 MB | 
| xe\$1session\$1max\$1dispatch\$1latency | 指定事件在被发送到扩展事件会话目标之前在内存中缓冲的时间。此值对应于事件会话的max\$1dispatch\$1latency设置。 | 30 秒 | 1 秒 | 30 秒 | 
| xe\$1file\$1target\$1size | 指定文件目标的最大大小。此值对应于文件目标的max\$1file\$1size设置。 | 100MB | 10 MB | 1GB | 
| xe\$1file\$1retention | 指定事件会话的文件目标生成的文件的保留天数。 | 7 天 | 0 天 | 7 天 | 

**注意**  
通过将`xe_file_retention`设置为零，.xel 文件将在 SQL Server 解锁后自动删除。当 .xel 文件达到 `xe_file_target_size` 中设置的大小限制时，就会解锁。

您可以使用`rdsadmin.dbo.rds_show_configuration`存储过程显示这些参数的当前值。例如，使用以下 SQL 语句查看`xe_session_max_memory`的当前设置。

```
exec rdsadmin.dbo.rds_show_configuration 'xe_session_max_memory'
```

您可以使用`rdsadmin.dbo.rds_set_configuration`存储过程对其进行修改。例如，使用以下 SQL 语句将`xe_session_max_memory`设置为 4 MB。

```
exec rdsadmin.dbo.rds_set_configuration 'xe_session_max_memory', 4
```

## 多可用区部署的注意事项
<a name="SQLServer.ExtendedEvents.MAZ"></a>

在主数据库实例上创建扩展事件会话时，它不会传播到备用副本。您可以在新的主数据库实例上进行故障转移并创建扩展事件会话。您也可以先删除，然后再重新添加多可用区配置，以将扩展事件会话传播到备用副本。RDS 停止备用副本上的所有非默认扩展事件会话，以使这些会话不会消耗备用副本上的资源。因此，在备用副本成为主数据库实例后，确保在新的主数据库实例上手动启动扩展事件会话。

**注意**  
此方法同时适用于 Always On 可用性组和数据库镜像。

您还可以使用 SQL Server Agent 作业跟踪备用副本，并在备用副本成为主数据库实例时启动会话。例如，在 SQL Server Agent 作业步骤中使用以下查询重新启动主数据库实例上的事件会话。

```
BEGIN
    IF (DATABASEPROPERTYEX('rdsadmin','Updateability')='READ_WRITE'
    AND DATABASEPROPERTYEX('rdsadmin','status')='ONLINE'
    AND (DATABASEPROPERTYEX('rdsadmin','Collation') IS NOT NULL OR DATABASEPROPERTYEX('rdsadmin','IsAutoClose')=1)
    )
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe1')
            ALTER EVENT SESSION xe1 ON SERVER STATE=START
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe2')
            ALTER EVENT SESSION xe2 ON SERVER STATE=START
    END
END
```

如果这些会话处于停止状态，则此查询将在主数据库实例上重新启动事件会话`xe1`和`xe2`。您还可以为此查询添加一个时间间隔比较方便的计划。

## 查询扩展事件文件
<a name="SQLServer.ExtendedEvents.Querying"></a>

您可以使用 SQL Server Management Studio 或`sys.fn_xe_file_target_read_file`函数来查看使用文件目标的扩展事件中的数据。有关此函数的更多信息，请参阅微软文档中的[sys.fn\$1xe\$1file\$1target\$1read\$1file (Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-xe-file-target-read-file-transact-sql)。

扩展事件文件目标只能将文件写入 RDS for SQL Server 上的 `D:\rdsdbdata\log` 目录。

例如，使用以下 SQL 查询列出名称以`xe`开头的扩展事件会话的所有文件的内容。

```
SELECT * FROM sys.fn_xe_file_target_read_file('d:\rdsdbdata\log\xe*', null,null,null);
```

# 使用 RDS for SQL Server 访问事务日志备份
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess"></a>

通过访问 RDS for SQL Server 的事务日志备份，您可以列出数据库的事务日志备份文件并将它们复制到目标 Amazon S3 桶。通过在 Amazon S3 桶中复制事务日志备份，您可以将它们与完整和差异数据库备份结合使用，以执行时间点数据库还原。您可以使用 RDS 存储过程设置对事务日志备份的访问权限，列出可用的事务日志备份，并将它们复制到您的 Amazon S3 桶。

访问事务日志备份可提供以下功能和好处：
+ 列出并查看 RDS for SQL Server 数据库实例上数据库的可用事务日志备份的元数据。
+ 将可用事务日志备份从 RDS for SQL Server 复制到目标 Amazon S3 桶。
+ 无需还原整个数据库实例，即可执行数据库的时间点还原。有关将数据库实例还原到某个时间点的更多信息，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

## 可用性和支持
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Availability"></a>

所有 AWS 区域都支持访问事务日志备份。访问事务日志备份适用于 Amazon RDS 支持的所有 Microsoft SQL Server 版本。

## 要求
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements"></a>

在启用访问事务日志备份之前，必须满足以下要求：
+  必须在数据库实例上启用自动备份，并且备份保留期必须设置为一天或多天的值。有关启用自动备份和配置保留策略的更多信息，请参阅[启用自动备份](USER_WorkingWithAutomatedBackups.Enabling.md)。
+ Amazon S3 桶必须与源数据库实例存在于同一账户和区域中。在启用访问事务日志备份之前，请选择现有的 Amazon S3 桶或[创建新桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)，用于存储事务日志备份文件。
+ 必须按如下方式配置 Amazon S3 桶权限策略，以允许 Amazon RDS 将事务日志文件复制到其中：

  1. 将桶的对象账户拥有权属性设置为 **Bucket Owner Preferred**（首选桶拥有者）。

  1. 添加以下策略。原定设置情况下没有策略，因此，请使用桶访问控制列表（ACL）编辑并添加桶策略。

  

  以下示例使用 ARN 指定资源。我们建议在基于资源的信任关系中使用 `SourceArn` 和 `SourceAccount` 全局条件上下文键，以此限制服务对特定资源的权限。有关使用 ARN 的更多信息，请参阅 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)和[Amazon RDS 中的 Amazon 资源名称（ARN）](USER_Tagging.ARN.md)。

    
**Example 用于访问事务日志备份的 Amazon S3 权限策略**  

------
#### [ JSON ]

****  

  ```
      {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Only allow writes to my bucket with bucket owner full control",
              "Effect": "Allow",
              "Principal": {
                  "Service": "backups.rds.amazonaws.com"
              },
              "Action": "s3:PutObject",
              "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/{customer_path}/*",
              "Condition": {
                  "StringEquals": {
                      "s3:x-amz-acl": "bucket-owner-full-control",
                      "aws:sourceAccount": "{customer_account}",
                      "aws:sourceArn": "{db_instance_arn}"
                  }
              }
          }
      ]
  }
  ```

------
+ 用于访问 Amazon S3 桶的 AWS Identity and Access Management（IAM）角色。如果您已有一个 IAM 角色，则可以使用它。您可以选择在使用AWS 管理控制台添加 `SQLSERVER_BACKUP_RESTORE` 选项时为自己创建新的 IAM 角色。或者，您可以手动创建一个新的角色。有关使用 `SQLSERVER_BACKUP_RESTORE` 创建和配置 IAM 角色的更多信息，请参阅[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)。
+ 必须将 `SQLSERVER_BACKUP_RESTORE` 选项添加到数据库实例上的选项组。有关添加 `SQLSERVER_BACKUP_RESTORE` 选项的更多信息，请参阅[SQL Server 中对本机备份和还原的支持](Appendix.SQLServer.Options.BackupRestore.md)。
**注意**  
如果您的数据库实例启用了存储加密，则必须以原生备份和还原选项组中提供的 IAM 角色提供 AWS KMS（KMS）操作和密钥。

  （可选）如果您打算使用 `rds_restore_log` 存储过程执行时间点数据库还原，我们建议将相同的 Amazon S3 路径用于原生备份和还原选项组以及访问事务日志备份。此方法可确保当 Amazon RDS 代入选项组中的角色以执行还原日志功能时，它有权从相同的 Amazon S3 路径检索事务日志备份。
+ 如果数据库实例已加密，则无论加密类型如何（AWS 托管密钥或客户托管密钥），您都必须在 IAM 角色和 `rds_tlog_backup_copy_to_S3` 存储过程中提供客户托管的 KMS 密钥。

## 限制和建议
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Limitations"></a>

访问事务日志备份有以下限制和建议：
+  对于任何配置了 1 到 35 天备份保留期的数据库实例，您最多可以列出并复制最近七天的事务日志备份。
+  用于访问事务日志备份的 Amazon S3 桶必须与源数据库实例位于相同的账户和区域中。不支持跨账户和跨区域复制。
+  只能将一个 Amazon S3 桶配置为将事务日志备份复制到的目标。您可以使用 `rds_tlog_copy_setup` 存储过程选择新的目标 Amazon S3 桶。有关选择新目标 Amazon S3 桶的更多信息，请参阅[设置访问事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling.md)。
+  如果您的 RDS 实例未启用存储加密，则在使用 `rds_tlog_backup_copy_to_S3` 存储过程时无法指定 KMS 密钥。
+  不支持多账户复制。用于复制的 IAM 角色仅允许对数据库实例的拥有者账户中的 Amazon S3 桶拥有写入权限。
+  在 RDS for SQL Server 数据库实例上只能运行任何类型的两个并发任务。
+  在给定时间只能为单个数据库运行一个复制任务。如果要复制数据库实例上多个数据库的事务日志备份，请对每个数据库使用单独的复制任务。
+  如果您复制 Amazon S3 桶中已存在的同名事务日志备份，则现有的事务日志备份将被覆盖。
+  您只能在主数据库实例上运行可访问事务日志备份的存储过程。您无法在 RDS for SQL Server 只读副本或多可用区数据库集群的辅助实例上运行这些存储过程。
+  如果在 `rds_tlog_backup_copy_to_S3` 存储过程运行时重启 RDS for SQL Server 数据库实例，则当数据库实例恢复联机时，任务将自动从头开始重新启动。重启前任务运行时已复制到 Amazon S3 桶的任何事务日志备份都将被覆盖。
+ 无法将 Microsoft SQL Server 系统数据库和 `RDSAdmin` 数据库配置为访问事务日志备份。
+  不支持复制到由 SSE-KMS 加密的桶。

# 设置访问事务日志备份
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling"></a>

要设置访问事务日志备份，请完成[要求](USER.SQLServer.AddlFeat.TransactionLogAccess.md#USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements)部分中的要求列表，然后运行 `rds_tlog_copy_setup` 存储过程。该过程将在数据库实例级别启用访问事务日志备份功能。您无需为数据库实例上的每个单独数据库运行该过程。

**重要**  
必须在 SQL Server 中向数据库用户授予对于每个数据库的 `db_owner` 角色，才能配置和使用访问事务日志备份功能。

**Example 用法：**  

```
exec msdb.dbo.rds_tlog_copy_setup
@target_s3_arn='arn:aws:s3:::amzn-s3-demo-bucket/myfolder';
```

以下参数是必需参数：
+ `@target_s3_arn` – 要将事务日志备份文件复制到的目标 Amazon S3 桶的 ARN。

**Example 设置 Amazon S3 目标桶：**  

```
exec msdb.dbo.rds_tlog_copy_setup @target_s3_arn='arn:aws:s3:::amzn-s3-demo-logging-bucket/mytestdb1';
```

要验证配置，请调用 `rds_show_configuration` 存储过程。

**Example 验证配置：**  

```
exec rdsadmin.dbo.rds_show_configuration @name='target_s3_arn_for_tlog_copy';
```

要修改对事务日志备份的访问权限以指向其他 Amazon S3 桶，您可以查看当前 Amazon S3 桶值，并使用 `@target_s3_arn` 的新值重新运行 `rds_tlog_copy_setup` 存储过程。

**Example 查看为访问事务日志备份而配置的现有 Amazon S3 桶**  

```
exec rdsadmin.dbo.rds_show_configuration @name='target_s3_arn_for_tlog_copy';
```

**Example 更新到新的目标 Amazon S3 桶**  

```
exec msdb.dbo.rds_tlog_copy_setup @target_s3_arn='arn:aws:s3:::amzn-s3-demo-logging-bucket1/mynewfolder';
```

# 列出可用的事务日志备份
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Listing"></a>

在 RDS for SQL Server 中，配置为使用完整恢复模式并将数据库实例备份保留期设置为一天或多天的数据库实例备份会自动启用事务日志备份。通过启用访问事务日志备份，您可以将多达七天的这些事务日志备份复制到 Amazon S3 桶中。

启用访问事务日志备份后，就可以开始使用它来列出和复制可用的事务日志备份文件。

**列出事务日志备份**

要列出可用于单个数据库的所有事务日志备份，请调用 `rds_fn_list_tlog_backup_metadata` 函数。调用函数时可以使用 `ORDER BY` 或 `WHERE` 子句。

**Example 列出和筛选可用的事务日志备份文件**  

```
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename');
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename') WHERE rds_backup_seq_id = 3507;
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename') WHERE backup_file_time_utc > '2022-09-15 20:44:01' ORDER BY backup_file_time_utc DESC;
```

![\[来自 rds_fn_list_tlog_backup_metadata 的输出\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_func.png)


`rds_fn_list_tlog_backup_metadata` 函数返回以下输出：


****  

| 列名称 | 数据类型 | 说明 | 
| --- | --- | --- | 
| `db_name` | sysname | 为列出其事务日志备份而提供的数据库名称。 | 
| `db_id` | int | 输入参数 `db_name` 的内部数据库标识符。 | 
| `family_guid` | uniqueidentifier | 创建时原始数据库的唯一 ID。还原数据库时，该值保持不变，即使还原到不同的数据库名称也是如此。 | 
| `rds_backup_seq_id` | int | RDS 在内部用于维护每个事务日志备份文件的序列号的 ID。 | 
| `backup_file_epoch` | bigint | 生成事务备份文件的纪元时间。 | 
| `backup_file_time_utc` | datetime | `backup_file_epoch` 值的 UTC 时间转换值。 | 
| `starting_lsn` | numeric(25,0) | 事务日志备份文件的第一条或最早的日志记录的日志序列号。 | 
| `ending_lsn` | numeric(25,0) | 事务日志备份文件的上一条或下一条日志记录的日志序列号。 | 
| `is_log_chain_broken` | bit | 一个布尔值，表示当前事务日志备份文件和先前的事务日志备份文件之间的日志链是否断开。 | 
| `file_size_bytes` | bigint | 事务备份集的大小（以字节为单位）。 | 
| `Error` | varchar(4000) | 如果 `rds_fn_list_tlog_backup_metadata` 函数引发异常，则显示错误消息。如果没有异常，则为 NULL。 | 

# 复制事务日志备份
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Copying"></a>

要将单个数据库的一组可用事务日志备份复制到您的 Amazon S3 桶，请调用 `rds_tlog_backup_copy_to_S3` 存储过程。`rds_tlog_backup_copy_to_S3` 存储过程将启动一项新任务以复制事务日志备份。

**注意**  
`rds_tlog_backup_copy_to_S3` 存储过程将在不对 `is_log_chain_broken` 属性进行验证的情况下复制事务日志备份。因此，在运行 `rds_tlog_backup_copy_to_S3` 存储过程之前，您应该手动确认未断开的日志链。有关进一步的解释，请参阅[验证事务日志备份日志链](#USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.LogChain)。

**Example `rds_tlog_backup_copy_to_S3` 存储过程的使用**  

```
exec msdb.dbo.rds_tlog_backup_copy_to_S3
	@db_name='mydatabasename',
	[@kms_key_arn='arn:aws:kms:region:account-id:key/key-id'],	
	[@backup_file_start_time='2022-09-01 01:00:15'],
	[@backup_file_end_time='2022-09-01 21:30:45'],
	[@starting_lsn=149000000112100001],
	[@ending_lsn=149000000120400001],
	[@rds_backup_starting_seq_id=5],
	[@rds_backup_ending_seq_id=10];
```

以下输入参数可用：


****  

| 参数 | 说明 | 
| --- | --- | 
| `@db_name` | 要为其复制事务日志备份的数据库的名称 | 
| `@kms_key_arn` |  客户托管的 KMS 密钥。如果您使用 AWS 托管的 KMS 密钥加密数据库实例，则必须创建客户托管的密钥。如果您使用客户托管的密钥加密数据库实例，则可以使用相同的 KMS 密钥 ARN。 | 
| `@backup_file_start_time` | `rds_fn_list_tlog_backup_metadata` 函数的 `[backup_file_time_utc]` 列中提供的 UTC 时间戳。 | 
| `@backup_file_end_time` | `rds_fn_list_tlog_backup_metadata` 函数的 `[backup_file_time_utc]` 列中提供的 UTC 时间戳。 | 
| `@starting_lsn` | `rds_fn_list_tlog_backup_metadata` 函数的 `[starting_lsn]` 列中提供的日志序列号（LSN） | 
| `@ending_lsn` | `rds_fn_list_tlog_backup_metadata` 函数的 `[ending_lsn]` 列中提供的日志序列号（LSN）。 | 
| `@rds_backup_starting_seq_id` | `rds_fn_list_tlog_backup_metadata` 函数的 `[rds_backup_seq_id]` 列中提供的序列 ID。 | 
| `@rds_backup_ending_seq_id` | `rds_fn_list_tlog_backup_metadata` 函数的 `[rds_backup_seq_id]` 列中提供的序列 ID。 | 

您可以指定一组时间、LSN 或序列 ID 参数。只需要一组参数。

您也可以在任何参数集中仅指定一个参数。例如，通过仅为 `backup_file_end_time` 参数提供值，则该时间之前在七天限制内的所有可用事务日志备份文件都将复制到您的 Amazon S3 桶中。

以下是 `rds_tlog_backup_copy_to_S3` 存储过程的有效输入参数组合。


****  

| 提供的参数 | 预期结果 | 
| --- | --- | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3  <br />	@db_name = 'testdb1',<br />            @backup_file_start_time='2022-08-23 00:00:00',<br />            @backup_file_end_time='2022-08-30 00:00:00';</pre>  | 复制最近七天且在提供的 `backup_file_start_time` 和 `backup_file_end_time` 范围之间存在的事务日志备份。在此示例中，存储过程将复制在“2022-08-23 00:00:00”与“2022-08-30 00:00:00”之间生成的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />           @db_name = 'testdb1',<br />           @backup_file_start_time='2022-08-23 00:00:00';</pre>  | 复制最近七天的事务日志备份，并从提供的 `backup_file_start_time` 开始。在此示例中，存储过程将复制从“2022-08-23 00:00:00”开始的事务日志备份，直到最新的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />          @db_name = 'testdb1',<br />          @backup_file_end_time='2022-08-30 00:00:00';</pre>  | 复制最近七天的事务日志备份，直至提供的 `backup_file_end_time`。在此示例中，存储过程将复制从“2022-08-23 00:00:00”到“2022-08-30 00:00:00”的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />         @db_name='testdb1',<br />         @starting_lsn =1490000000040007,<br />         @ending_lsn =  1490000000050009;</pre>  | 复制最近七天内可用且介于提供的 `starting_lsn` 和 `ending_lsn` 范围之间的事务日志备份。在此示例中，存储过程将复制最近七天且 LSN 范围介于 1490000000040007 到 1490000000050009 之间的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />        @db_name='testdb1',<br />        @starting_lsn =1490000000040007;</pre>  |  复制最近七天内可用的事务日志备份，从提供的 `starting_lsn` 开始。在此示例中，存储过程将复制从 LSN 1490000000040007 开始的事务日志备份，直至最新的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />        @db_name='testdb1',<br />        @ending_lsn  =1490000000050009;</pre>  |  复制最近七天内可用的事务日志备份，直到提供的 `ending_lsn`。在本例中，存储过程将复制从最近七天开始直至 lsn 1490000000050009 的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />       @db_name='testdb1',<br />       @rds_backup_starting_seq_id= 2000,<br />       @rds_backup_ending_seq_id= 5000;</pre>  |  复制最近七天内可用且在提供的范围 `rds_backup_starting_seq_id` 和 `rds_backup_ending_seq_id` 之间存在的事务日志备份。在本例中，存储过程将复制从最近七天开始且介于提供的 rds 备份序列 id 范围（从 seq\$1id 2000 到 seq\$1id5000）内的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />       @db_name='testdb1',<br />       @rds_backup_starting_seq_id= 2000;</pre>  |  复制最近七天内可用的事务日志备份，从提供的 `rds_backup_starting_seq_id` 开始。在此示例中，存储过程将复制从 seq\$1id 2000 开始的事务日志备份，直到最新的事务日志备份。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />      @db_name='testdb1',<br />      @rds_backup_ending_seq_id= 5000;</pre>  |  复制最近七天内可用的事务日志备份，直到提供的 `rds_backup_ending_seq_id`。在此示例中，存储过程将复制从最近七天开始的事务日志备份，直到 seq\$1id 5000。  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />      @db_name='testdb1',<br />      @rds_backup_starting_seq_id= 2000;<br />      @rds_backup_ending_seq_id= 2000;</pre>  |  使用提供的 `rds_backup_starting_seq_id` 复制单个事务日志备份（如果在过去七天内可用）。在此示例中，存储过程将复制 seq\$1id 为 2000 的单个事务日志备份，前提是该备份在过去七天内存在。  | 

## 验证事务日志备份日志链
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.LogChain"></a>

 为访问事务日志备份而配置的数据库必须启用自动备份保留。自动备份保留将数据库实例上的数据库设置为 `FULL` 恢复模式。要支持数据库的时间点还原，请避免更改数据库恢复模式，因为这可能会导致日志链断开。我们建议将数据库设置为 `FULL` 恢复模式。

要在复制事务日志备份之前手动验证日志链，请调用 `rds_fn_list_tlog_backup_metadata` 函数并查看 `is_log_chain_broken` 列中的值。值为“1”表示当前日志备份和前一个日志备份之间的日志链已断开。

以下示例显示了 `rds_fn_list_tlog_backup_metadata` 存储过程的输出中存在中断的日志链。

![\[rds_fn_list_tlog_backup_metadata 中的输出显示断开的日志链。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_logchain_error.png)


在正常日志链中，给定 rds\$1sequence\$1id 的 first\$1lsn 的日志序列号（LSN）值应与前一个 rds\$1sequence\$1id 中的 last\$1lsn 值相匹配。在图中，rds\$1sequence\$1id 为 45 的 first\$1lsn 值为 90987，这与前一个 rds\$1seque\$1id 为 44 的 last\$1lsn 值 90985 不匹配。

有关 SQL Server 事务日志架构和日志序列号的更多信息，请参阅 Microsoft SQL Server 文档中的[事务日志逻辑架构](https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver15#Logical_Arch)。

# Amazon S3 桶文件夹和文件结构
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.S3namingConvention"></a>

在 Amazon S3 桶中，事务日志备份具有以下标准结构和命名约定：
+ 在每个数据库的 `target_s3_arn` 路径下创建一个新文件夹，其命名结构为 `{db_id}.{family_guid}`。
+ 在该文件夹中，事务日志备份的文件名结构为 `{db_id}.{family_guid}.{rds_backup_seq_id}.{backup_file_epoch}`。
+ 您可以使用 `rds_fn_list_tlog_backup_metadata` 函数查看 `family_guid,db_id,rds_backup_seq_id and backup_file_epoch` 的详细信息。

以下示例显示 Amazon S3 桶内一组事务日志备份的文件夹和文件结构。

![\[可访问事务日志的 Amazon S3 桶结构\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_s3.png)


# 跟踪任务的状态
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus"></a>

 要跟踪复制任务的状态，请调用 `rds_task_status` 存储过程。如果您未提供任何参数，则存储过程将返回所有任务的状态。

**Example 用法：**  

```
exec msdb.dbo.rds_task_status
  @db_name='database_name',
  @task_id=ID_number;
```

以下参数可选：
+ `@db_name`– 要显示其任务状态的数据库的名称。
+ `@task_id`– 要显示其任务状态的任务的 ID。

**Example 列出特定任务 ID 的状态：**  

```
exec msdb.dbo.rds_task_status @task_id=5;
```

**Example 列出特定数据库和任务的状态：**  

```
exec msdb.dbo.rds_task_status@db_name='my_database',@task_id=5;
```

**Example 列出特定数据库的所有任务及其状态：**  

```
exec msdb.dbo.rds_task_status @db_name='my_database';
```

**Example 列出当前数据库实例上的所有任务及其状态：**  

```
exec msdb.dbo.rds_task_status;
```

# 取消任务
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.CancelTask"></a>

要取消正在运行的任务，请调用 `rds_cancel_task` 存储过程。

**Example 用法：**  

```
exec msdb.dbo.rds_cancel_task @task_id=ID_number;
```

以下参数是必需参数：
+ `@task_id`– 要取消的任务的 ID。可以通过调用 `rds_task_status` 存储过程查看任务 ID。

有关查看和取消正在运行的任务的更多信息，请参阅[使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)。

# 访问事务日志备份故障排除
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Troubleshooting"></a>

以下是您使用存储过程访问事务日志备份时可能遇到的问题。


****  

| 存储过程 | 错误消息 | 问题 | 故障排除建议 | 
| --- | --- | --- | --- | 
| rds\$1tlog\$1copy\$1setup | 此数据库实例上已禁用备份。启用保留期至少为“1”的数据库实例备份，然后重试。 | 未为数据库实例启用自动备份。 |  必须启用数据库实例备份保留，保留期至少为一天。有关启用自动备份和配置备份保留期的更多信息，请参阅[备份保留期](USER_WorkingWithAutomatedBackups.BackupRetention.md)。 | 
| rds\$1tlog\$1copy\$1setup | 运行 rds\$1tlog\$1copy\$1setup 存储过程时出错。重新连接到 RDS 端点并重试。 | 出现内部错误。 | 重新连接到 RDS 端点并再次运行 `rds_tlog_copy_setup` 存储过程。 | 
| rds\$1tlog\$1copy\$1setup | 不支持在事务内运行 rds\$1tlog\$1backup\$1copy\$1setup 存储过程。请验证会话没有未完成的事务，然后重试。 | 在事务中使用 `BEGIN` 和 `END` 尝试执行了此存储过程。 | 运行 `rds_tlog_copy_setup` 存储过程时避免使用 `BEGIN` 和 `END`。 | 
| rds\$1tlog\$1copy\$1setup | 输入参数 `@target_s3_arn` 的 S3 桶名称应包含除空格外的至少一个字符。 | 为输入参数 `@target_s3_arn` 提供的值不正确。 | 确保输入参数 `@target_s3_arn` 指定了完整的 Amazon S3 桶 ARN。 | 
| rds\$1tlog\$1copy\$1setup | `SQLSERVER_BACKUP_RESTORE` 选项未启用或处于启用过程中。启用该选项或稍后重试。 | `SQLSERVER_BACKUP_RESTORE` 选项未在数据库实例上启用，或者刚刚启用并等待内部激活。 | 按照“要求”部分指定的方式启用 `SQLSERVER_BACKUP_RESTORE` 选项。等待几分钟，然后再次运行 `rds_tlog_copy_setup` 存储过程。 | 
| rds\$1tlog\$1copy\$1setup | 输入参数 `@target_s3_arn` 的目标 S3 arn 不能为空或 null。 | 为输入参数 `@target_s3_arn` 提供了 `NULL` 值，或者没有提供值。 | 确保输入参数 `@target_s3_arn` 指定了完整的 Amazon S3 桶 ARN。 | 
| rds\$1tlog\$1copy\$1setup | 输入参数 `@target_s3_arn` 的目标 S3 arn 必须以 arn:aws 开头。 | 提供的输入参数 `@target_s3_arn` 前面没有 `arn:aws`。 | 确保输入参数 `@target_s3_arn` 指定了完整的 Amazon S3 桶 ARN。 | 
| rds\$1tlog\$1copy\$1setup | 目标 S3 ARN 桶已设置为所提供的值。 | `rds_tlog_copy_setup` 存储过程之前已运行并使用 Amazon S3 桶 ARN 进行配置。 | 要修改访问事务日志备份的 Amazon S3 桶值，请提供不同的 `target S3 ARN`。 | 
| rds\$1tlog\$1copy\$1setup | 无法生成用于启用“访问事务日志备份”的凭证。确认通过 `rds_tlog_copy_setup` 提供了 S3 路径 ARN，稍后重试。 | 生成凭证以启用访问事务日志备份时出现未指定的错误。 | 检查您的设置配置，然后重试。 | 
| rds\$1tlog\$1copy\$1setup | 存在待处理任务时，您无法运行 rds\$1tlog\$1copy\$1setup 存储过程。等待待处理任务完成，然后重试。 | 任何时候只能运行两个任务。有待处理任务等待完成。 | 查看待处理任务并等待其完成。有关监控任务状态的更多信息，请参阅[跟踪任务的状态](USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 已为数据库发出 T-log 备份文件复制任务：%s，任务 ID：%d，请稍后重试。 | 给定数据库在任何时候只能运行一个复制任务。有待处理的复制任务等待完成。 | 查看待处理任务并等待其完成。有关监控任务状态的更多信息，请参阅[跟踪任务的状态](USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 必须提供这三个参数集中的至少一个。SET-1:(@backup\$1file\$1start\$1time, @backup\$1file\$1end\$1time) \$1 SET-2:(@starting\$1lsn, @ending\$1lsn) \$1 SET-3:(@rds\$1backup\$1starting\$1seq\$1id, @rds\$1backup\$1ending\$1seq\$1id)  | 三个参数集均未提供，或者提供的参数集缺少必需的参数。 | 您可以指定时间、lsn 或序列 ID 参数。这三组参数中的一组是必需的。有关所需参数的更多信息，请参阅[复制事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 您的实例上已禁用备份。请启用备份，稍后重试。 | 未为数据库实例启用自动备份。 |  有关启用自动备份和配置备份保留期的更多信息，请参阅[备份保留期](USER_WorkingWithAutomatedBackups.BackupRetention.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 找不到给定的数据库 %s。 | 为输入参数 `@db_name` 提供的值与数据库实例上的数据库名称不匹配。 | 使用正确的数据库名称。要按名称列出所有数据库，请运行 `SELECT * from sys.databases` | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 无法对于 SQL Server 系统数据库或 rdsadmin 数据库运行 rds\$1tlog\$1backup\$1copy\$1to\$1S3 存储过程。 | 为输入参数 `@db_name` 提供的值与 SQL Server 系统数据库名称或 RDSAdmin 数据库相匹配。 | 不允许使用以下数据库来访问事务日志备份：`master, model, msdb, tempdb, RDSAdmin.` | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 输入参数 @db\$1name 的数据库名称不能为空或为 Null。 | 为输入参数 `@db_name` 提供的值为空或 `NULL`。 | 使用正确的数据库名称。要按名称列出所有数据库，请运行 `SELECT * from sys.databases` | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 数据库实例备份保留期必须设置为至少 1 才能运行 rds\$1tlog\$1backup\$1copy\$1setup 存储过程。 | 未为数据库实例启用自动备份。 | 有关启用自动备份和配置备份保留期的更多信息，请参阅[备份保留期](USER_WorkingWithAutomatedBackups.BackupRetention.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 运行存储过程 rds\$1tlog\$1backup\$1copy\$1to\$1S3 时出错。重新连接到 RDS 端点并重试。 | 出现内部错误。 | 重新连接到 RDS 端点并再次运行 `rds_tlog_backup_copy_to_S3` 存储过程。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 只能提供这三个参数集中的一个。SET-1:(@backup\$1file\$1start\$1time, @backup\$1file\$1end\$1time) \$1 SET-2:(@starting\$1lsn, @ending\$1lsn) \$1 SET-3:(@rds\$1backup\$1starting\$1seq\$1id, @rds\$1backup\$1ending\$1seq\$1id)  | 提供了多个参数集。 | 您可以指定时间、lsn 或序列 ID 参数。这三组参数中的一组是必需的。有关所需参数的更多信息，请参阅[复制事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 不支持在事务内运行 rds\$1tlog\$1backup\$1copy\$1to\$1S3 存储过程。请验证会话没有未完成的事务，然后重试。 | 在事务中使用 `BEGIN` 和 `END` 尝试执行了此存储过程。 | 运行 `rds_tlog_backup_copy_to_S3` 存储过程时避免使用 `BEGIN` 和 `END`。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 提供的参数超出了事务备份日志保留期。要列出可用的事务日志备份文件，请运行 rds\$1fn\$1list\$1tlog\$1backup\$1metadata 函数。  | 对于提供的输入参数，没有适合副本保留期限的可用事务日志备份。 | 使用一组有效的参数重试。有关所需参数的更多信息，请参阅[复制事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 处理请求时出现权限错误。确保桶与数据库实例位于相同的账户和区域中，并根据公有文档中的模板确认 S3 桶策略权限。  | 检测到所提供的 S3 桶或其策略权限存在问题。 | 确认访问事务日志备份的设置正确无误。有关 S3 桶的设置要求的更多信息，请参阅[要求](USER.SQLServer.AddlFeat.TransactionLogAccess.md#USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements)。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 不允许在 RDS 只读副本实例上运行 `rds_tlog_backup_copy_to_S3` 存储过程。 | 已尝试在 RDS 只读副本实例上执行存储过程。 | 连接到 RDS 主数据库实例以运行 `rds_tlog_backup_copy_to_S3` 存储过程。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 输入参数 `@starting_lsn` 的 LSN 必须小于 `@ending_lsn`。 | 为输入参数 `@starting_lsn` 提供的值大于为输入参数 `@ending_lsn` 提供的值。 | 确保为输入参数 `@starting_lsn` 提供的值小于为输入参数 `@ending_lsn` 提供的值。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | `rds_tlog_backup_copy_to_S3` 存储过程只能由源数据库中 `db_owner` 角色的成员执行。 | 尚未为尝试在提供的 `db_name` 上运行 `rds_tlog_backup_copy_to_S3` 存储过程的账户授予 `db_owner` 角色 | 确保运行存储过程的账户对于所提供的 `db_name` 获得 `db_owner` 角色的权限。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 输入参数 `@rds_backup_starting_seq_id` 的序列 ID 必须小于或等于 `@rds_backup_ending_seq_id`。 | 为输入参数 `@rds_backup_starting_seq_id` 提供的值大于为输入参数 `@rds_backup_ending_seq_id` 提供的值。 | 确保为输入参数 `@rds_backup_starting_seq_id` 提供的值小于为输入参数 `@rds_backup_ending_seq_id` 提供的值。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | SQLSERVER\$1BACKUP\$1RESTORE 选项未启用或处于启用过程中。启用该选项或稍后重试。 | `SQLSERVER_BACKUP_RESTORE` 选项未在数据库实例上启用，或者刚刚启用并等待内部激活。 | 按照“要求”部分指定的方式启用 `SQLSERVER_BACKUP_RESTORE` 选项。等待几分钟，然后再次运行 `rds_tlog_backup_copy_to_S3` 存储过程。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 输入参数 `@backup_file_start_time` 的开始时间必须小于 `@backup_file_end_time`。 | 为输入参数 `@backup_file_start_time` 提供的值大于为输入参数 `@backup_file_end_time` 提供的值。 | 确保为输入参数 `@backup_file_start_time` 提供的值小于为输入参数 `@backup_file_end_time` 提供的值。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 由于缺乏访问权限，我们无法处理该请求。请检查您对该功能的设置和权限。 | Amazon S3 桶权限可能存在问题，或者提供的 Amazon S3 桶位于其他账户或区域中。 | 确保 Amazon S3 桶策略权限允许 RDS 访问。确保 Amazon S3 桶与数据库实例位于同一账户和区域中。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 对于未经过存储加密的实例，您不能将 KMS 密钥 ARN 作为输入参数提供给存储过程。 | 如果未在数据库实例上启用存储加密，则不应提供输入参数 `@kms_key_arn`。 | 请勿为 `@kms_key_arn` 提供输入参数。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 您必须向存储加密实例的存储过程提供 KMS 密钥 ARN 作为输入参数。 | 在数据库实例上启用存储加密时，必须提供输入参数 `@kms_key_arn`。 | 为 `@kms_key_arn` 提供一个输入参数，其值与 Amazon S3 桶的 ARN 相匹配，用于事务日志备份。 | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 在运行 `rds_tlog_backup_copy_to_S3` 存储过程之前，必须先运行 `rds_tlog_copy_setup` 存储过程并设置 `@target_s3_arn`。 | 在尝试运行 `rds_tlog_backup_copy_to_S3` 存储过程之前，尚未完成对事务日志备份设置过程的访问。 | 在运行 `rds_tlog_copy_setup` 存储过程之前运行 `rds_tlog_backup_copy_to_S3` 存储过程。有关运行设置过程以访问事务日志备份的更多信息，请参阅[设置访问事务日志备份](USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling.md)。 | 

# 适用于 Microsoft SQL Server 数据库引擎的选项
<a name="Appendix.SQLServer.Options"></a>

在本节中，您可以找到选项的说明，这些选项可供运行 Microsoft SQL Server 数据库引擎的 Amazon RDS 实例使用。要启用这些选项，可将它们添加到选项组中，然后将选项组关联到数据库实例。有关更多信息，请参阅“[使用选项组](USER_WorkingWithOptionGroups.md)”。

如果要查找未通过 RDS 选项组添加的可选功能（例如 SSL、Microsoft Windows 身份验证和 Amazon S3 集成），请参阅[Amazon RDS 上的 Microsoft SQL Server 的其他功能](User.SQLServer.AdditionalFeatures.md)。

Amazon RDS 支持 Microsoft SQL Server 数据库实例的以下选项。


****  

| 选项 | 选项 ID | 引擎版本 | 
| --- | --- | --- | 
|  [带有 Oracle OLEDB 的链接服务器](Appendix.SQLServer.Options.LinkedServers_Oracle_OLEDB.md)  |  `OLEDB_ORACLE`  |  SQL Server 企业版 SQL Server 标准版  | 
|  [本机备份和还原](Appendix.SQLServer.Options.BackupRestore.md)  |  `SQLSERVER_BACKUP_RESTORE`  |  SQL Server 企业版 SQL Server 标准版 SQL Server Web Edition SQL Server Express Edition  | 
|  [透明数据加密](Appendix.SQLServer.Options.TDE.md)  |  `TRANSPARENT_DATA_ENCRYPTION`（RDS 控制台） `TDE`（AWS CLI 和 RDS API）  |  SQL Server 2016–2022 企业版 SQL Server 2022 标准版 | 
|  [SQL Server Audit](Appendix.SQLServer.Options.Audit.md)  |  `SQLSERVER_AUDIT`  |  在 RDS 中，从 SQL Server 2016 开始，SQL Server 的所有版本都支持服务器级审计，而企业版还支持数据库级审计。 从 SQL Server SQL Server 2016 (13.x) SP1 开始，所有版本均支持服务器级别和数据库级别审核。 有关更多信息，请参阅 SQL Server 文档中的 [SQL Server Audit（数据库引擎）](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-2017)。 | 
|  [SQL Server Analysis Services](Appendix.SQLServer.Options.SSAS.md)  |  `SSAS`  |  SQL Server 企业版 SQL Server 标准版  | 
|  [SQL Server Integration Services](Appendix.SQLServer.Options.SSIS.md)  |  `SSIS`  |  SQL Server 企业版 SQL Server 标准版  | 
|  [SQL Server Reporting Services](Appendix.SQLServer.Options.SSRS.md)  |  `SSRS`  |  SQL Server 企业版 SQL Server 标准版  | 
|  [Microsoft 分布式事务处理协调器](Appendix.SQLServer.Options.MSDTC.md)  |  `MSDTC`  |  在 RDS 中，从 SQL Server 2016 开始，SQL Server 的所有版本都支持分布式事务。  | 
|  [SQL Server 资源调控器](Appendix.SQLServer.Options.ResourceGovernor.md)  |  `RESOURCE_GOVERNOR`  |  SQL Server 企业版 SQL Server 2022 开发人员版  | 

## 列出 SQL Server 版本的可用选项
<a name="Appendix.SQLServer.Options.Describe"></a>

您可以使用 `describe-option-group-options` AWS CLI 命令列出 SQL Server 版本的可用选项以及这些选项的设置。

以下示例显示了 SQL Server 2019 企业版的选项和选项设置。`--engine-name` 选项是必需的。

```
aws rds describe-option-group-options --engine-name sqlserver-ee --major-engine-version 15.00
```

输出与以下内容类似：

```
{
    "OptionGroupOptions": [
        {
            "Name": "MSDTC",
            "Description": "Microsoft Distributed Transaction Coordinator",
            "EngineName": "sqlserver-ee",
            "MajorEngineVersion": "15.00",
            "MinimumRequiredMinorEngineVersion": "4043.16.v1",
            "PortRequired": true,
            "DefaultPort": 5000,
            "OptionsDependedOn": [],
            "OptionsConflictsWith": [],
            "Persistent": false,
            "Permanent": false,
            "RequiresAutoMinorEngineVersionUpgrade": false,
            "VpcOnly": false,
            "OptionGroupOptionSettings": [
                {
                    "SettingName": "ENABLE_SNA_LU",
                    "SettingDescription": "Enable support for SNA LU protocol",
                    "DefaultValue": "true",
                    "ApplyType": "DYNAMIC",
                    "AllowedValues": "true,false",
                    "IsModifiable": true,
                    "IsRequired": false,
                    "MinimumEngineVersionPerAllowedValue": []
                },
        ...

        {
            "Name": "TDE",
            "Description": "SQL Server - Transparent Data Encryption",
            "EngineName": "sqlserver-ee",
            "MajorEngineVersion": "15.00",
            "MinimumRequiredMinorEngineVersion": "4043.16.v1",
            "PortRequired": false,
            "OptionsDependedOn": [],
            "OptionsConflictsWith": [],
            "Persistent": true,
            "Permanent": false,
            "RequiresAutoMinorEngineVersionUpgrade": false,
            "VpcOnly": false,
            "OptionGroupOptionSettings": []
        }
    ]
}
```

# 在 Amazon RDS for SQL Server 中支持带有 Oracle OLEDB 的链接服务器
<a name="Appendix.SQLServer.Options.LinkedServers_Oracle_OLEDB"></a>

RDS for SQL Server 上带有 Oracle Provider for OLEDB 的链接服务器可让您访问 Oracle 数据库上的外部数据来源。您可以从远程 Oracle 数据来源读取数据，并对您的 RDS for SQL Server 数据库实例之外的远程 Oracle 数据库服务器运行命令。使用带有 Oracle OLEDB 的链接服务器，您可以：
+ 直接访问 SQL Server 以外的数据来源
+ 使用相同的查询对不同的 Oracle 数据来源进行查询，无需移动数据
+ 对整个企业生态系统中的数据来源发出分布式查询、更新、命令和事务
+ 在 Microsoft 商业智能套件（SSIS、SSRS、SSAS）中集成与 Oracle 数据库的连接
+ 从 Oracle 数据库迁移到 RDS for SQL Server

您可以在现有或新的 RDS for SQL Server 数据库实例上激活一个或多个适用于 Oracle 的链接服务器。然后，您可以将外部 Oracle 数据来源与您的数据库实例集成。

**Contents**
+ [支持的版本和区域](#LinkedServers_Oracle_OLEDB.VersionRegionSupport)
+ [限制和建议](#LinkedServers_Oracle_OLEDB.Limitations)
+ [激活适用于 Oracle 的链接服务器](#LinkedServers_Oracle_OLEDB.Enabling)
  + [为 OLEDB\$1ORACLE 创建选项组](#LinkedServers_Oracle_OLEDB.OptionGroup)
  + [将 `OLEDB_ORACLE` 选项添加到选项组](#LinkedServers_Oracle_OLEDB.Add)
  + [将 `OLEDB_ORACLE` 版本选项修改为另一个版本](#LinkedServers_Oracle_OLEDB.Modify)
  + [将选项组与数据库实例关联](#LinkedServers_Oracle_OLEDB.Apply)
+ [修改 OLEDB 提供程序属性](#LinkedServers_Oracle_OLEDB.ModifyProviderProperties)
+ [修改 OLEDB 驱动程序属性](#LinkedServers_Oracle_OLEDB.ModifyDriverProperties)
+ [停用适用于 Oracle 的链接服务器](#LinkedServers_Oracle_OLEDB.Disable)

## 支持的版本和区域
<a name="LinkedServers_Oracle_OLEDB.VersionRegionSupport"></a>

在以下版本上，对于 SQL Server 标准版和企业版，RDS for SQL Server 在所有区域中支持带有 Oracle OLEDB 的链接服务器：
+ SQL Server 2022，所有版本
+ SQL Server 2019，所有版本
+ SQL Server 2017，所有版本

以下 Oracle Database 版本支持带有 Oracle OLEDB 的链接服务器：
+ Oracle Database 21c，所有版本
+ Oracle Database 19c，所有版本
+ Oracle Database 18c，所有版本

以下 OLEDB Oracle 驱动程序版本支持带有 Oracle OLEDB 的链接服务器：
+ 21.7
+ 21.16

## 限制和建议
<a name="LinkedServers_Oracle_OLEDB.Limitations"></a>

请记住以下适用于带有 Oracle OLEDB 的链接服务器的限制和建议：
+ 通过在每个 RDS for SQL Server 数据库实例的安全组中添加适用的 TCP 端口来允许网络流量。例如，如果您在 EC2 Oracle 数据库实例和 RDS for SQL Server 数据库实例之间配置链接服务器，则必须允许来自 EC2 Oracle 数据库实例的 IP 地址的流量。您还必须允许 SQL Server 用于侦听数据库通信的端口上的流量。有关安全组的更多信息，请参阅[使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。
+ 在打开、关闭或修改选项组中的 `OLEDB_ORACLE` 选项后，重启 RDS for SQL Server 数据库实例。选项组状态对于这些事件显示 `pending_reboot` 且是必需的。对于启用了 AlwaysOn 或镜像选项的 RDS for SQL Server 多可用区实例，在新实例创建或还原后重启实例时，预计会进行失效转移。
+ Oracle 数据来源的用户名和密码仅支持简单身份验证。
+ 不支持开放式数据库连接（ODBC）驱动程序。仅支持上面列出的 OLEDB 驱动程序版本。
+ 支持分布式事务（XA）。要激活分布式事务，请为您的数据库实例开启选项组中的 `MSDTC` 选项，并确保 XA 事务处于开启状态。有关更多信息，请参阅 [RDS for SQL Server 中的 Microsoft 分布式事务处理协调器支持](Appendix.SQLServer.Options.MSDTC.md)。
+ 不支持创建用作连接字符串的快捷方式的数据来源名称（DSN）。
+ 不支持 OLEDB 驱动程序跟踪。您可以使用 SQL Server 扩展事件来跟踪 OLEDB 事件。有关更多信息，请参阅[在 RDS for SQL Server 中设置扩展事件](https://aws.amazon.com/blogs/database/set-up-extended-events-in-amazon-rds-for-sql-server/)。
+ 不支持使用 SQL Server Management Studio（SSMS）访问 Oracle 链接服务器的目录文件夹。

## 激活适用于 Oracle 的链接服务器
<a name="LinkedServers_Oracle_OLEDB.Enabling"></a>

通过在 RDS for SQL Server 数据库实例中添加 `OLEDB_ORACLE` 选项来激活适用于 Oracle 的链接服务器。使用以下过程：

1. 创建新的选项组或选择现有的选项组。

1. 将 `OLEDB_ORACLE` 选项添加到该选项组。

1. 选择要使用的 OLEDB 驱动程序的版本。

1. 将选项组与数据库实例相关联。

1. 重启数据库实例。

### 为 OLEDB\$1ORACLE 创建选项组
<a name="LinkedServers_Oracle_OLEDB.OptionGroup"></a>

要使用适用于 Oracle 的链接服务器，请创建或修改与您计划使用的 SQL Server 版本和数据库实例版本对应的选项组。要完成此过程，请使用 AWS 管理控制台或 AWS CLI。

#### 控制台
<a name="LinkedServers_Oracle_OLEDB.OptionGroup.Console"></a>

以下过程创建适用于 SQL Server 标准版 2019 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗口中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **oracle-oledb-se-2019**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **OLEDB\$1ORACLE option group for SQL Server SE 2019**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于 **Major engine version**（主引擎版本），选择 **15.00**。

1. 选择**创建**。

#### CLI
<a name="LinkedServers_Oracle_OLEDB.OptionGroup.CLI"></a>

以下过程创建适用于 SQL Server 标准版 2019 的选项组。

**创建选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name oracle-oledb-se-2019 \
      --engine-name sqlserver-se \
      --major-engine-version 15.00 \
      --option-group-description "OLEDB_ORACLE option group for SQL Server SE 2019"
  ```

  对于：Windows

  ```
  aws rds create-option-group ^
      --option-group-name oracle-oledb-se-2019 ^
      --engine-name sqlserver-se ^
      --major-engine-version 15.00 ^
      --option-group-description "OLEDB_ORACLE option group for SQL Server SE 2019"
  ```

### 将 `OLEDB_ORACLE` 选项添加到选项组
<a name="LinkedServers_Oracle_OLEDB.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `OLEDB_ORACLE` 选项添加到您的选项组。

#### 控制台
<a name="LinkedServers_Oracle_OLEDB.Add.Console"></a>

**添加 OLEDB\$1ORACLE 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择您刚刚创建的选项组（本例中为 **oracle-oledb-se-2019**）。

1. 选择**添加选项**。

1. 在 **Option details**（选项详细信息）下，为 **Option name**（选项名称）选择 **OLEDB\$1ORACLE**。

1. 在**版本**下，选择要安装的 OLEDB Oracle 驱动程序版本。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

#### CLI
<a name="LinkedServers_Oracle_OLEDB.Add.CLI"></a>

**添加 OLEDB\$1ORACLE 选项**
+ 将 `OLEDB_ORACLE` 选项添加到该选项组。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name oracle-oledb-se-2019 \
      --options OptionName=OLEDB_ORACLE, OptionVersion=21.16 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds add-option-to-option-group ^
      --option-group-name oracle-oledb-se-2019 ^
      --options OptionName=OLEDB_ORACLE, OptionVersion=21.16 ^
      --apply-immediately
  ```

### 将 `OLEDB_ORACLE` 版本选项修改为另一个版本
<a name="LinkedServers_Oracle_OLEDB.Modify"></a>

要将 `OLEDB_ORACLE` 选项版本修改为另一个版本，请使用 AWS 管理控制台或 AWS CLI。

#### 控制台
<a name="LinkedServers_Oracle_OLEDB.Modify.Console"></a>

**修改 OLEDB\$1ORACLE 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `OLEDB_ORACLE` 选项的选项组（在前面的示例中为 **oracle-oledb-se-2019**）。

1. 选择 **Modify option**（修改选项）。

1. 在 **Option details**（选项详细信息）下，为 **Option name**（选项名称）选择 **OLEDB\$1ORACLE**。

1. 在**版本**下，选择要使用的 OLEDB Oracle 驱动程序版本。

1. 在**计划**下，选择是立即修改选项，还是在下一个维护时段修改选项。

1. 选择 **Modify option**（修改选项）。

#### CLI
<a name="LinkedServers_Oracle_OLEDB.Add.CLI"></a>

要修改 `OLEDB_ORACLE` 选项版本，请使用 [https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) AWS CLI 命令来处理要使用的选项组和选项版本。

**修改 OLEDB\$1ORACLE 选项**
+   
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name oracle-oledb-se-2019 \
      --options OptionName=OLEDB_ORACLE, OptionVersion=21.7 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds add-option-to-option-group ^
      --option-group-name oracle-oledb-se-2019 ^
      --options OptionName=OLEDB_ORACLE, OptionVersion=21.7 ^
      --apply-immediately
  ```

### 将选项组与数据库实例关联
<a name="LinkedServers_Oracle_OLEDB.Apply"></a>

要将 `OLEDB_ORACLE` 选项组和参数组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI 

#### 控制台
<a name="LinkedServers_Oracle_OLEDB.Apply.Console"></a>

要完成激活适用于 Oracle 的链接服务器，请将您的 `OLEDB_ORACLE` 选项组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

#### CLI
<a name="LinkedServers_Oracle_OLEDB.Apply.CLI"></a>

您可以将 `OLEDB_ORACLE` 选项组和参数组与新的或现有的数据库实例关联。

**使用 `OLEDB_ORACLE` 选项组和参数组创建实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mytestsqlserveroracleoledbinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 15.0.4236.7.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --domain-iam-role-name my-directory-iam-role \
      --domain my-domain-id \
      --option-group-name oracle-oledb-se-2019 \
      --db-parameter-group-name my-parameter-group-name
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mytestsqlserveroracleoledbinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 15.0.4236.7.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --domain-iam-role-name my-directory-iam-role ^
      --domain my-domain-id ^
      --option-group-name oracle-oledb-se-2019 ^
      --db-parameter-group-name my-parameter-group-name
  ```

**修改实例并关联 `OLEDB_ORACLE` 选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mytestsqlserveroracleoledbinstance \
      --option-group-name oracle-oledb-se-2019 \
      --db-parameter-group-name my-parameter-group-name \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mytestsqlserveroracleoledbinstance ^
      --option-group-name oracle-oledb-se-2019 ^
      --db-parameter-group-name my-parameter-group-name ^
      --apply-immediately
  ```

## 修改 OLEDB 提供程序属性
<a name="LinkedServers_Oracle_OLEDB.ModifyProviderProperties"></a>

您可以查看和更改 ODB 提供程序的属性。只有 `master` 用户才能执行此任务。在数据库实例上创建的所有适用于 Oracle 的链接服务器都使用该 OLEDB 提供程序的相同属性。调用 `sp_MSset_oledb_prop` 存储过程以更改 OLEDB 提供程序的属性。

更改 OLEDB 提供程序属性

```
				
USE [master]
GO
EXEC sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1 
EXEC sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'DynamicParameters', 0
GO
```

可以修改以下属性：


****  

| 属性名称 | 建议的值（1 = 开启，0 = 关闭） | 说明 | 
| --- | --- | --- | 
| `Dynamic parameter` | 1 | 在参数化查询中允许 SQL 占位符（以“?”表示）。 | 
| `Nested queries` | 1 | 允许在 `FROM` 子句中嵌套 `SELECT` 语句，例如子查询。 | 
| `Level zero only` | 0 | 仅针对此提供程序调用基级 OLEDB 接口。 | 
| `Allow inprocess` | 1 | 如果开启，Microsoft SQL Server 允许将提供程序实例化为进程内服务器。将此属性设置为 1 可使用 Oracle 链接服务器。 | 
| `Non transacted updates` | 0 | 如果不为零，则 SQL Server 允许更新。 | 
| `Index as access path` | False | 如果不为零，则 SQL Server 会尝试使用提供程序的索引来获取数据。 | 
| `Disallow adhoc access` | False | 如果已设置，则 SQL Server 不允许对 OLEDB 提供程序运行传递查询。虽然可以选中此选项，但有时运行传递查询是合适的。 | 
| `Supports LIKE operator` | 1 | 表示提供程序支持使用 LIKE 关键字进行查询。 | 

## 修改 OLEDB 驱动程序属性
<a name="LinkedServers_Oracle_OLEDB.ModifyDriverProperties"></a>

在创建适用于 Oracle 的链接服务器时，可以查看和更改 OLEDB 驱动程序的属性。只有 `master` 用户才能执行此任务。驱动程序属性定义了在使用远程 Oracle 数据来源时 OLEDB 驱动程序如何处理数据。驱动程序属性特定于在数据库实例上创建的每个 Oracle 链接服务器。调用 `master.dbo.sp_addlinkedserver` 存储过程以更改 OLEDB 驱动程序的属性。

示例：创建链接服务器并更改 OLEDB 驱动程序 `FetchSize` 属性

```
	
EXEC master.dbo.sp_addlinkedserver
@server = N'Oracle_link2',
@srvproduct=N'Oracle',
@provider=N'OraOLEDB.Oracle',
@datasrc=N'my-oracle-test.cnetsipka.us-west-2.rds.amazonaws.com:1521/ORCL',
@provstr='FetchSize=200'
GO
```

```
	
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'Oracle_link2',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'master',
@rmtpassword='Test#1234'
GO
```

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

## 停用适用于 Oracle 的链接服务器
<a name="LinkedServers_Oracle_OLEDB.Disable"></a>

要停用适用于 Oracle 的链接服务器，请从其选项组中删除 `OLEDB_ORACLE` 选项。

**重要**  
删除此选项不会删除数据库实例上现有的链接服务器配置。您必须手动删除它们，才能将其从数据库实例中删除。  
删除后，您可以重新激活 `OLEDB_ORACLE` 选项，以重用先前在数据库实例上配置的链接服务器配置。

### 控制台
<a name="LinkedServers_Oracle_OLEDB.Disable.Console"></a>

以下过程删除 `OLEDB_ORACLE` 选项。

**从其选项组中删除 OLEDB\$1ORACLE 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `OLEDB_ORACLE` 选项的选项组（在前面的示例中为 `oracle-oledb-se-2019`）。

1. 选择 **Delete option (删除选项)**。

1. 在 **Deletion options**（删除选项）下，为 **Options to delete**（待删除的选项）选择 **OLEDB\$1ORACLE**。

1. 在 **Apply immediately**（立即应用）下，选择 **Yes**（是）可立即删除选项，选择 **No**（否）可在下一个维护时段删除它。

1. 选择**删除**。

### CLI
<a name="LinkedServers_Oracle_OLEDB.Disable.CLI"></a>

以下过程删除 `OLEDB_ORACLE` 选项。

**从选项组中删除 OLEDB\$1ORACLE 选项**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name oracle-oledb-se-2019 \
      --options OLEDB_ORACLE \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name oracle-oledb-se-2019 ^
      --options OLEDB_ORACLE ^
      --apply-immediately
  ```

# RDS for SQL Server 中适用于 Teradata ODBC 的链接服务器
<a name="USER_SQLServerTeradata"></a>

在 RDS for SQL Server 上通过 Teradata ODBC 驱动程序支持链接服务器，可让您访问 Teradata 数据库上的外部数据来源。您可以从 RDS for SQL Server 实例外部的远程 Teradata 数据库服务器读取数据并运行命令。将链接服务器与 Teradata ODBC 结合使用可启用以下功能：
+ 直接访问 SQL Server 以外的数据来源。
+ 使用相同的查询对不同的 Teradata 数据来源进行查询，而无需移动数据。
+ 对整个企业生态系统中的数据来源发出分布式查询、更新、命令和事务。
+ 从 Microsoft 商业智能套件（SSIS、SSRS、SSAS）中集成与 Teradata 数据库的连接。
+ 从 Teradata 数据库迁移到 RDS for SQL Server。

您可以选择在现有或新的 RDS for SQL Server 数据库实例上激活一个或多个适用于 Teradata 的链接服务器。然后，您可以将外部 Teradata 数据来源与您的数据库实例集成。

**Topics**
+ [支持的版本和区域](#USER_SQLServerTeradata.VersionRegionSupport)
+ [限制和建议](#USER_SQLServerTeradata.LimitsandRecommendations)
+ [多可用区部署的注意事项](#USER_SQLServerTeradata.MultiAZ)
+ [激活适用于 Teradata 的链接服务器](USER_SQLServerTeradata.Activate.md)
+ [创建适用于 Teradata 的链接服务器](USER_SQLServerTeradata.CreateLinkedServers.md)
+ [停用链接到 Teradata 的服务器](USER_SQLServerTeradata.Deactivate.md)

## 支持的版本和区域
<a name="USER_SQLServerTeradata.VersionRegionSupport"></a>

在以下版本上，对于 SQL Server 标准版和企业版，RDS for SQL Server 在所有 AWS 区域中支持适用于 Teradata ODBC 的链接服务器：
+ SQL Server 2022，所有版本
+ SQL Server 2019，所有版本
+ SQL Server 2017，所有版本

以下 Teradata 数据库版本支持与 RDS for SQL Server 进行链接
+ Teradata 17.20，所有版本

## 限制和建议
<a name="USER_SQLServerTeradata.LimitsandRecommendations"></a>

以下限制适用于面向 Teradata ODBC 的链接服务器：
+ RDS for SQL Server 仅支持针对 Teradata 源使用用户名和密码进行简单身份验证。
+ RDS for SQL Server 仅支持 Teradata ODBC 驱动程序版本 17.20.0.33。
+ RDS for SQL Server 不支持创建用作连接字符串的快捷方式的数据来源名称（DSN）。
+ RDS for SQL Server 不支持 ODBC 驱动程序跟踪。使用 SQL Server 扩展事件来跟踪 ODBC 事件。有关更多信息，请参阅[在 RDS for SQL Server 中设置扩展事件](https://aws.amazon.com/blogs/database/set-up-extended-events-in-amazon-rds-for-sql-server/)。
+ 使用 SQL Server Management Studio（SSMS）时，RDS for SQL Server 不支持访问 Teradata 链接服务器的目录文件夹。

将链接服务器与 Teradata ODBC 结合使用时，请考虑以下建议：
+ 通过在每个 RDS for SQL Server 数据库实例的安全组中添加适用的 TCP 端口来允许网络流量。如果您在 EC2 Teradata 数据库实例和 RDS for SQL Server 数据库实例之间配置链接服务器，则必须支持来自 EC2 Teradata 数据库实例的 IP 地址的流量。您还必须支持 RDS for SQL Server 数据库实例用于侦听数据库通信的端口上的流量。有关安全组的更多信息，请参阅[使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。
+ 支持分布式事务（XA）。要激活分布式事务，请为您的数据库实例开启选项组中的 `MSDTC` 选项，并确保 XA 事务处于开启状态。有关更多信息，请参阅 [RDS for SQL Server 中的 Microsoft 分布式事务处理协调器支持](Appendix.SQLServer.Options.MSDTC.md)。
+ 只要在 Teradata 服务器上进行了配置，链接的 Teradata ODBC 就支持 SSL/TLS。有关更多信息，请参阅 [Enable TLS Connectivity on Teradata Vantage](https://docs.teradata.com/r/Enterprise_IntelliFlex_Lake_VMware/Teradata-Call-Level-Interface-Version-2-Reference-for-Workstation-Attached-Systems-20.00/Mainframe-TLS-Connectivity-Supplement/Enable-TLS-Connectivity-on-Teradata-Vantage)。

## 多可用区部署的注意事项
<a name="USER_SQLServerTeradata.MultiAZ"></a>

RDS for SQL Server 目前不在多可用区部署中将链接服务器复制到镜像的数据库服务器（或 Always-On 可用性组辅助服务器）。如果在更改配置以添加镜像或 Always-On 之前添加了链接服务器，则会为现有的链接服务器复制这些链接服务器。

或者，您可以在主实例上创建链接服务器，失效转移到高可用性服务器实例，然后再次创建链接服务器，使它们位于这两个 RDS for SQL Server 实例上。

# 激活适用于 Teradata 的链接服务器
<a name="USER_SQLServerTeradata.Activate"></a>

通过在 RDS for SQL Server 数据库实例中添加 `ODBC_TERADATA` 选项，激活适用于 Teradata 的链接服务器。使用以下过程：

**Topics**
+ [为 `ODBC_TERADATA` 创建选项组](#USER_SQLServerTeradata.Activate.CreateOG)
+ [将 `ODBC_TERADATA` 选项添加到选项组](#USER_SQLServerTeradata.Activate.AddOG)
+ [将 `ODBC_TERADATA` 选项与数据库实例关联](#USER_SQLServerTeradata.Activate.AssociateOG)

## 为 `ODBC_TERADATA` 创建选项组
<a name="USER_SQLServerTeradata.Activate.CreateOG"></a>

要使用适用于 Teradata 的链接服务器，请创建或修改与您计划使用的 SQL Server 版本和数据库实例版本对应的选项组。要完成此过程，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="USER_SQLServerTeradata.Activate.CreateOG.Console"></a>

使用以下过程创建适用于 SQL Server 标准版 2019 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建群组**。

1. 在**创建选项组**窗口中，执行以下操作：

   1. 对于 **Name**（名称），输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 `teradata-odbc-se-2019`。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于 **Major engine version**（主引擎版本），选择 **15.00**。

1. 选择**创建**。

### AWS CLI
<a name="USER_SQLServerTeradata.Activate.CreateOG.CLI"></a>

以下过程创建适用于 SQL Server 标准版 2019 的选项组。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-option-group \
    --option-group-name teradata-odbc-se-2019 \
    --engine-name sqlserver-se \
    --major-engine-version 15.00 \
    --option-group-description "ODBC_TERADATA option group for SQL Server SE 2019"
```

**Example**  
对于 Windows：  

```
aws rds create-option-group ^
    --option-group-name teradata-odbc-se-2019 ^
    --engine-name sqlserver-se ^
    --major-engine-version 15.00 ^
    --option-group-description "ODBC_TERADATA option group for SQL Server SE 2019"
```

## 将 `ODBC_TERADATA` 选项添加到选项组
<a name="USER_SQLServerTeradata.Activate.AddOG"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `ODBC_Teradata` 选项添加到您的选项组。

### 控制台
<a name="USER_SQLServerTeradata.Activate.AddOG.Console"></a>

使用以下过程创建适用于 SQL Server 标准版 2019 的选项组。

**添加 `ODBC_TERADATA` 选项。**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择您的新选项组。

1. 选择**添加选项**。

1. 在**选项详细信息**下：

   1. 对于**选项名称**，选择 **ODBC\$1TERADATA**。

   1. 对于**选项版本**，选择 `17.20.33.00`。

1. 在“计划”下，选择是立即添加选项，还是在下一个维护时段添加选项。

1. 选择**添加选项**。

### AWS CLI
<a name="USER_SQLServerTeradata.Activate.AddOG.CLI"></a>

以下过程将 `ODBC_TERADATA` 选项添加到您的选项组。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds add-option-to-option-group \
    --option-group-name teradata-odbc-se-2019 \
    --options "OptionName=ODBC_TERADATA,OptionVersion=17.20.33.00" \
    --apply-immediately
```

**Example**  
对于 Windows：  

```
aws rds add-option-to-option-group ^
    --option-group-name teradata-odbc-se-2019 ^
    --options "OptionName=ODBC_TERADATA,OptionVersion=17.20.33.00" ^
    --apply-immediately
```

## 将 `ODBC_TERADATA` 选项与数据库实例关联
<a name="USER_SQLServerTeradata.Activate.AssociateOG"></a>

要将 `ODBC_TERADATA` 选项组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="USER_SQLServerTeradata.Activate.AssociateOG.Console"></a>

要完成激活适用于 Teradata 的链接服务器，请将选项组与新的或现有的数据库实例关联：
+ 对于新的数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### AWS CLI
<a name="USER_SQLServerTeradata.Activate.AssociateOG.CLI"></a>

指定创建选项组时使用的相同数据库引擎类型和主要版本。

对于 Linux、macOS 或 Unix：

```
aws rds create-db-instance \
    --db-instance-identifier mytestsqlserverteradataodbcinstance \
    --db-instance-class db.m5.2xlarge \
    --engine sqlserver-se \
    --engine-version 15.00 \
    --license-model license-included \
    --allocated-storage 100 \
    --master-username admin \
    --master-user-password password \
    --storage-type gp2 \
    --option-group-name teradata-odbc-se-2019
```

对于 Windows：

```
aws rds create-db-instance ^
    --db-instance-identifier mytestsqlserverteradataodbcinstance ^
    --db-instance-class db.m5.2xlarge ^
    --engine sqlserver-se ^
    --engine-version 15.00 ^
    --license-model license-included ^ 
    --allocated-storage 100 ^
    --master-username admin ^
    --master-user-password password ^
    --storage-type gp2 ^
    --option-group-name teradata-odbc-se-2019
```

修改实例并关联新的选项组：

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier mytestsqlserverteradataodbcinstance \
    --option-group-name teradata-odbc-se-2019 \
    --apply-immediately
```

对于 Windows：

```
aws rds modify-db-instance ^
    --db-instance-identifier mytestsqlserverteradataodbcinstance ^
    --option-group-name teradata-odbc-se-2019 ^
    --apply-immediately
```

# 创建适用于 Teradata 的链接服务器
<a name="USER_SQLServerTeradata.CreateLinkedServers"></a>

要创建适用于 Teradata 的链接服务器，请运行以下命令：

```
EXECUTE master.dbo.sp_addlinkedserver 
    @server = N'LinkedServer_NAME', 
    @srvproduct=N'', 
    @provider=N'MSDASQL', 
    @provstr=N'"PROVIDER=MSDASQL;DRIVER={Teradata Database ODBC Driver 17.20};
                DBCName=Server;UID=user_name;PWD=user_password;
                UseDataEncryption=YES/NO;SSLMODE=PREFER/ALLOW/DISABLE>;"', 
    @catalog='database'
```

```
EXECUTE master.dbo.sp_addlinkedsrvlogin 
    @rmtsrvname = N'LinkedServer_NAME', 
    @locallogin = NULL , 
    @useself = N'False', 
    @rmtuser = N'user_name', 
    @rmtpassword = N'user_password'
```

上面的命令示例如下所示：

```
EXECUTE master.dbo.sp_addlinkedserver 
    @server = N'LinkedServerToTeradata', 
    @srvproduct=N'', 
    @provider=N'MSDASQL', 
    @provstr=N'"PROVIDER=MSDASQL;DRIVER={Teradata Database ODBC Driver 17.20};
                DBCName=my-teradata-test.cnetsipka.us-west-2.rds.amazonaws.com;
                UID=master;
                PWD=Test#1234;
                UseDataEncryption=YES;
                SSLMODE=PREFER;"', 
    @catalog='MyTestTeradataDB'

EXECUTE master.dbo.sp_addlinkedsrvlogin 
    @rmtsrvname = N'LinkedServerToTeradata', 
    @locallogin = NULL , 
    @useself = N'False', 
    @rmtuser = N'master', 
    @rmtpassword = N'Test#1234'
```

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

# 停用链接到 Teradata 的服务器
<a name="USER_SQLServerTeradata.Deactivate"></a>

要停用到 Teradata 的链接服务器，请从其选项组中移除 `ODBC_TERADATA` 选项。

**重要**  
删除此选项不会删除数据库实例上的链接服务器配置。您必须手动删除它们，才能将其从数据库实例中删除。  
移除后，您可以重新激活 `ODBC_TERADATA`，以重用先前在数据库实例上配置的链接服务器配置。

## 控制台
<a name="USER_SQLServerTeradata.Deactivate.Console"></a>

从选项组中移除 `ODBC_TERADATA` 选项

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `ODBC_TERADATA` 选项的选项组。

1. 选择**删除**。

1. 在**删除选项**下，在**待删除的选项**下选择 `ODBC_TERADATA`。

1. 在 **Apply immediately**（立即应用）下，选择 **Yes**（是）可立即删除选项，选择 **No**（否）可在下一个维护时段删除它。

1. 选择**删除**。

## AWS CLI
<a name="USER_SQLServerTeradata.Deactivate.CLI"></a>

以下命令移除 `ODBC_TERADATA` 选项。

对于 Linux、macOS 或 Unix：

```
aws rds remove-option-from-option-group \
    --option-group-name teradata-odbc-se-2019 \
    --options ODBC_TERADATA \
    --apply-immediately
```

对于 Windows：

```
aws rds remove-option-from-option-group ^
    --option-group-name teradata-odbc-se-2019 ^
    --options ODBC_TERADATA ^
    --apply-immediately
```

# SQL Server 中对本机备份和还原的支持
<a name="Appendix.SQLServer.Options.BackupRestore"></a>

通过在 SQL Server 数据库中使用本机备份和还原，您可以创建本地数据库的差异备份或完整备份，并将备份文件存储在 Amazon S3 上。然后您可以将其恢复到运行 SQL Server 的现有 Amazon RDS 数据库实例。您也可以备份 RDS for SQL Server 数据库，将其存储在 Amazon S3 中，然后在其他位置恢复它。此外，您还可以将备份还原到本地服务器或运行 SQL Server 的不同 Amazon RDS 数据库实例。有关更多信息，请参阅“[使用本机备份和还原导入和导出 SQL Server 数据库](SQLServer.Procedural.Importing.md)”。

Amazon RDS 支持使用差异备份或完整备份文件（.bak 文件）对 Microsoft SQL Server 数据库进行本机备份和还原。

## 添加本机备份和还原选项
<a name="Appendix.SQLServer.Options.BackupRestore.Add"></a>

将本机备份和还原选项添加到数据库实例的一般过程如下所示：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 `SQLSERVER_BACKUP_RESTORE` 选项添加到该选项组。

1. 将一个 AWS Identity and Access Management (IAM) 角色与该选项相关联。该 IAM 角色必须有权访问 S3 存储桶以存储数据库备份。

   也就是说，该选项必须将使用 `arn:aws:iam::account-id:role/role-name` 格式的有效 Amazon Resource Name (ARN) 作为其选项设置。有关更多信息，请参阅《AWS 一般参考》**中的 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-iam)。

   IAM 角色还必须有信任关系和附加的权限策略。信任关系允许 RDS 代入角色，权限策略定义了角色可以执行的操作。有关更多信息，请参阅“[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)”。

1. 将选项组与数据库实例相关联。

在添加本机备份和还原选项后，您无需重新启动数据库实例。一旦激活此选项组，您就可以立即开始备份和还原。

### 控制台
<a name="Add.Native.Backup.Restore.Console"></a>

**添加本机备份和还原选项**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 创建新的选项组或使用现有的选项组。有关如何创建自定义数据库选项组的信息，请参阅[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

   要使用现有的选项组，请跳到下一步。

1. 将 **SQLSERVER\$1BACKUP\$1RESTORE** 选项添加到选项组中。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 请执行下列操作之一：
   + 要使用现有的 IAM 角色和 Amazon S3 设置，请为 **IAM 角色**选择一个现有的 IAM 角色。如果使用现有的 IAM 角色，则 RDS 使用为该角色配置的 Amazon S3 设置。
   + 要创建新的角色并配置 Amazon S3 设置，请执行以下操作：

     1. 对于 **IAM Role (IAM 角色)**，选择 **Create a new role (创建新角色)**。

     1. 对于 **S3 bucket**（S3 存储桶），请从列表中选择一个 S3 存储桶。

     1. 对于 **S3 prefix (optional)**（S3 前缀（可选）），请指定要用于 Amazon S3 存储桶中存储的文件的前缀。

        该前缀可以包含文件路径，但不是必需的。如果提供一个前缀，则 RDS 将该前缀附加到所有备份文件。然后，RDS 在还原期间使用该前缀识别相关的文件，并忽略不相关的文件。例如，除了保存备份文件以外，您还可以将 S3 存储桶用于其他用途。在这种情况下，您可以使用前缀让 RDS 仅在特定文件夹及其子文件夹上执行本机备份和还原。

        如果将前缀保留空白，则 RDS 不会使用前缀标识备份文件或要还原的文件。因此，在多文件还原期间，RDS 尝试还原 S3 存储桶的每个文件夹中的每个文件。

     1. 选择 **Enable encryption**（启用加密）复选框以加密备份文件。保持清除该复选框（原定设置）以使备份文件保持不加密状态。

        如果你选择了 **Enable encryption**（启用加密），请为 **AWS KMS key** 选择一个加密密钥。有关加密密钥的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[入门](https://docs.aws.amazon.com/kms/latest/developerguide/getting-started.html)。

1. 选择**添加选项**。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，请在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，请修改实例并附加新的选项组以应用选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="Add.Native.Backup.Restore.CLI"></a>

此过程作出以下假设：
+ 您正在将 SQLSERVER\$1BACKUP\$1RESTORE 选项添加到已存在的选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。
+ 您正在将选项与已存在且有权访问 S3 存储桶以存储备份的 IAM 角色关联。
+ 您正在将选项组应用于已存在的数据库实例。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

**添加本机备份和还原选项**

1. 将 `SQLSERVER_BACKUP_RESTORE` 选项添加到该选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
   	--apply-immediately \
   	--option-group-name mybackupgroup \
   	--options "OptionName=SQLSERVER_BACKUP_RESTORE, \
   	  OptionSettings=[{Name=IAM_ROLE_ARN,Value=arn:aws:iam::account-id:role/role-name}]"
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group ^
   	--option-group-name mybackupgroup ^
   	--options "[{\"OptionName\": \"SQLSERVER_BACKUP_RESTORE\", ^
   	\"OptionSettings\": [{\"Name\": \"IAM_ROLE_ARN\", ^
   	\"Value\": \"arn:aws:iam::account-id:role/role-name"}]}]" ^
   	--apply-immediately
   ```
**注意**  
使用 Windows 命令提示符时，必须在 JSON 代码中转义双引号 (")，方法是使用反斜杠 (\$1) 作为其前缀。

1. 将选项组应用于数据库实例。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds modify-db-instance \
   	--db-instance-identifier mydbinstance \
   	--option-group-name mybackupgroup \
   	--apply-immediately
   ```

   对于 Windows：

   ```
   aws rds modify-db-instance ^
   	--db-instance-identifier mydbinstance ^
   	--option-group-name mybackupgroup ^
   	--apply-immediately
   ```

## 修改本机备份和还原选项设置
<a name="Appendix.SQLServer.Options.BackupRestore.ModifySettings"></a>

在启用本机备份和还原选项后，您可以修改该选项的设置。有关如何修改选项设置的更多信息，请参阅 [修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。

## 删除本机备份和还原选项
<a name="Appendix.SQLServer.Options.BackupRestore.Remove"></a>

您可以从数据库实例中删除该选项以禁用本机备份和还原。在删除本机备份和还原选项后，您无需重新启动数据库实例。

要从数据库实例中删除本机备份和还原选项，请执行以下操作之一：
+ 从 选项所属的选项组中删除该选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
+ 修改数据库实例，并指定不包含本机备份和还原选项的不同选项组。此更改会影响单个数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

# SQL Server 中的透明数据加密支持
<a name="Appendix.SQLServer.Options.TDE"></a>

Amazon RDS 支持使用透明数据加密 (TDE) 来加密运行 Microsoft SQL Server 的数据库实例中存储的数据。TDE 会在数据写入存储前自动加密这些数据，并在从存储中读取时自动解密这些数据。

Amazon RDS 支持在以下 SQL Server 版本中使用 TDE：
+ SQL Server 2022 标准版和企业版
+ SQL Server 2019 标准版和企业版
+ SQL Server 2017 企业版
+ SQL Server 2016 企业版

**注意**  
RDS for SQL Server 不支持只读数据库的 TDE。

适用于 SQL Server 的透明数据加密使用双层密钥体系结构提供加密密钥管理。系统会从数据库主密钥中生成证书，用于保护数据加密密钥。数据库加密密钥对用户数据库上的数据执行实际的加密与解密操作。Amazon RDS 备份和管理数据库主密钥和 TDE 证书。

透明数据加密在您需要加密敏感数据的场景中使用。例如，您可能想要将数据文件和备份提供给第三方，或者想要解决有关安全的合规性问题。您不能加密 SQL Server 的系统数据库，例如 `model` 数据库或 `master` 数据库。

详细讨论透明数据加密超出了本指南的范围，但确保您了解每个加密算法和密钥的安全优缺点。有关适用于 SQL Server 的透明数据加密的信息，请参阅 Microsoft 文档中的[透明数据加密 (TDE)](http://msdn.microsoft.com/en-us/library/bb934049.aspx)。

**Topics**
+ [为 RDS for SQL Server 开启 TDE](#TDE.Enabling)
+ [在 RDS for SQL Server 上加密数据](TDE.Encrypting.md)
+ [在 RDS for SQL Server 上备份和还原 TDE 证书](TDE.BackupRestoreRDS.md)
+ [备份和还原本地数据库的 TDE 证书](TDE.BackupRestoreOnPrem.md)
+ [为 RDS for SQL Server 关闭 TDE](TDE.Disabling.md)

## 为 RDS for SQL Server 开启 TDE
<a name="TDE.Enabling"></a>

要为 RDS for SQL Server 数据库实例开启透明数据加密，请在与该数据库实例关联的 RDS 选项组中指定 TDE 选项。

1. 确定您的数据库实例是否已与具有 TDE 选项的选项组关联。要查看与数据库实例关联的选项组，请使用 RDS 控制台、AWS CLI 命令 [describe-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 或 API 操作 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html)。

1.  如果数据库实例未与已开启 TDE 的选项组关联，则您有两个选择。您可以创建选项组并添加 TDE 选项，或您可以修改关联选项组以添加它。
**注意**  
在 RDS 控制台中，该选项名为 `TRANSPARENT_DATA_ENCRYPTION`。在 AWS CLI 和 RDS API 中，它名为 `TDE`。

   有关创建或者修改选项组的信息，请参阅 [使用选项组](USER_WorkingWithOptionGroups.md)。有关向选项组添加选项的信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1.  将数据库实例与具有 TDE 选项的选项组相关联。有关将数据库实例与选项组关联的信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### 选项组注意事项
<a name="TDE.Options"></a>

TDE 选项是一种持久性选项。除非所有数据库实例和备份都不再与选项组关联，否则无法将此选项从选项组中删除。将 TDE 选项添加到选项组之后，该选项组只能与使用 TDE 的数据库实例关联。有关选项组中持久性选项的详细信息，请参阅[选项组概述](USER_WorkingWithOptionGroups.md#Overview.OptionGroups)。

由于 TDE 选项是一个持久性选项，因此在选项组与关联的数据库实例之间可能发生冲突。在以下情况下，可能会发生冲突：
+ 当前选项组具有 TDE 选项，而您将它替换为没有 TDE 选项的选项组。
+ 从数据库快照还原到新的数据库实例，但该实例不具有包含 TDE 选项的选项组。有关此方案的更多信息，请参阅[选项组的注意事项](USER_CopySnapshot.md#USER_CopySnapshot.Options)。

### SQL Server 性能注意事项
<a name="TDE.Perf"></a>

使用透明数据加密可能会影响 SQL Server 数据库实例的性能。

如果数据库实例上的数据库拥有至少一个加密的数据库，那么，也可能会降低未加密数据库的性能。因此，我们建议您将加密数据库和未加密数据库保存在不同的数据库实例上。

# 在 RDS for SQL Server 上加密数据
<a name="TDE.Encrypting"></a>

将 TDE 选项添加到选项组后，Amazon RDS 将生成在加密过程中使用的证书。然后，您就可以使用该证书运行为数据库实例上的数据库加密数据的 SQL 语句。

下例使用 RDS 创建的、名为 `RDSTDECertificateName` 的证书加密名为 `myDatabase` 的数据库。

```
 1. ---------- Turning on TDE -------------
 2. 
 3. -- Find an RDS TDE certificate to use
 4. USE [master]
 5. GO
 6. SELECT name FROM sys.certificates WHERE name LIKE 'RDSTDECertificate%'
 7. GO
 8. 
 9. USE [myDatabase]
10. GO
11. -- Create a database encryption key (DEK) using one of the certificates from the previous step
12. CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256
13. ENCRYPTION BY SERVER CERTIFICATE [RDSTDECertificateName]
14. GO
15. 
16. -- Turn on encryption for the database
17. ALTER DATABASE [myDatabase] SET ENCRYPTION ON
18. GO
19. 
20. -- Verify that the database is encrypted
21. USE [master]
22. GO
23. SELECT name FROM sys.databases WHERE is_encrypted = 1
24. GO
25. SELECT db_name(database_id) as DatabaseName, * FROM sys.dm_database_encryption_keys
26. GO
```

使用 TDE 加密 SQL Server 数据库所花的时间取决于几个因素。其中包括数据库实例的大小、实例是否使用预调配 IOPS、数据量及其他因素。

# 在 RDS for SQL Server 上备份和还原 TDE 证书
<a name="TDE.BackupRestoreRDS"></a>

RDS for SQL Server 提供了用于备份、还原和删除 TDE 证书的存储过程。RDS for SQL Server 还提供了用于查看已还原的用户 TDE 证书的功能。

用户 TDE 证书用于将数据库还原到 RDS for SQL Server，这些数据库位于本地并已开启 TDE。这些证书具有前缀 `UserTDECertificate_`。还原数据库之后，在使其可供使用之前，RDS 会修改已开启 TDE 的数据库以使用 RDS 生成的 TDE 证书。这些证书具有前缀 `RDSTDECertificate`。

用户 TDE 证书保留在 RDS for SQL Server 数据库实例上，除非您使用 `rds_drop_tde_certificate` 存储过程删除它们。有关更多信息，请参阅 [删除还原的 TDE 证书](#TDE.BackupRestoreRDS.Drop)。

您可以使用用户 TDE 证书从源数据库实例还原其他数据库。要还原的数据库必须使用相同的 TDE 证书并开启 TDE。您不必再次导入（还原）同一证书。

**Topics**
+ [先决条件](#TDE.BackupRestoreRDS.Prereqs)
+ [限制](#TDE.Limitations)
+ [备份 TDE 证书](#TDE.BackupRestoreRDS.Backup)
+ [还原 TDE 证书](#TDE.BackupRestoreRDS.Restore)
+ [查看还原的 TDE 证书](#TDE.BackupRestoreRDS.Show)
+ [删除还原的 TDE 证书](#TDE.BackupRestoreRDS.Drop)

## 先决条件
<a name="TDE.BackupRestoreRDS.Prereqs"></a>

在 RDS for SQL Server 上备份或还原 TDE 证书之前，请确保执行以下任务。[针对本机备份和还原进行设置](SQLServer.Procedural.Importing.Native.Enabling.md)中介绍了前三个任务。

1. 创建 Amazon S3 通用型存储桶或目录存储桶，以存储要备份和还原的文件。

   我们建议您使用单独的桶进行数据库备份和 TDE 证书备份。

1. 创建用于备份和还原文件的 IAM 角色。

   IAM 角色必须既是 AWS KMS key 的用户又是其管理员。

   使用目录存储桶时，除了针对目录存储桶[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)所需的权限外，不需要其他权限。

   在使用 S3 资源时，除了[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)所需的权限外，IAM 角色还需要以下权限：
   + 针对 S3 桶资源的 `s3:GetBucketAcl`、`s3:GetBucketLocation` 和 `s3:ListBucket`

1. 将 `SQLSERVER_BACKUP_RESTORE` 选项添加到数据库实例上的选项组。

   这是对 `TRANSPARENT_DATA_ENCRYPTION` (`TDE`) 选项的补充。

1. 请确保您有对称的加密 KMS 密钥。您有以下选项：
   + 如果您的账户中有现有的 KMS 密钥，则可以使用它。无需进一步操作。
   + 如果您的账户中没有对称的加密 KMS 密钥，请按照《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)部分的说明创建一个 KMS 密钥。

1. 启用 Amazon S3 集成以在数据库实例和 Amazon S3 之间传输文件。

   有关启用 Amazon S3 集成的更多信息，请参阅[将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)。

   请注意，S3 集成不支持目录存储桶。此步骤仅对于[备份和还原本地数据库的 TDE 证书](TDE.BackupRestoreOnPrem.md)是必需的。

## 限制
<a name="TDE.Limitations"></a>

使用存储过程备份和还原 TDE 证书具有以下限制：
+ 必须将 `SQLSERVER_BACKUP_RESTORE` 和 `TRANSPARENT_DATA_ENCRYPTION` (`TDE`) 这两个选项添加到与数据库实例关联的数据库选项组。
+ 多可用区数据库实例不支持 TDE 证书备份和还原。
+ 不支持取消 TDE 证书备份和还原任务。
+ 您不能使用用户 TDE 证书对 RDS for SQL Server 数据库实例上的任何其他数据库进行 TDE 加密。您可以使用它从源数据库实例中仅还原已启用 TDE 并且使用相同 TDE 证书的其他数据库。
+ 您只能删除用户 TDE 证书。
+ RDS 上支持的最大用户 TDE 证书数量为 10 个。如果此数字超过 10，请删除未使用的 TDE 证书，然后重试。
+ 证书名称不能为空或为 null。
+ 还原证书时，证书名称不能包含 `RDSTDECERTIFICATE` 关键字，并且必须以 `UserTDECertificate_` 前缀开头。
+ `@certificate_name` 参数只能包含以下字符：a-z、0-9、@、\$1、\$1 和下划线 (\$1)。
+ `@certificate_file_s3_arn` 的文件扩展名必须为 .cer（不区分大小写）。
+ `@private_key_file_s3_arn` 的文件扩展名必须为 .pvk（不区分大小写）。
+ 私有密钥文件的 S3 元数据必须包括 `x-amz-meta-rds-tde-pwd` 标签。有关更多信息，请参阅 [备份和还原本地数据库的 TDE 证书](TDE.BackupRestoreOnPrem.md)。
+ RDS for SQL Server 不支持在 TDE 中使用跨账户密钥。

## 备份 TDE 证书
<a name="TDE.BackupRestoreRDS.Backup"></a>

要备份 TDE 证书，请使用 `rds_backup_tde_certificate` 存储过程。它具有以下语法。

```
EXECUTE msdb.dbo.rds_backup_tde_certificate
    @certificate_name='UserTDECertificate_certificate_name | RDSTDECertificatetimestamp',
    @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer',
    @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk',
    @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id',
    [@overwrite_s3_files=0|1];
```

以下参数为必需参数：
+ `@certificate_name` – 要备份的 TDE 证书的名称。
+ `@certificate_file_s3_arn` – Amazon S3 中证书备份文件的目标 Amazon 资源名称 (ARN)。
+ `@private_key_file_s3_arn` – 保护 TDE 证书的私有密钥文件的目标 S3 ARN。
+ `@kms_password_key_arn` – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

以下参数为可选参数：
+ `@overwrite_s3_files` – 指示是否覆盖 S3 中的现有证书和私有密钥文件：
  + `0` – 不覆盖现有文件。此值是默认值。

    如果文件已存在，则将 `@overwrite_s3_files` 设置为 0 会返回错误。
  + `1` – 覆盖具有指定名称的现有文件，即使该文件不是备份文件也是如此。

**Example 备份 TDE 证书**  

```
EXECUTE msdb.dbo.rds_backup_tde_certificate
    @certificate_name='RDSTDECertificate20211115T185333',
    @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer',
    @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk',
    @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE',
    @overwrite_s3_files=1;
```

## 还原 TDE 证书
<a name="TDE.BackupRestoreRDS.Restore"></a>

可以使用 `rds_restore_tde_certificate` 存储过程来还原（导入）用户 TDE 证书。它具有以下语法。

```
EXECUTE msdb.dbo.rds_restore_tde_certificate
    @certificate_name='UserTDECertificate_certificate_name',
    @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer',
    @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk',
    @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id';
```

以下参数为必需参数：
+ `@certificate_name` –要还原的 TDE 证书的名称。名称必须以 `UserTDECertificate_` 前缀开头。
+ `@certificate_file_s3_arn` – 用于还原 TDE 证书的备份文件的 S3 ARN。
+ `@private_key_file_s3_arn` – 要还原的 TDE 证书的私有密钥备份文件的 S3 ARN。
+ `@kms_password_key_arn` – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

**Example 还原 TDE 证书**  

```
EXECUTE msdb.dbo.rds_restore_tde_certificate
    @certificate_name='UserTDECertificate_myTDEcertificate',
    @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer',
    @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk',
    @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

## 查看还原的 TDE 证书
<a name="TDE.BackupRestoreRDS.Show"></a>

可以使用 `rds_fn_list_user_tde_certificates` 函数来查看已还原（导入）的用户 TDE 证书。它具有以下语法。

```
SELECT * FROM msdb.dbo.rds_fn_list_user_tde_certificates();
```

输出与以下内容类似。此处并未显示所有列。


|  |  |  |  |  |  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| name | certificate\$1id | principal\$1id | pvt\$1key\$1encryption\$1type\$1desc | issuer\$1name | cert\$1serial\$1number | thumbprint | subject | start\$1date | expiry\$1date | pvt\$1key\$1last\$1backup\$1date | 
| UserTDECertificate\$1tde\$1cert | 343 | 1 | ENCRYPTED\$1BY\$1MASTER\$1KEY | AnyCompany Shipping | 79 3e 57 a3 69 fd 1d 9e 47 2c 32 67 1d 9c ca af | 0x6BB218B34110388680B FE1BA2D86C695096485B5 | AnyCompany Shipping | 2022-04-05 19:49:45.0000000 | 2023-04-05 19:49:45.0000000 | NULL | 

## 删除还原的 TDE 证书
<a name="TDE.BackupRestoreRDS.Drop"></a>

要删除您未使用的已还原（导入）的用户 TDE 证书，请使用 `rds_drop_tde_certificate` 存储过程。它具有以下语法。

```
EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_certificate_name';
```

以下参数是必需参数：
+ `@certificate_name` – 要删除的 TDE 证书的名称。

您只能删除已还原（导入）的 TDE 证书。您不能删除 RDS 创建的证书。

**Example 删除 TDE 证书**  

```
EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_myTDEcertificate';
```

# 备份和还原本地数据库的 TDE 证书
<a name="TDE.BackupRestoreOnPrem"></a>

您可以备份本地数据库的 TDE 证书，然后将其还原到 RDS for SQL Server。您还可以将 RDS for SQL Server TDE 证书还原到本地数据库实例。

**注意**  
RDS for SQL Server 不支持在 TDE 中使用跨账户密钥。

以下过程备份 TDE 证书和私有密钥。私有密钥使用从对称加密 KMS 密钥生成的数据密钥进行加密。

**备份本地 TDE 证书**

1. 使用 AWS CLI 命令 [generate-data-key](https://docs.aws.amazon.com/cli/latest/reference/kms/generate-data-key.html) 生成数据密钥。

   ```
   aws kms generate-data-key \
       --key-id my_KMS_key_ID \
       --key-spec AES_256
   ```

   输出与以下内容类似。

   ```
   {
   "CiphertextBlob": "AQIDAHimL2NEoAlOY6Bn7LJfnxi/OZe9kTQo/XQXduug1rmerwGiL7g5ux4av9GfZLxYTDATAAAAfjB8BgkqhkiG9w0B
   BwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMyCxLMi7GRZgKqD65AgEQgDtjvZLJo2cQ31Vetngzm2ybHDc3d2vI74SRUzZ
   2RezQy3sAS6ZHrCjfnfn0c65bFdhsXxjSMnudIY7AKw==",
   "Plaintext": "U/fpGtmzGCYBi8A2+0/9qcRQRK2zmG/aOn939ZnKi/0=",
   "KeyId": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-00ee-99ff-88dd-aa11bb22cc33"
   }
   ```

   您可以在下一步中使用纯文本输出作为私有密钥密码。

1. 备份 TDE 证书，如以下示例所示。

   ```
   BACKUP CERTIFICATE myOnPremTDEcertificate TO FILE = 'D:\tde-cert-backup.cer'
   WITH PRIVATE KEY (
   FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\cert-backup-key.pvk',
   ENCRYPTION BY PASSWORD = 'U/fpGtmzGCYBi8A2+0/9qcRQRK2zmG/aOn939ZnKi/0=');
   ```

1. 将证书备份文件保存到 Amazon S3 证书桶。

1. 将私有密钥备份文件保存到 S3 证书桶，并在文件的元数据中使用以下标签：
   + 密钥 – `x-amz-meta-rds-tde-pwd`
   + 值 – `CiphertextBlob` 值来自生成数据密钥过程，如以下示例所示。

     ```
     AQIDAHimL2NEoAlOY6Bn7LJfnxi/OZe9kTQo/XQXduug1rmerwGiL7g5ux4av9GfZLxYTDATAAAAfjB8BgkqhkiG9w0B
     BwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMyCxLMi7GRZgKqD65AgEQgDtjvZLJo2cQ31Vetngzm2ybHDc3d2vI74SRUzZ
     2RezQy3sAS6ZHrCjfnfn0c65bFdhsXxjSMnudIY7AKw==
     ```

以下过程将 RDS for SQL Server TDE 证书还原到本地数据库实例。您可以使用证书备份、相应的私有密钥文件和数据密钥在目标数据库实例上复制和还原 TDE 证书。还原的证书由新服务器的数据库主密钥加密。

**还原 TDE 证书**

1. 将 TDE 证书备份文件和私有密钥文件从 Amazon S3 复制到目标实例。有关从 Amazon S3 中复制文件的更多信息，请参阅[在 RDS for SQL Server 和 Amazon S3 之间传输文件](Appendix.SQLServer.Options.S3-integration.using.md)。

1. 使用 KMS 密钥解密输出密码文本，以检索数据密钥的纯文本。密码文本位于私有密钥备份文件的 S3 元数据中。

   ```
   aws kms decrypt \
       --key-id my_KMS_key_ID \
       --ciphertext-blob fileb://exampleCiphertextFile | base64 -d \
       --output text \
       --query Plaintext
   ```

   您可以在下一步中使用纯文本输出作为私有密钥密码。

1. 使用以下 SQL 命令还原 TDE 证书。

   ```
   CREATE CERTIFICATE myOnPremTDEcertificate FROM FILE='D:\tde-cert-backup.cer'
   WITH PRIVATE KEY (FILE = N'D:\tde-cert-key.pvk',
   DECRYPTION BY PASSWORD = 'plain_text_output');
   ```

有关 KMS 解密的更多信息，请参阅《AWS CLI 命令参考》**的 KMS 部分中的[解密](https://docs.aws.amazon.com/cli/latest/reference/kms/decrypt.html)。

在目标数据库实例上还原 TDE 证书后，您可以使用该证书还原加密的数据库。

**注意**  
您可以使用同一 TDE 证书对源数据库实例上的多个 SQL Server 数据库进行加密。要将多个数据库迁移到目标实例，请将与它们关联的 TDE 证书仅复制到目标实例（仅限一次）。

# 为 RDS for SQL Server 关闭 TDE
<a name="TDE.Disabling"></a>

要为 RDS for SQL Server 数据库实例关闭 TDE，首先应确保数据库实例上没有留下加密的对象。为此，请解密对象或删除它们。如果该数据库实例中存在任何加密的对象，则您不能为该数据库实例关闭 TDE。如果用于加密的用户 TDE 证书已还原（已导入），则应将其删除。当您使用控制台从选项组中删除 TDE 选项时，控制台会指明它正在处理。此外，如果选项组与加密数据库实例或数据库快照关联，则会创建一个错误事件。

下例从名为 `customerDatabase` 的数据库中删除 TDE 加密。

```
 1. ------------- Removing TDE ----------------
 2. 
 3. USE [customerDatabase]
 4. GO
 5. 
 6. -- Turn off encryption of the database
 7. ALTER DATABASE [customerDatabase]
 8. SET ENCRYPTION OFF
 9. GO
10. 
11. -- Wait until the encryption state of the database becomes 1. The state is 5 (Decryption in progress) for a while
12. SELECT db_name(database_id) as DatabaseName, * FROM sys.dm_database_encryption_keys
13. GO
14. 
15. -- Drop the DEK used for encryption
16. DROP DATABASE ENCRYPTION KEY
17. GO
18. 
19. -- Drop a user TDE certificate if it was restored (imported)
20. EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_certificate_name';
21. 
22. -- Alter to SIMPLE Recovery mode so that your encrypted log gets truncated
23. USE [master]
24. GO
25. ALTER DATABASE [customerDatabase] SET RECOVERY SIMPLE
26. GO
```

解密所有对象后，您有两个选项：

1. 您可以修改数据库实例，使其与没有 TDE 选项的选项组关联。

1. 您可以从选项组中删除 TDE 选项。

# SQL Server Audit
<a name="Appendix.SQLServer.Options.Audit"></a>

在 Amazon RDS 中，您可以使用内置 SQL Server 审核机制来审核 Microsoft SQL Server 数据库。您可以按照为本地数据库服务器创建审核和审核规范的相同方式来创建它们。

RDS 使用您提供的 IAM 角色将完成的审核日志上传到 S3 存储桶。如果您启用保留，则 RDS 会在配置的时间段内将您的审核日志保留在您的数据库实例中。

有关更多信息，请参阅 Microsoft SQL Server 文档中的 [SQL Server Audit（数据库引擎）](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine)。

## SQL Server 审计与数据库活动流
<a name="Appendix.SQLServer.DAS.Audit"></a>

您可以使用 RDS 的数据库活动流，将 SQL Server 审计事件与 Imperva、McAfee 和 IBM 中的数据库活动监控工具集成。有关使用 RDS SQL Server 的数据库活动流进行审计的详细信息，请参阅[Microsoft SQL Server 中的审计](DBActivityStreams.md#DBActivityStreams.Overview.SQLServer-auditing) 

**Topics**
+ [SQL Server 审计与数据库活动流](#Appendix.SQLServer.DAS.Audit)
+ [SQL Server Audit 支持](#Appendix.SQLServer.Options.Audit.Support)
+ [将 SQL Server Audit 添加到数据库实例选项](Appendix.SQLServer.Options.Audit.Adding.md)
+ [使用 SQL Server Audit](Appendix.SQLServer.Options.Audit.CreateAuditsAndSpecifications.md)
+ [查看审核日志](Appendix.SQLServer.Options.Audit.AuditRecords.md)
+ [将 SQL Server Audit 与多可用区实例结合使用](#Appendix.SQLServer.Options.Audit.Multi-AZ)
+ [配置 S3 存储桶](Appendix.SQLServer.Options.Audit.S3bucket.md)
+ [手动为 SQL Server Audit 创建 IAM 角色](Appendix.SQLServer.Options.Audit.IAM.md)

## SQL Server Audit 支持
<a name="Appendix.SQLServer.Options.Audit.Support"></a>

在 Amazon RDS 中，从 SQL Server 2016 开始，SQL Server 的所有版本都支持服务器级审计，而企业版还支持数据库级审计。从 SQL Server 2016 (13.x) SP1 开始，所有版本支持服务器级别和数据库级别审核。有关更多信息，请参阅 SQL Server 文档中的 [SQL Server Audit（数据库引擎）](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine)。

RDS 支持为 SQL Server Audit 配置以下选项设置。


| 选项设置 | 有效值 | 描述 | 
| --- | --- | --- | 
| IAM\$1ROLE\$1ARN | 采用 arn:aws:iam::account-id:role/role-name 格式的有效 Amazon Resource Name (ARN)。 | IAM 角色的 ARN，该角色对您想要用于存储审核日志的 S3 存储桶授予访问权。有关更多信息，请参阅《AWS 一般参考》中的 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-iam)。 | 
| S3\$1BUCKET\$1ARN | 有效 ARN 为 arn:aws:s3:::amzn-s3-demo-bucket 或 arn:aws:s3:::amzn-s3-demo-bucket/key-prefix 格式 | 您想要用于存储审核日志的 S3 存储桶的 ARN。 | 
| ENABLE\$1COMPRESSION | true 或者 false | 控制审核日志压缩。默认情况下，启用压缩（设置为 true）。 | 
| RETENTION\$1TIME | 0 到 840 | SQL Server 审核记录在您的 RDS 实例上保留的时间（按小时计）。默认情况下，禁用保留。 | 

# 将 SQL Server Audit 添加到数据库实例选项
<a name="Appendix.SQLServer.Options.Audit.Adding"></a>

启用 SQL Server Audit 需要两个步骤：在数据库实例上启用选项，然后在 SQL Server 内启用功能。将 SQL Server Audit 选项添加到数据库实例的流程如下：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 添加和配置所有必需的选项。

1. 将选项组与数据库实例相关联。

添加 SQL Server Audit 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，您就可以创建审核并在 S3 存储桶中存储审核日志。

**若要在数据库实例的选项组中添加和配置 SQL Server Audit**

1. 选择以下选项之一：
   + 使用现有选项组。
   + 创建自定义数据库选项组并使用该选项组。有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **SQLSERVER\$1AUDIT** 选项添加到选项组，然后配置选项设置。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。
   + 对于 **IAM 角色**，如果已经有具备必需策略的 IAM 角色，则可选择该角色。要创建新的 IAM 角色，请选择**创建新角色**。有关必需策略的信息，请参阅 [手动为 SQL Server Audit 创建 IAM 角色](Appendix.SQLServer.Options.Audit.IAM.md)。
   + 对于**选择 S3 目标**，如果已经有要使用的 S3 存储桶，则可选择该存储桶。要创建 S3 存储桶，请选择 **Create a New S3 Bucket**（创建新的 S3 存储桶）。
   + 对于**启用压缩**，请将此选项保留为选中状态以压缩审核文件。默认情况下，压缩已启用。若要禁用压缩，请取消选中 **Enable Compression (启用压缩)**。
   + 对于**审核日志保留**，如需在数据库实例上保留审核记录，请选择此选项。指定保留时间，按小时计。最长保留时间为 35 天。

1. 将选项组应用到新的或现有的数据库实例。选择以下选项之一：
   + 如果您正在创建新的数据库实例，请在启动实例时应用选项组。
   + 在现有数据库实例上，请通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 修改 SQL Server Audit 选项
<a name="Appendix.SQLServer.Options.Audit.Modifying"></a>

启用 SQL Server Audit 选项后，您可以修改各项设置。有关如何修改选项设置的信息，请参阅[修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。

## 从数据库实例选项中删除 SQL Server Audit
<a name="Appendix.SQLServer.Options.Audit.Removing"></a>

您可以通过禁用审核并删除选项来关闭 SQL Server Audit 功能。

**若要删除审核**

1. 禁用 SQL Server 内的所有审核设置。若要了解审核在何处运行，请查询 SQL Server 安全性目录视图。有关更多信息，请参阅 Microsoft SQL Server 文档中的[安全性目录视图](https://docs.microsoft.com/sql/relational-databases/system-catalog-views/security-catalog-views-transact-sql)。

1. 从数据库实例中删除 SQL Server Audit 选项。选择以下选项之一：
   + 从数据库实例使用的选项组中删除 SQL Server Audit 选项。此更改会影响使用相同选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
   + 修改数据库实例，然后选择一个没有 SQL Server Audit 选项的选项组。此更改仅影响您修改的数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. 从数据库实例中删除 SQL Server Audit 选项之后，不需要重新启动实例。从您的 S3 存储桶中删除不需要的审核文件。

# 使用 SQL Server Audit
<a name="Appendix.SQLServer.Options.Audit.CreateAuditsAndSpecifications"></a>

您可以按照与控制本地数据库服务器相同的方式控制服务器审核、服务器审核规范和数据库审核规范。

## 创建审核
<a name="Appendix.SQLServer.Options.Audit.CreateAudits"></a>

按照为本地数据库服务器创建服务器审核的相同方式来创建它们。有关如何创建服务器审核的信息，请参阅 Microsoft SQL Server 文档中的[创建服务器审核](https://docs.microsoft.com/sql/t-sql/statements/create-server-audit-transact-sql)。

为避免错误，请遵循以下限制：
+ 不要超过每个实例支持的服务器审核最大数目：50。
+ 指示 SQL Server 将数据写入二进制文件。
+ 请勿在服务器审核名称中使用 `RDS_` 作为前缀。
+ 对于 `FILEPATH`，请指定 `D:\rdsdbdata\SQLAudit`。
+ 对于 `MAXSIZE`，请指定 2 MB 至 50 MB 之间的大小。
+ 请勿配置 `MAX_ROLLOVER_FILES` 或 `MAX_FILES`。
+ 请勿将 SQL Server 配置为在数据库实例未能写入审核记录时将其关闭。

## 创建审核规范
<a name="Appendix.SQLServer.Options.Audit.CreateSpecifications"></a>

按照为本地数据库服务器创建服务器审核规范和数据库审核规范相同的方式来创建它们。有关创建审核规范的信息，请参阅 Microsoft SQL Server 文档中的[创建服务器审核规范](https://docs.microsoft.com/sql/t-sql/statements/create-server-audit-specification-transact-sql)和[创建数据库审核规范](https://docs.microsoft.com/sql/t-sql/statements/create-database-audit-specification-transact-sql)。

为避免错误，请勿在数据库审核规范或服务器审核规范的名称中使用 `RDS_` 作为前缀。

# 查看审核日志
<a name="Appendix.SQLServer.Options.Audit.AuditRecords"></a>

审核日志存储在 `D:\rdsdbdata\SQLAudit` 中。

SQL Server 完成写入到审核日志文件之后（当文件达到其大小限制时），Amazon RDS 会将文件上传到您的 S3 存储桶。如果启用了保留，Amazon RDS 会将文件移入到保留文件夹：`D:\rdsdbdata\SQLAudit\transmitted`。

有关配置保留的信息，请参阅[将 SQL Server Audit 添加到数据库实例选项](Appendix.SQLServer.Options.Audit.Adding.md)。

在上传审核日志文件之前，审核记录会一直保留在数据库实例上。您可以通过运行以下命令来查看审核记录。

```
SELECT   * 
	FROM     msdb.dbo.rds_fn_get_audit_file
	             ('D:\rdsdbdata\SQLAudit\*.sqlaudit'
	             , default
	             , default )
```

您可以使用相同的命令来查看保留文件夹中的审核记录，只需将筛选条件更改为 `D:\rdsdbdata\SQLAudit\transmitted\*.sqlaudit`。

```
SELECT   * 
	FROM     msdb.dbo.rds_fn_get_audit_file
	             ('D:\rdsdbdata\SQLAudit\transmitted\*.sqlaudit'
	             , default
	             , default )
```

## 将 SQL Server Audit 与多可用区实例结合使用
<a name="Appendix.SQLServer.Options.Audit.Multi-AZ"></a>

对于多可用区实例，将审核日志文件发送到 Amazon S3 的过程与单可用区实例类似。但是，二者之间存在一些重要区别：
+ 数据库审核规范对象复制到所有节点。
+ 服务器审核和服务审核规范不会复制到辅助节点。相反，您必须手动创建或修改它们。

若要从两个节点捕获服务器审核或服务器审核规范：

1. 在主节点上创建服务器审核或服务器审核规范。

1. 故障转移到辅助节点，并在辅助节点上使用相同名称和 GUID 创建服务器审核或服务器审核规范。使用 `AUDIT_GUID` 参数指定 GUID。

# 配置 S3 存储桶
<a name="Appendix.SQLServer.Options.Audit.S3bucket"></a>

审核日志文件会自动从数据库实例上传到您的 S3 存储桶。以下限制适用于您用作审核文件目标的 S3 存储桶。
+ 它必须与数据库实例位于相同的 AWS 区域和 AWS 账户中。
+ 它不得对公众开放。
+ 存储桶拥有者也必须是 IAM 角色拥有者。
+ IAM 角色必须对与 S3 存储桶服务器端加密关联的客户自主管理型 KMS 密钥拥有权限。

用于存储数据的目标键遵循以下命名模式：`amzn-s3-demo-bucket/key-prefix/instance-name/audit-name/node_file-name.ext`

**注意**  
您使用 (`S3_BUCKET_ARN`) 选项设置来设定存储桶名称和键前缀值。

模式由以下元素组成：
+ ***amzn-s3-demo-bucket*** – S3 存储桶的名称。
+ **`key-prefix`** – 您想要为审核日志使用的自定义键前缀。
+ **`instance-name`** – 您的 Amazon RDS 实例的名称。
+ **`audit-name`** – 审核的名称。
+ **`node`** – 审核日志来源节点（`node1` 或 `node2`）的标识符。单可用区实例有一个节点，多可用区实例有两个复制节点。这些不是主要和辅助节点，因为主要和辅助节点的角色会随时间而变化。相反，节点标识符是一个简单的标签。
  + **`node1`** – 第一个复制节点（单可用区只有一个节点）。
  + **`node2`** – 第二个复制节点（多可用区有两个节点）。
+ **`file-name`** – 目标文件名称。文件名按原样从 SQL Server 获取。
+ **`ext`** – 文件的扩展名（`zip` 或 `sqlaudit`）：
  + **`zip`** – 是否已启用压缩（默认）。
  + **`sqlaudit`** – 是否已禁用压缩。

# 手动为 SQL Server Audit 创建 IAM 角色
<a name="Appendix.SQLServer.Options.Audit.IAM"></a>

通常，当您创建新选项时，AWS 管理控制台会为您创建 IAM 角色和 IAM 信任策略。但是，您可以手动创建与 SQL Server Audit 一起使用的新 IAM 角色，以便您可以根据自己的任何附加需求对其进行定制。为此，创建一个 IAM 角色并委托权限，以便 Amazon RDS 服务可使用您的 Amazon S3 存储桶。创建这个 IAM 角色时，附加信任和权限策略。信任策略允许 Amazon RDS 担任此角色。权限策略定义此角色可以执行的操作。有关更多信息，请参阅 *AWS Identity and Access Management 用户指南*中的[创建角色以向 AWS 服务委托权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

您可以使用本节中的示例来创建所需的信任关系和权限策略。

以下示例显示了 SQL Server Audit 的信任关系。该关系使用*服务主体* `rds.amazonaws.com` 来允许 RDS 写入到 S3 存储桶。*服务委托人*是一个标识符，用于向服务授予权限。任何时候您通过这种方式允许访问 `rds.amazonaws.com`，即表示您允许 RDS 代表您执行操作。有关服务委托人的更多信息，请参阅 [AWS JSON 策略元素：Principal](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

**Example SQL Server Audit 的信任关系**    
****  

```
{
	    "Version":"2012-10-17",		 	 	 
	    "Statement": [
	        {
	            "Effect": "Allow",
	            "Principal": {
	                "Service": "rds.amazonaws.com"
	            },
	            "Action": "sts:AssumeRole"
	        }
	    ]
	}
```

我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
+ 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
+ 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 SQL Server Audit，请确保同时包含数据库选项组和数据库实例，如以下示例所示。

**Example 与 SQL Server Audit 的全局条件上下文键的信任关系**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": [
                        "arn:aws:rds:Region:my_account_ID:db:db_instance_identifier",
                        "arn:aws:rds:Region:my_account_ID:og:option_group_name"
                    ]
                }
            }
        }
    ]
}
```

在以下 SQL Server Audit 权限策略示例中，我们为 Amazon S3 存储桶指定 ARN。您可以使用 ARN 来识别您想要为其授予访问权的特定账户、用户或角色。有关使用 ARN 的更多信息，请参阅 [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

**Example SQL Server Audit 的权限策略**    
****  

```
{
	    "Version":"2012-10-17",		 	 	 
	    "Statement": [
	        {
	            "Effect": "Allow",
	            "Action": "s3:ListAllMyBuckets",
	            "Resource": "*"
	        },
	        {
	            "Effect": "Allow",
	            "Action": [
	                "s3:ListBucket",
	                "s3:GetBucketACL",
	                "s3:GetBucketLocation"
	            ],
	            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
	        },
	        {
	            "Effect": "Allow",
	            "Action": [
	                "s3:PutObject",
	                "s3:ListMultipartUploadParts",
	                "s3:AbortMultipartUpload"
	            ],
	            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
	        }
	    ]
	}
```

**注意**  
要验证同一 `s3:ListAllMyBuckets` 账户是否同时拥有 S3 存储桶和 SQL Server 数据库实例，需要执行 AWS 操作。该操作会列出该账户中的存储桶的名称。  
S3 存储桶命名空间是全局的。如果您意外删除了您的存储桶，则另一用户可以在其他账户中创建具有相同名称的存储桶。然后将 SQL Server Audit 数据写入新的存储桶。

# Amazon RDS for SQL Server 中对 SQL Server Analysis Services 的支持
<a name="Appendix.SQLServer.Options.SSAS"></a>

Microsoft SQL Server Analysis Services (SSAS) 属于 Microsoft Business Intelligence (MSBI) 套件。SSAS 是一个在线分析处理 (OLAP) 和数据挖掘工具，安装在 SQL Server 中。您可以使用 SSAS 分析数据来帮助制定业务决策。SSAS 不同于 SQL Server 关系数据库，因为 SSAS 针对商业智能环境中常见的查询和计算进行了优化。

 您可以为现有或新数据库实例启用 SSAS。它安装在与您的数据库引擎相同的数据库实例上。有关 SSAS 的更多信息，请参阅 Microsoft [分析服务文档](https://docs.microsoft.com/en-us/analysis-services)。

Amazon RDS 支持在 SQL Server 标准版和企业版的以下版中使用 SSAS：
+ 表格模式：
  + SQL Server 2019，版本 15.00.4043.16.v1 和更高版本
  + SQL Server 2017，版本 14.00.3223.3.v1 和更高版本
  + SQL Server 2016，版本 13.00.5426.0.v1 和更高版本
+ 多维模式：
  + SQL Server 2019，版本 15.00.4153.1.v1 和更高版本
  + SQL Server 2017，版本 14.00.3381.3.v1 和更高版本
  + SQL Server 2016，版本 13.00.5882.1.v1 和更高版本

**Contents**
+ [限制](#SSAS.Limitations)
+ [启用 SSAS](SSAS.Enabling.md)
  + [为 SSAS 创建选项组](SSAS.Enabling.md#SSAS.OptionGroup)
  + [将 SSAS 选项添加到选项组](SSAS.Enabling.md#SSAS.Add)
  + [将选项组与数据库实例关联](SSAS.Enabling.md#SSAS.Apply)
  + [允许对 VPC 安全组的入站访问](SSAS.Enabling.md#SSAS.InboundRule)
  + [启用 Amazon S3 集成](SSAS.Enabling.md#SSAS.EnableS3)
+ [在 Amazon RDS 上部署 SSAS 项目](SSAS.Deploy.md)
+ [监控部署任务的状态](SSAS.Monitor.md)
+ [在 Amazon RDS 上使用 SSAS](SSAS.Use.md)
  + [为 SSAS 设置经 Windows 身份验证的用户](SSAS.Use.md#SSAS.Use.Auth)
  + [添加域用户作为数据库管理员](SSAS.Use.md#SSAS.Admin)
  + [创建 SSAS 代理](SSAS.Use.md#SSAS.Use.Proxy)
  + [使用 SQL Server Agent 安排 SSAS 数据库处理](SSAS.Use.md#SSAS.Use.Schedule)
  + [从代理撤消 SSAS 访问权限](SSAS.Use.md#SSAS.Use.Revoke)
+ [备份 SSAS 数据库](SSAS.Backup.md)
+ [还原 SSAS 数据库](SSAS.Restore.md)
  + [将数据库实例还原到指定时间](SSAS.Restore.md#SSAS.PITR)
+ [更改 SSAS 模式](SSAS.ChangeMode.md)
+ [禁用 SSAS](SSAS.Disable.md)
+ [解决 SSAS 问题](SSAS.Trouble.md)

## 限制
<a name="SSAS.Limitations"></a>

以下限制适用于在 RDS for SQL Server 上使用 SSAS：
+ RDS for SQL Server 支持在表格模式或多维模式下运行 SSAS。有关更多信息，请参阅 Microsoft 文档中的[比较表格和多维解决方案](https://docs.microsoft.com/en-us/analysis-services/comparing-tabular-and-multidimensional-solutions-ssas)。
+ 一次只能使用一个 SSAS 模式。在更改模式之前，请确保删除所有 SSAS 数据库。

  有关更多信息，请参阅 [更改 SSAS 模式](SSAS.ChangeMode.md)。
+ 不支持多可用区实例。
+ 实例必须使用自行管理的 Active Directory 或 AWS Directory Service for Microsoft Active Directory 才能进行 SSAS 身份验证。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。
+ 用户不会被授予 SSAS 服务器管理员访问权限，但可以向他们授予数据库级管理员访问权限。
+ 唯一支持访问 SSAS 的端口是 2383。
+ 您不能直接部署项目。我们提供 RDS 存储过程来执行部署。有关更多信息，请参阅“[在 Amazon RDS 上部署 SSAS 项目](SSAS.Deploy.md)”。
+ 部署期间不支持进行处理。
+ 不支持使用 .xmla 文件进行部署。
+ SSAS 项目输入文件和数据库备份输出文件只能位于数据库实例的 `D:\S3` 文件夹中。

# 启用 SSAS
<a name="SSAS.Enabling"></a>

使用以下过程为数据库实例启用 SSAS：

1. 创建新的选项组或选择现有的选项组。

1. 将 `SSAS` 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

1. 允许对 SSAS 侦听器端口的 Virtual Private Cloud (VPC) 安全组进行入站访问。

1. 启用 Amazon S3 集成。

## 为 SSAS 创建选项组
<a name="SSAS.OptionGroup"></a>

使用 AWS 管理控制台 或 AWS CLI 创建对应于计划使用的 SQL Server 引擎和数据库实例版本的选项组。

**注意**  
如果现有选项组针对的是正确的 SQL Server 引擎和版本，也可以使用现有选项组。

### 控制台
<a name="SSAS.OptionGroup.Console"></a>

以下控制台过程创建适用于 SQL Server 标准版 2017 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗格中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **ssas-se-2017**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **SSAS option group for SQL Server SE 2017**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于**主引擎版本**，选择 **14.00**。

1. 选择**创建**。

### CLI
<a name="SSAS.OptionGroup.CLI"></a>

以下 CLI 示例为 SQL Server 标准版 2017 创建一个选项组。

**创建选项组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name ssas-se-2017 \
      --engine-name sqlserver-se \
      --major-engine-version 14.00 \
      --option-group-description "SSAS option group for SQL Server SE 2017"
  ```

  对于 Windows：

  ```
  aws rds create-option-group ^
      --option-group-name ssas-se-2017 ^
      --engine-name sqlserver-se ^
      --major-engine-version 14.00 ^
      --option-group-description "SSAS option group for SQL Server SE 2017"
  ```

## 将 SSAS 选项添加到选项组
<a name="SSAS.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `SSAS` 选项添加到选项组。

### 控制台
<a name="SSAS.Add.Console"></a>

**添加 SSAS 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择刚刚创建的选项组。

1. 选择**添加选项**。

1. 在 **Option details (选项详细信息)** 下，为 **Option name (选项名称)** 选择 **SSAS**。

1. 在**选项设置**下，执行以下操作：

   1. 在 **Max memory**（最大内存）中，输入 10–80 这个范围内的一个值。

      **Max memory (最大内存)** 指定上限阈值，超过该阈值后，SSAS 将开始更积极地释放内存，以便为正在运行的请求以及新的高优先级请求释放空间。该数字是占数据库实例总内存的百分比。允许的值是 10–80；默认值为 45。

   1. 在 **Mode**（模式）中选择 SSAS 服务器模式：**Tabular**（表格）或 **Multidimensional**（多维）。

      如果没有看到 **Mode**（模式）选项设置，则表示 AWS 区域不支持多维模式。有关更多信息，请参阅 [限制](Appendix.SQLServer.Options.SSAS.md#SSAS.Limitations)。

      默认为 **Tabular**（表格）模式。

   1. 对于 **Security groups (安全组)**，请选择要与选项关联的 VPC 安全组。
**注意**  
用于访问 SSAS 的端口 2383 已预先填充。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

### CLI
<a name="SSAS.Add.CLI"></a>

**添加 SSAS 选项**

1. 使用以下参数创建 JSON 文件 ，例如 `ssas-option.json`：
   + `OptionGroupName` – 您之前创建或选择的选项组的名称（以下示例中的 `ssas-se-2017`）。
   + `Port` – 用于访问 SSAS 的端口。唯一支持的端口是 2383。
   + `VpcSecurityGroupMemberships`：RDS 数据库实例的 VPC 安全组成员。
   + `MAX_MEMORY` – 上限阈值，超过该阈值后，SSAS 将开始更积极地释放内存，以便为正在运行的请求以及新的高优先级请求释放空间。该数字是占数据库实例总内存的百分比。允许的值是 10–80；默认值为 45。
   + `MODE`：SSAS 服务器模式，即 `Tabular` 和 `Multidimensional`，默认为 `Tabular`。

     如果收到的错误消息显示 `MODE` 选项设置无效，则表示 AWS 区域不支持多维模式。有关更多信息，请参阅 [限制](Appendix.SQLServer.Options.SSAS.md#SSAS.Limitations)。

   以下是具有 SSAS 选项设置的 JSON 文件示例。

   ```
   {
   "OptionGroupName": "ssas-se-2017",
   "OptionsToInclude": [
   	{
   	"OptionName": "SSAS",
   	"Port": 2383,
   	"VpcSecurityGroupMemberships": ["sg-0abcdef123"],
   	"OptionSettings": [{"Name":"MAX_MEMORY","Value":"60"},{"Name":"MODE","Value":"Multidimensional"}]
   	}],
   "ApplyImmediately": true
   }
   ```

1. 将 `SSAS` 选项添加到该选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
       --cli-input-json file://ssas-option.json \
       --apply-immediately
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group ^
       --cli-input-json file://ssas-option.json ^
       --apply-immediately
   ```

## 将选项组与数据库实例关联
<a name="SSAS.Apply"></a>

您可以使用控制台或 CLI 将选项组与数据库实例关联。

### 控制台
<a name="SSAS.Apply.Console"></a>

将您的选项组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时将选项组与数据库实例关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请修改实例并将新选项组与其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
**注意**  
如果您使用现有实例，则该实例必须已关联 Active Directory 域和 AWS Identity and Access Management (IAM) 角色。如果您创建新实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

### CLI
<a name="SSAS.Apply.CLI"></a>

您可将您的选项组与新的或现有的数据库实例关联。

**注意**  
如果您使用现有实例，则该实例必须已经关联了 Active Directory 域和 IAM 角色。如果您创建新实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

**创建使用选项组的数据库实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier myssasinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 14.00.3223.3.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --domain-iam-role-name my-directory-iam-role \
      --domain my-domain-id \
      --option-group-name ssas-se-2017
  ```

  对于 Windows：

  ```
  aws rds create-db-instance ^
      --db-instance-identifier myssasinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 14.00.3223.3.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --domain-iam-role-name my-directory-iam-role ^
      --domain my-domain-id ^
      --option-group-name ssas-se-2017
  ```

**修改数据库实例以关联选项组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier myssasinstance \
      --option-group-name ssas-se-2017 \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier myssasinstance ^
      --option-group-name ssas-se-2017 ^
      --apply-immediately
  ```

## 允许对 VPC 安全组的入站访问
<a name="SSAS.InboundRule"></a>

在与数据库实例关联的 VPC 安全组中，为指定的 SSAS 侦听器端口创建入站规则。有关设置安全组的更多信息，请参阅[通过创建安全组提供对 VPC 中的数据库实例的访问](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

## 启用 Amazon S3 集成
<a name="SSAS.EnableS3"></a>

要将模型配置文件下载到主机进行部署，请使用 Amazon S3 集成。有关更多信息，请参阅 [将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)。

# 在 Amazon RDS 上部署 SSAS 项目
<a name="SSAS.Deploy"></a>

在 RDS 上，您不能使用 SQL Server Management Studio (SSMS) 直接部署 SSAS 项目。要部署项目，请使用 RDS 存储过程。

**注意**  
不支持使用 .xmla 文件进行部署。

在部署项目之前，请确保满足以下条件：
+ Amazon S3 集成已启用。有关更多信息，请参阅 [将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)。
+ `Processing Option` 配置设置已设置为 `Do Not Process`。此设置意味着部署后不会进行任何处理。
+ 您有 `myssasproject.asdatabase` 和 `myssasproject.deploymentoptions` 文件。在您构建 SSAS 项目时，这些文件会自动生成。

**在 RDS 上部署 SSAS 项目**

1. 将 `.asdatabase`（SSAS 模型）文件从 S3 存储桶下载到数据库实例，如以下示例所示。有关下载参数的更多信息，请参阅[将文件从 Amazon S3 存储桶下载到 SQL Server 数据库实例](Appendix.SQLServer.Options.S3-integration.using.md#Appendix.SQLServer.Options.S3-integration.using.download)。

   ```
   exec msdb.dbo.rds_download_from_s3 
   @s3_arn_of_file='arn:aws:s3:::bucket_name/myssasproject.asdatabase', 
   [@rds_file_path='D:\S3\myssasproject.asdatabase'],
   [@overwrite_file=1];
   ```

1. 将 `.deploymentoptions` 文件从 S3 存储桶下载到数据库实例。

   ```
   exec msdb.dbo.rds_download_from_s3
   @s3_arn_of_file='arn:aws:s3:::bucket_name/myssasproject.deploymentoptions', 
   [@rds_file_path='D:\S3\myssasproject.deploymentoptions'],
   [@overwrite_file=1];
   ```

1. 部署项目。

   ```
   exec msdb.dbo.rds_msbi_task
   @task_type='SSAS_DEPLOY_PROJECT',
   @file_path='D:\S3\myssasproject.asdatabase';
   ```

# 监控部署任务的状态
<a name="SSAS.Monitor"></a>

要跟踪部署（或下载）任务的状态，请调用 `rds_fn_task_status` 函数。它获取两个参数。第一个参数应该始终为 `NULL`，因为它不适用于 SSAS。第二个参数接受任务 ID。

要查看所有任务的列表，请将第一个参数设置为 `NULL`，将第二个参数设置为 `0`，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

要获取特定任务，请将第一个参数设置为 `NULL`，将第二个参数设置为任务 ID，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 函数将返回以下信息。


| 输出参数 | 描述 | 
| --- | --- | 
| `task_id` | 任务的 ID。 | 
| `task_type` | 对于 SSAS，任务可以具有以下任务类型： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSAS.Monitor.html)  | 
| `database_name` | 不适用于 SSAS 任务。 | 
| `% complete` | 用百分比表示的任务进度。 | 
| `duration (mins)` | 在任务上花费的时间 (以分钟为单位)。 | 
| `lifecycle` |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSAS.Monitor.html)  | 
| `task_info` | 有关任务的其他信息。如果在处理过程中发生错误，则此列包含有关错误的信息。 有关更多信息，请参阅 [解决 SSAS 问题](SSAS.Trouble.md)。 | 
| `last_updated` | 上次更新任务状态的日期和时间。 | 
| `created_at` | 任务的创建日期和时间。 | 
| `S3_object_arn` |  不适用于 SSAS 任务。  | 
| `overwrite_S3_backup_file` | 不适用于 SSAS 任务。 | 
| `KMS_master_key_arn` |  不适用于 SSAS 任务。  | 
| `filepath` |  不适用于 SSAS 任务。  | 
| `overwrite_file` |  不适用于 SSAS 任务。  | 
| `task_metadata` | 与 SSAS 任务关联的元数据。 | 

# 在 Amazon RDS 上使用 SSAS
<a name="SSAS.Use"></a>

部署 SSAS 项目后，您可以直接在 SSMS 上处理 OLAP 数据库。

**在 RDS 上使用 SSAS**

1. 在 SSMS 中，使用 Active Directory 域的用户名和密码连接到 SSAS。

1. 展开 **Databases (数据库)**。此时将显示新部署的 SSAS 数据库。

1. 找到连接字符串，再更新用户名和密码，以便有权访问源 SQL 数据库。处理 SSAS 对象必须要执行此操作。

   1. 针对表格模式执行以下操作：

      1. 展开 **Connections**（连接）选项卡。

      1. 打开连接对象的上下文（右键单击）菜单，然后选择 **Properties**（属性）。

      1. 更新连接字符串中的用户名和密码。

   1. 针对多维模式执行以下操作：

      1. 展开 **Data Sources**（数据源）选项卡。

      1. 打开数据源对象的上下文（右键单击）菜单，然后选择 **Properties**（属性）。

      1. 更新连接字符串中的用户名和密码。

1. 打开您创建的 SSAS 数据库的上下文（右键单击）菜单，然后选择 **Process Database (处理数据库)**。

   根据输入数据的大小，处理操作可能需要几分钟时间才能完成。

**Topics**
+ [为 SSAS 设置经 Windows 身份验证的用户](#SSAS.Use.Auth)
+ [添加域用户作为数据库管理员](#SSAS.Admin)
+ [创建 SSAS 代理](#SSAS.Use.Proxy)
+ [使用 SQL Server Agent 安排 SSAS 数据库处理](#SSAS.Use.Schedule)
+ [从代理撤消 SSAS 访问权限](#SSAS.Use.Revoke)

## 为 SSAS 设置经 Windows 身份验证的用户
<a name="SSAS.Use.Auth"></a>

主管理员用户（有时也被称为主用户）可以使用以下代码示例设置经 Windows 身份验证的登录并授予所需的过程权限。执行此操作可向域用户授予权限以运行 SSAS 客户任务、使用 S3 文件传输过程、创建凭证以及使用 SQL Server Agent 代理。有关更多信息，请参阅 Microsoft 文档中的[凭证（数据库引擎）](https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/credentials-database-engine?view=sql-server-ver15)和[创建 SQL Server Agent 代理](https://docs.microsoft.com/en-us/sql/ssms/agent/create-a-sql-server-agent-proxy?view=sql-server-ver15)。

您可以根据需要向经 Windows 身份验证的用户授予以下部分或所有权限。

**Example**  

```
-- Create a server-level domain user login, if it doesn't already exist
USE [master]
GO
CREATE LOGIN [mydomain\user_name] FROM WINDOWS
GO

-- Create domain user, if it doesn't already exist
USE [msdb]
GO
CREATE USER [mydomain\user_name] FOR LOGIN [mydomain\user_name]
GO

-- Grant necessary privileges to the domain user
USE [master]
GO
GRANT ALTER ANY CREDENTIAL TO [mydomain\user_name]
GO

USE [msdb]
GO
GRANT EXEC ON msdb.dbo.rds_msbi_task TO [mydomain\user_name] with grant option
GRANT SELECT ON msdb.dbo.rds_fn_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_cancel_task TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_download_from_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_upload_to_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_delete_from_filesystem TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_gather_file_details TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_add_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_update_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_grant_login_to_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_revoke_login_from_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_delete_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_login_for_proxy to [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_proxy_for_subsystem TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_sqlagent_proxy TO [mydomain\user_name] with grant option
ALTER ROLE [SQLAgentUserRole] ADD MEMBER [mydomain\user_name]
GO
```

## 添加域用户作为数据库管理员
<a name="SSAS.Admin"></a>

您可以通过以下方式，将域用户添加为 SSAS 数据库管理员：
+ 数据库管理员可以使用 SSMS 创建具有 `admin` 权限的角色，然后将用户添加到该角色。
+ 您可以使用以下存储过程。

  ```
  exec msdb.dbo.rds_msbi_task
  @task_type='SSAS_ADD_DB_ADMIN_MEMBER',
  @database_name='myssasdb',
  @ssas_role_name='exampleRole',
  @ssas_role_member='domain_name\domain_user_name';
  ```

  以下参数为必需参数：
  + `@task_type` – MSBI 任务的类型，在此例中为 `SSAS_ADD_DB_ADMIN_MEMBER`。
  + `@database_name` – 要向其授予管理员特权的 SSAS 数据库的名称。
  + `@ssas_role_name` – SSAS 数据库管理员角色名称。如果角色尚不存在，则会创建它。
  + `@ssas_role_member` – 要添加到管理员角色的 SSAS 数据库用户。

## 创建 SSAS 代理
<a name="SSAS.Use.Proxy"></a>

要先创建 SSAS 凭证和 SSAS 代理，才能使用 SQL Server Agent 来安排 SSAS 数据库处理。以经 Windows 身份验证的用户身份运行这些过程。

**创建 SSAS 凭证**
+ 为代理创建凭证。为此，您可以使用 SSMS 或以下 SQL 语句。

  ```
  USE [master]
  GO
  CREATE CREDENTIAL [SSAS_Credential] WITH IDENTITY = N'mydomain\user_name', SECRET = N'mysecret'
  GO
  ```
**注意**  
`IDENTITY` 必须是经域身份验证的登录名。将 `mysecret` 替换为经域身份验证的登录的密码。

**创建 SSAS 代理**

1. 使用以下 SQL 语句创建代理。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_add_proxy @proxy_name=N'SSAS_Proxy',@credential_name=N'SSAS_Credential',@description=N''
   GO
   ```

1. 使用以下 SQL 语句向其他用户授予对代理的访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSAS_Proxy',@login_name=N'mydomain\user_name'
   GO
   ```

1. 使用以下 SQL 语句向代理授予 SSAS 子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='GRANT_SUBSYSTEM_ACCESS',@proxy_name='SSAS_Proxy',@proxy_subsystem='SSAS'
   GO
   ```

**查看代理和代理上的授权**

1. 使用以下 SQL 语句查看代理的被授权者。

   ```
   USE [msdb]
   GO
   EXEC sp_help_proxy
   GO
   ```

1. 使用以下 SQL 语句查看子系统授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_enum_proxy_for_subsystem
   GO
   ```

## 使用 SQL Server Agent 安排 SSAS 数据库处理
<a name="SSAS.Use.Schedule"></a>

创建凭证和代理并向 SSAS 授予对代理的访问权限后，您可以创建 SQL Server Agent 任务来安排 SSAS 数据库处理。

**安排 SSAS 数据库处理**
+ 使用 SSMS 或 T-SQL 创建 SQL Server Agent 任务。以下示例使用 T-SQL。您可以通过 SSMS 或 T-SQL 进一步配置其任务计划。
  + `@command` 参数概述了将由 SQL Server Agent 任务运行的 XML for Analysis (XMLA) 命令。此示例配置了 SSAS 多维数据库处理。
  + `@server` 参数概述了 SQL Server Agent 任务的目标 SSAS 服务器名称。

    要在 SQL Server Agent 任务所在的同一 RDS 数据库实例中调用 SSAS 服务，请使用 `localhost:2383`。

    要从 RDS 数据库实例外部调用 SSAS 服务，请使用 RDS 端点。如果 RDS 数据库实例是由同一个域联接，则还可以使用 Kerberos Active Directory (AD) 端点 (`your-DB-instance-name.your-AD-domain-name`)。对于外部数据库实例，请确保正确配置与 RDS 数据库实例关联的 VPC 安全组，以便实现安全连接。

  您可以进一步编辑查询来支持各种 XMLA 操作。可以直接修改 T-SQL 查询进行编辑，也可以在创建 SQL Server Agent 任务后使用 SSMS UI 进行编辑。

  ```
  USE [msdb]
  GO
  DECLARE @jobId BINARY(16)
  EXEC msdb.dbo.sp_add_job @job_name=N'SSAS_Job', 
      @enabled=1, 
      @notify_level_eventlog=0, 
      @notify_level_email=0, 
      @notify_level_netsend=0, 
      @notify_level_page=0, 
      @delete_level=0, 
      @category_name=N'[Uncategorized (Local)]', 
      @job_id = @jobId OUTPUT
  GO
  EXEC msdb.dbo.sp_add_jobserver 
      @job_name=N'SSAS_Job', 
      @server_name = N'(local)'
  GO
  EXEC msdb.dbo.sp_add_jobstep @job_name=N'SSAS_Job', @step_name=N'Process_SSAS_Object', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=1, 
      @on_success_step_id=0, 
      @on_fail_action=2, 
      @on_fail_step_id=0, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, @subsystem=N'ANALYSISCOMMAND', 
      @command=N'<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
          <Parallel>
              <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" 
                  xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" 
                  xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:ddl300="http://schemas.microsoft.com/analysisservices/2011/engine/300" 
                  xmlns:ddl300_300="http://schemas.microsoft.com/analysisservices/2011/engine/300/300" xmlns:ddl400="http://schemas.microsoft.com/analysisservices/2012/engine/400" 
                  xmlns:ddl400_400="http://schemas.microsoft.com/analysisservices/2012/engine/400/400" xmlns:ddl500="http://schemas.microsoft.com/analysisservices/2013/engine/500" 
                  xmlns:ddl500_500="http://schemas.microsoft.com/analysisservices/2013/engine/500/500">
                  <Object>
                      <DatabaseID>Your_SSAS_Database_ID</DatabaseID>
                  </Object>
                  <Type>ProcessFull</Type>
                  <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
              </Process>
          </Parallel>
      </Batch>', 
      @server=N'localhost:2383', 
      @database_name=N'master', 
      @flags=0, 
      @proxy_name=N'SSAS_Proxy'
  GO
  ```

## 从代理撤消 SSAS 访问权限
<a name="SSAS.Use.Revoke"></a>

您可以使用以下存储过程撤消对 SSAS 子系统的访问权限并删除 SSAS 代理。

**撤消访问权限并删除代理**

1. 撤消子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='REVOKE_SUBSYSTEM_ACCESS',@proxy_name='SSAS_Proxy',@proxy_subsystem='SSAS'
   GO
   ```

1. 撤消代理上的授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_revoke_login_from_proxy @proxy_name=N'SSAS_Proxy',@name=N'mydomain\user_name'
   GO
   ```

1. 删除代理。

   ```
   USE [msdb]
   GO
   EXEC dbo.sp_delete_proxy @proxy_name = N'SSAS_Proxy'
   GO
   ```

# 备份 SSAS 数据库
<a name="SSAS.Backup"></a>

您只能在数据库实例的 `D:\S3` 文件夹中创建 SSAS 数据库备份文件。要将备份文件移动到 S3 存储桶，请使用 Amazon S3。

您可以如下所示备份 SSAS 数据库：
+ 特定数据库具有 `admin` 角色的域用户可以使用 SSMS 将数据库备份到 `D:\S3` 文件夹。

  有关更多信息，请参阅“[添加域用户作为数据库管理员](SSAS.Use.md#SSAS.Admin)”。
+ 您可以使用以下存储过程。此存储过程不支持加密。

  ```
  exec msdb.dbo.rds_msbi_task
  @task_type='SSAS_BACKUP_DB',
  @database_name='myssasdb',
  @file_path='D:\S3\ssas_db_backup.abf',
  [@ssas_apply_compression=1],
  [@ssas_overwrite_file=1];
  ```

  以下参数为必需参数：
  + `@task_type` – MSBI 任务的类型，在此例中为 `SSAS_BACKUP_DB`。
  + `@database_name` – 要备份的 SSAS 数据库的名称。
  + `@file_path` – SSAS 备份文件的路径。`.abf` 扩展名必需。

  以下参数为可选参数：
  + `@ssas_apply_compression` – 是否应用 SSAS 备份压缩。有效值为 1（是）和 0（否）。
  + `@ssas_overwrite_file` – 是否覆盖 SSAS 备份文件。有效值为 1（是）和 0（否）。

# 还原 SSAS 数据库
<a name="SSAS.Restore"></a>

使用以下存储过程从备份还原 SSAS 数据库。

如果存在同名的现有 SSAS 数据库，则无法还原数据库。用于还原的存储过程不支持加密的备份文件。

```
exec msdb.dbo.rds_msbi_task
@task_type='SSAS_RESTORE_DB',
@database_name='mynewssasdb',
@file_path='D:\S3\ssas_db_backup.abf';
```

以下参数为必需参数：
+ `@task_type` – MSBI 任务的类型，在此例中为 `SSAS_RESTORE_DB`。
+ `@database_name` – 您要还原到的新 SSAS 数据库的名称。
+ `@file_path` – SSAS 备份文件的路径。

## 将数据库实例还原到指定时间
<a name="SSAS.PITR"></a>

时间点恢复 (PITR) 不适用于 SSAS 数据库。如果您执行 PITR，则在还原的实例上，只有在请求时间之前的最后一个快照中的 SSAS 数据可用。

**在还原的数据库实例上拥有最新的 SSAS 数据库**

1. 将您的 SSAS 数据库备份到源实例上的 `D:\S3` 文件夹。

1. 将备份文件传输到 S3 存储桶。

1. 将备份文件从 S3 存储桶传输到还原后的实例上的 `D:\S3` 文件夹。

1. 运行存储过程，将 SSAS 数据库还原到还原后的实例上。

   您还可以重新处理 SSAS 项目以还原数据库。

# 更改 SSAS 模式
<a name="SSAS.ChangeMode"></a>

您可以更改 SSAS 的运行模式，无论其采用的是表格模式还是多维模式。若要更改模式，请使用 AWS 管理控制台 或 AWS CLI 修改 SSAS 选项中的选项设置。

**重要**  
一次只能使用一个 SSAS 模式。更改模式之前，请务必删除所有 SSAS 数据库，否则会收到错误消息。

## 控制台
<a name="SSAS.ChangeMode.CON"></a>

以下 Amazon RDS 控制台程序可将 SSAS 模式更改为表格模式，然后将 `MAX_MEMORY` 参数设置为 70%。

**修改 SSAS 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有要修改的 `SSAS` 选项（前面示例中的 `ssas-se-2017`）的选项组。

1. 选择 **Modify option**（修改选项）。

1. 更改选项设置：

   1. 在 **Max memory**（最大内存）中输入 **70**。

   1. 在**Mode**（模式）中选择 **Tabular**（表格）。

1. 选择 **Modify option**（修改选项）。

## AWS CLI
<a name="SSAS.ChangeMode.CLI"></a>

以下 AWS CLI 示例会将 SSAS 模式更改为表格模式，然后将 `MAX_MEMORY` 参数设置为 70%。

为了使 CLI 命令正常运行，请确保命令中包含所有必要参数，即使未对其进行修改。

**修改 SSAS 选项**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name ssas-se-2017 \
      --options "OptionName=SSAS,VpcSecurityGroupMemberships=sg-12345e67,OptionSettings=[{Name=MAX_MEMORY,Value=70},{Name=MODE,Value=Tabular}]" \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds add-option-to-option-group ^
      --option-group-name ssas-se-2017 ^
      --options OptionName=SSAS,VpcSecurityGroupMemberships=sg-12345e67,OptionSettings=[{Name=MAX_MEMORY,Value=70},{Name=MODE,Value=Tabular}] ^
      --apply-immediately
  ```

# 禁用 SSAS
<a name="SSAS.Disable"></a>

若要禁用 SSAS，请从选项组中删除 `SSAS` 选项。

**重要**  
删除 `SSAS` 选项之前，请先删除您的 SSAS 数据库。  
我们强烈建议您先备份 SSAS 数据库，然后再删除这些数据库并删除 `SSAS` 选项。

## 控制台
<a name="SSAS.Disable.Console"></a>

**从其选项组中删除 SSAS 选项**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有要删除的 `SSAS` 选项（前面示例中的 `ssas-se-2017`）的选项组。

1. 选择 **Delete option (删除选项)**。

1. 在 **Delete option (删除选项)** 下，为 **Options to delete (要删除的选项)** 选择 **SSAS**。

1. 在 **Apply immediately (立即应用)** 下，选择 **Yes (是)** 可立即删除选项，选择 **No (否)** 可在下次维护时段时删除。

1. 选择**删除**。

## AWS CLI
<a name="SSAS.Disable.CLI"></a>

**从其选项组中删除 SSAS 选项**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name ssas-se-2017 \
      --options SSAS \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name ssas-se-2017 ^
      --options SSAS ^
      --apply-immediately
  ```

# 解决 SSAS 问题
<a name="SSAS.Trouble"></a>

您可能会在使用 SSAS 时遇到以下问题。


| 问题 | 类型 | 故障排除建议 | 
| --- | --- | --- | 
| 无法配置 SSAS 选项。请求的 SSAS 模式是 new\$1mode，但当前数据库实例有 number 个 current\$1mode 数据库。在切换到 new\$1mode 模式之前，请删除现有数据库。要重新获得数据库删除 current\$1mode 模式的访问权限，可以更新当前数据库选项组，也可以附加新选项组（将 %s 作为 SSAS 选项的模式选项设置值）。 | RDS 事件 | 如果仍有 SSAS 数据库使用当前模式，则无法更改 SSAS 模式。请删除 SSAS 数据库，然后重试。 | 
| 无法删除 SSAS 选项，因为存在 number 个现有 mode 数据库。删除所有 SSAS 数据库后，才能删除 SSAS 选项。再次添加 SSAS 选项，删除所有 SSAS 数据库，然后重试。 | RDS 事件 | 如果仍然有 SSAS 数据库，则无法禁用 SSAS。请删除 SSAS 数据库，然后重试。 | 
| SSAS 选项未启用或处于启用过程中。请稍后重试。 | RDS 存储过程 | 选项被禁用或正在启用时，您无法运行 SSAS 存储过程。 | 
| SSAS 选项配置不正确。确保选项组成员资格状态为“同步中”，然后查看 RDS 事件日志以获取相关 SSAS 配置错误消息。在完成这些调查后重试一次。如果仍会出现错误，请联系 AWS Support。 | RDS 存储过程 |  如果选项组成员资格不是 `in-sync` 状态，则无法运行 SSAS 存储过程。这会让 SSAS 选项处于不正确的配置状态。 如果选项组成员资格状态因 SSAS 选项修改而变为 `failed`，则有两个可能原因： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSAS.Trouble.html) 重新配置 SSAS 选项，因为 RDS 一次只允许一个 SSAS 模式，并且不支持在存在 SSAS 数据库的情况下删除 SSAS 选项。 检查 RDS 事件日志中 SSAS 实例的配置错误，再相应地解决问题。  | 
| 部署失败。只能在以 deployment\$1file\$1mode 模式运行的服务器上部署更改。当前服务器模式为 current\$1mode。 | RDS 存储过程 |  无法将表格数据库部署到多维服务器，也无法将多维数据库部署到表格服务器。 确保使用的是具有正确模式的文件，然后验证 `MODE` 选项设置是否设置为合适的值。  | 
| 还原失败。只能在以 restore\$1file\$1mode 模式运行的服务器上恢复备份文件。当前服务器模式为 current\$1mode。 | RDS 存储过程 |  无法将表格数据库还原到多维服务器，也无法将多维数据库还原到表格服务器。 确保使用的是具有正确模式的文件，然后验证 `MODE` 选项设置是否设置为合适的值。  | 
| 还原失败。备份文件与 RDS 数据库实例版本不兼容。 | RDS 存储过程 |  无法使用与 SQL Server 实例版本不兼容的版本还原 SSAS 数据库。 有关更多信息，请参阅 Microsoft 文档中的[表格模型的兼容性级别](https://docs.microsoft.com/en-us/analysis-services/tabular-models/compatibility-level-for-tabular-models-in-analysis-services)和[多维数据库的兼容性级别](https://docs.microsoft.com/en-us/analysis-services/multidimensional-models/compatibility-level-of-a-multidimensional-database-analysis-services)。  | 
| 还原失败。还原操作中指定的备份文件已损坏或不是 SSAS 备份文件。确保 @rds\$1file\$1path 格式正确。 | RDS 存储过程 |  无法使用受损文件还原 SSAS 数据库。 确保文件未遭破坏或损坏。 此错误也会在 `@rds_file_path` 格式不正确时发生。（例如 `D:\S3\\incorrect_format.abf` 中存在两条反斜杠）。  | 
| 还原失败。还原的数据库名称不能包含任何保留字或无效字符（. , ; ' ` : / \$1\$1 \$1 \$1 ? \$1" & % \$1 \$1 \$1 = ( ) [ ] \$1 \$1 <>），长度不能超过 100 个字符。 | RDS 存储过程 |  还原的数据库名称不能包含任何保留字或无效字符，长度不能超过 100 个字符。 有关 SSAS 对象命名惯例，请参阅 Microsoft 文档中的[对象命名规则](https://docs.microsoft.com/en-us/analysis-services/multidimensional-models/olap-physical/object-naming-rules-analysis-services)。  | 
| 提供的角色名称无效。角色名称不能包含任何保留字符串。 | RDS 存储过程 |  角色名称不能包含任何保留字符串。 有关 SSAS 对象命名惯例，请参阅 Microsoft 文档中的[对象命名规则](https://docs.microsoft.com/en-us/analysis-services/multidimensional-models/olap-physical/object-naming-rules-analysis-services)。  | 
| 提供的角色名称无效。角色名称不能包含以下任何保留字符：. , ; ' ` : / \$1\$1 \$1 \$1 ? \$1" & % \$1 \$1 \$1 = ( ) [ ] \$1 \$1 <> | RDS 存储过程 |  角色名称不能包含任何保留字符。 有关 SSAS 对象命名惯例，请参阅 Microsoft 文档中的[对象命名规则](https://docs.microsoft.com/en-us/analysis-services/multidimensional-models/olap-physical/object-naming-rules-analysis-services)。  | 

# 支持 Amazon RDS for SQL Server 中的 SQL Server Integration Services
<a name="Appendix.SQLServer.Options.SSIS"></a>

Microsoft SQL Server Integration Services (SSIS) 是一个组件，可用于执行一系列广泛的数据迁移任务。SSIS 是一个用于数据集成和工作流应用程序的平台。它具有用于数据提取、转换和加载 (ETL) 的数据仓库工具。您还可以使用此工具自动维护 SQL Server 数据库以及对多维数据集数据的更新。

SSIS 项目将整理到另存为基于 XML 的 .dtsx 文件的包中。包可以包含控制流和数据流。您可以使用数据流来表示 ETL 操作。部署后，包存储在 SQL Server 中的 SSISDB 数据库中。SSISDB 是处于完全恢复模式的联机事务处理 (OLTP) 数据库。

Amazon RDS for SQL Server 支持直接在 RDS 数据库实例上运行 SSIS。您可以在现有的或新的数据库实例上启用 SSIS。SSIS 安装在与您的数据库引擎相同的数据库实例上。

RDS 在以下版本上对于 SQL Server 标准版和企业版支持 SSIS：
+ SQL Server 2022，所有版本
+ SQL Server 2019，版本 15.00.4043.16.v1 和更高版本
+ SQL Server 2017，版本 14.00.3223.3.v1 和更高版本
+ SQL Server 2016，版本 13.00.5426.0.v1 和更高版本

**Contents**
+ [限制和建议](#SSIS.Limitations)
+ [启用 SSIS](#SSIS.Enabling)
  + [为 SSIS 创建选项组](#SSIS.OptionGroup)
  + [将 SSIS 选项添加到选项组](#SSIS.Add)
  + [为 SSIS 创建参数组](#SSIS.CreateParamGroup)
  + [修改 SSIS 的参数](#SSIS.ModifyParam)
  + [将选项组和参数组与数据库实例关联](#SSIS.Apply)
  + [启用 S3 集成](#SSIS.EnableS3)
+ [SSISDB 上的管理权限](SSIS.Permissions.md)
  + [为 SSIS 设置经 Windows 身份验证的用户](SSIS.Permissions.md#SSIS.Use.Auth)
+ [部署 SSIS 项目](SSIS.Deploy.md)
+ [监控部署任务的状态](SSIS.Monitor.md)
+ [使用 SSIS](SSIS.Use.md)
  + [为 SSIS 项目设置数据库连接管理器](SSIS.Use.md#SSIS.Use.ConnMgrs)
  + [创建 SSIS 代理](SSIS.Use.md#SSIS.Use.Proxy)
  + [使用 SQL Server Agent 安排 SSIS 程序包](SSIS.Use.md#SSIS.Use.Schedule)
  + [从代理撤消 SSIS 访问权限](SSIS.Use.md#SSIS.Use.Revoke)
+ [禁用并删除 SSIS 数据库](SSIS.DisableDrop.md)
  + [禁用 SSIS](SSIS.DisableDrop.md#SSIS.Disable)
  + [删除 SSISDB 数据库](SSIS.DisableDrop.md#SSIS.Drop)

## 限制和建议
<a name="SSIS.Limitations"></a>

以下限制和建议适用于在 RDS for SQL Server 上运行 SSIS：
+ 数据库实例必须具有 `clr enabled` 参数设置为 1 的关联参数组。有关更多信息，请参阅 [修改 SSIS 的参数](#SSIS.ModifyParam)。
**注意**  
如果在 SQL Server 2017 或 2019 上启用 `clr enabled` 参数，则无法在数据库实例上使用公共语言运行时 (CLR)。有关更多信息，请参阅 [不支持的功能以及有限支持的功能](SQLServer.Concepts.General.FeatureNonSupport.md)。
+ 支持以下控制流任务：
  + 分析服务执行 DDL 任务
  + 分析服务处理任务
  + 批量插入任务
  + 检查数据库完整性任务
  + 数据流任务
  + 数据挖掘查询任务
  + 数据分析任务
  + 执行包任务
  + 执行 SQL Server Agent 作业任务
  + 执行 SQL 任务
  + 执行 T-SQL 语句任务
  + 通知操作员任务
  + 重建索引任务
  + 重新组织索引任务
  + 收缩数据库任务
  + 传输数据库任务
  + 传输作业任务
  + 传输登录名任务
  + 传输 SQL Server 对象任务
  + 更新统计数据任务
+ 仅支持项目部署。
+ 支持使用 SQL Server Agent 运行 SSIS 程序包。
+ SSIS 日志记录只能插入用户创建的数据库中。
+ 仅使用 `D:\S3` 文件夹来处理文件。放置在任何其他目录中的文件将被删除。请注意其他几个文件位置的详细信息：
  + 将 SSIS 项目输入和输出文件置于 `D:\S3` 文件夹中。
  + 对于数据流任务，将 `BLOBTempStoragePath` 和 `BufferTempStoragePath` 的位置更改为 `D:\S3` 文件夹中的文件。文件路径必须以 `D:\S3\` 开头。
  + 确保用于文件连接的所有参数、变量和表达式都指向 `D:\S3` 文件夹。
  + 在多可用区实例上，SSIS 在 `D:\S3` 文件夹中创建的文件将在故障转移后被删除。有关更多信息，请参阅“[S3 集成的多可用区限制](User.SQLServer.Options.S3-integration.md#S3-MAZ)”。
  + 将 SSIS 在 `D:\S3` 文件夹中创建的文件上传到您的 Amazon S3 存储桶以使其持久存在。
+ 不支持导入列和导出列转换以及数据流任务上的脚本组件。
+ 无法对正在运行的 SSIS 程序包启用转储，也无法在 SSIS 程序包上添加数据分接头。
+ 不支持 SSIS 扩展功能。
+ 您不能直接部署项目。我们提供 RDS 存储过程来执行此操作。有关更多信息，请参阅“[部署 SSIS 项目](SSIS.Deploy.md)”。
+ 使用 `DoNotSavePasswords` 保护模式构建 SSIS 项目 (.ispac) 文件以便在 RDS 上进行部署。
+ 具有只读副本的“始终打开”实例不支持 SSIS。
+ 您无法备份与 `SSIS` 选项关联的 SSISDB 数据库。
+ 不支持从 SSIS 的其他实例导入和还原 SSISDB 数据库。
+ 您可以连接到其他 SQL Server 数据库实例或 Oracle 数据来源。RDS for SQL Server 上的 SSIS 不支持连接到其他数据库引擎（例如 MySQL 或 PostgreSQL）。有关连接到 Oracle 数据来源的更多信息，请参阅 [带有 Oracle OLEDB 的链接服务器](Appendix.SQLServer.Options.LinkedServers_Oracle_OLEDB.md)。
+ SSIS 不支持与本地域建立传出信任的已加入域的实例。在使用传出信任时，请从本地 AWS 域中的账户运行 SSIS 作业。
+ 不支持执行基于文件系统的软件包。

## 启用 SSIS
<a name="SSIS.Enabling"></a>

您可以通过向数据库实例添加 SSIS 选项来启用 SSIS。使用以下过程：

1. 创建新的选项组或选择现有的选项组。

1. 将 `SSIS` 选项添加到该选项组。

1. 创建新的参数组，或选择现有参数组。

1. 修改参数组以将 `clr enabled` 参数设置为 1。

1. 将选项组和参数组与数据库实例关联。

1. 启用 Amazon S3 集成。

**注意**  
如果数据库实例上已存在带有名称 SSISDB 或预留的 SSIS 登录名的数据库，则无法在实例上启用 SSIS。

### 为 SSIS 创建选项组
<a name="SSIS.OptionGroup"></a>

要使用 SSIS，请创建或修改与您计划使用的 SQL Server 版本和数据库实例版本对应的选项组。为此，请使用 AWS 管理控制台或 AWS CLI。

#### 控制台
<a name="SSIS.OptionGroup.Console"></a>

以下控制台过程创建适用于 SQL Server 标准版 2016 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗口中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **ssis-se-2016**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **SSIS option group for SQL Server SE 2016**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于**主要引擎版本**，选择 **13.00**。

1. 选择**创建**。

#### CLI
<a name="SSIS.OptionGroup.CLI"></a>

以下控制台过程创建适用于 SQL Server 标准版 2016 的选项组。

**创建选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name ssis-se-2016 \
      --engine-name sqlserver-se \
      --major-engine-version 13.00 \
      --option-group-description "SSIS option group for SQL Server SE 2016"
  ```

  对于：Windows

  ```
  aws rds create-option-group ^
      --option-group-name ssis-se-2016 ^
      --engine-name sqlserver-se ^
      --major-engine-version 13.00 ^
      --option-group-description "SSIS option group for SQL Server SE 2016"
  ```

### 将 SSIS 选项添加到选项组
<a name="SSIS.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `SSIS` 选项添加到您的选项组。

#### 控制台
<a name="SSIS.Add.Console"></a>

**添加 SSIS 选项**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择您刚刚创建的选项组（在此示例中为 **ssis-se-2016**）。

1. 选择**添加选项**。

1. 在**选项详细信息**下，为**选项名称**选择 **SSIS**。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

#### CLI
<a name="SSIS.Add.CLI"></a>

**添加 SSIS 选项**
+ 将 `SSIS` 选项添加到该选项组。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name ssis-se-2016 \
      --options OptionName=SSIS \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds add-option-to-option-group ^
      --option-group-name ssis-se-2016 ^
      --options OptionName=SSIS ^
      --apply-immediately
  ```

### 为 SSIS 创建参数组
<a name="SSIS.CreateParamGroup"></a>

为与您计划用于 SSIS 的 SQL Server 版本和数据库实例版本对应的 `clr enabled` 参数创建或修改参数组。

#### 控制台
<a name="SSIS.CreateParamGroup.Console"></a>

以下过程为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择**创建参数组**。

1. 在**创建参数组**窗格中，执行以下操作：

   1. 对于**参数组系列**，选择 **sqlserver-se-13.0**。

   1. 对于**组名称**，输入参数组的标识符，如 **ssis-sqlserver-se-13**。

   1. 对于**描述**，输入 **clr enabled parameter group**。

1. 选择**创建**。

#### CLI
<a name="SSIS.CreateParamGroup.CLI"></a>

以下过程为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-parameter-group \
      --db-parameter-group-name ssis-sqlserver-se-13 \
      --db-parameter-group-family "sqlserver-se-13.0" \
      --description "clr enabled parameter group"
  ```

  对于：Windows

  ```
  aws rds create-db-parameter-group ^
      --db-parameter-group-name ssis-sqlserver-se-13 ^
      --db-parameter-group-family "sqlserver-se-13.0" ^
      --description "clr enabled parameter group"
  ```

### 修改 SSIS 的参数
<a name="SSIS.ModifyParam"></a>

修改与 SQL Server 版本和数据库实例版本对应的参数组中的 `clr enabled` 参数。对于 SSIS，将 `clr enabled` 参数设置为 1。

#### 控制台
<a name="SSIS.ModifyParam.Console"></a>

以下过程修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择参数组，例如 **ssis-sqlserver-se-13**。

1. 在**参数**下，从参数列表中筛选 **clr**。

1. 选择 **clr enabled (启用 clr)**。

1. 选择**编辑参数**。

1. 从**值**中选择 **1**。

1. 选择**保存更改**。

#### CLI
<a name="SSIS.ModifyParam.CLI"></a>

以下过程修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-parameter-group \
      --db-parameter-group-name ssis-sqlserver-se-13 \
      --parameters "ParameterName='clr enabled',ParameterValue=1,ApplyMethod=immediate"
  ```

  对于：Windows

  ```
  aws rds modify-db-parameter-group ^
      --db-parameter-group-name ssis-sqlserver-se-13 ^
      --parameters "ParameterName='clr enabled',ParameterValue=1,ApplyMethod=immediate"
  ```

### 将选项组和参数组与数据库实例关联
<a name="SSIS.Apply"></a>

要将 SSIS 选项组和参数组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI 

**注意**  
如果您使用现有实例，则该实例必须已关联 Active Directory 域和 AWS Identity and Access Management (IAM) 角色。如果您创建新实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

#### 控制台
<a name="SSIS.Apply.Console"></a>

要完成对 SSIS 的启用，请将 SSIS 选项组和参数组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

#### CLI
<a name="SSIS.Apply.CLI"></a>

您可以将 SSIS 选项组和参数组与新的或现有的数据库实例关联。

**使用 SSIS 选项组和参数组创建实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier myssisinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 13.00.5426.0.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --domain-iam-role-name my-directory-iam-role \
      --domain my-domain-id \
      --option-group-name ssis-se-2016 \
      --db-parameter-group-name ssis-sqlserver-se-13
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier myssisinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 13.00.5426.0.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --domain-iam-role-name my-directory-iam-role ^
      --domain my-domain-id ^
      --option-group-name ssis-se-2016 ^
      --db-parameter-group-name ssis-sqlserver-se-13
  ```

**修改实例并关联 SSIS 选项组和参数组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier myssisinstance \
      --option-group-name ssis-se-2016 \
      --db-parameter-group-name ssis-sqlserver-se-13 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier myssisinstance ^
      --option-group-name ssis-se-2016 ^
      --db-parameter-group-name ssis-sqlserver-se-13 ^
      --apply-immediately
  ```

### 启用 S3 集成
<a name="SSIS.EnableS3"></a>

要将 SSIS 项目 (.ispac) 文件下载到主机以进行部署，请使用 S3 文件集成。有关更多信息，请参阅 [将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)。

# SSISDB 上的管理权限
<a name="SSIS.Permissions"></a>

如果使用 SSIS 选项创建或修改实例，则结果是一个 SSISDB 数据库，其中包含向主用户授予的 ssis\$1admin 和 ssis\$1logreader 角色。在 SSISDB 中，主用户有权执行以下操作：
+ 更改 ssis\$1admin 角色
+ 更改 ssis\$1logreader 角色
+ 更改任何用户

由于主用户是经 SQL 身份验证的用户，因此，您不能使用主用户执行 SSIS 程序包。主用户可以使用这些权限创建新的 SSISDB 用户并将这些用户添加到 ssis\$1admin 和 ssis\$1logreader 角色。这样做对于向域用户授予访问权限以使用 SSIS 非常有用。

## 为 SSIS 设置经 Windows 身份验证的用户
<a name="SSIS.Use.Auth"></a>

主用户可以使用以下代码示例在 SSISDB 中设置经 Windows 身份验证的登录并授予所需的过程权限。执行此操作可向域用户授予权限以部署和运行 SSIS 程序包、使用 S3 文件传输过程、创建凭证以及使用 SQL Server Agent 代理。有关更多信息，请参阅 Microsoft 文档中的[凭证（数据库引擎）](https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/credentials-database-engine?view=sql-server-ver15)和[创建 SQL Server Agent 代理](https://docs.microsoft.com/en-us/sql/ssms/agent/create-a-sql-server-agent-proxy?view=sql-server-ver15)。

**注意**  
您可以根据需要向经 Windows 身份验证的用户授予以下部分或所有权限。

**Example**  

```
-- Create a server-level SQL login for the domain user, if it doesn't already exist
USE [master]
GO
CREATE LOGIN [mydomain\user_name] FROM WINDOWS
GO						
						
-- Create a database-level account for the domain user, if it doesn't already exist						
USE [SSISDB]
GO
CREATE USER [mydomain\user_name] FOR LOGIN [mydomain\user_name]

-- Add SSIS role membership to the domain user
ALTER ROLE [ssis_admin] ADD MEMBER [mydomain\user_name]
ALTER ROLE [ssis_logreader] ADD MEMBER [mydomain\user_name]
GO

-- Add MSDB role membership to the domain user
USE [msdb]
GO
CREATE USER [mydomain\user_name] FOR LOGIN [mydomain\user_name]

-- Grant MSDB stored procedure privileges to the domain user
GRANT EXEC ON msdb.dbo.rds_msbi_task TO [mydomain\user_name] with grant option
GRANT SELECT ON msdb.dbo.rds_fn_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_cancel_task TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_download_from_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_upload_to_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_delete_from_filesystem TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_gather_file_details TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_add_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_update_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_grant_login_to_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_revoke_login_from_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_delete_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_login_for_proxy to [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_proxy_for_subsystem TO [mydomain\user_name]  with grant option
GRANT EXEC ON msdb.dbo.rds_sqlagent_proxy TO [mydomain\user_name] WITH GRANT OPTION


-- Add the SQLAgentUserRole privilege to the domain user
USE [msdb]
GO
ALTER ROLE [SQLAgentUserRole] ADD MEMBER [mydomain\user_name]
GO

-- Grant the ALTER ANY CREDENTIAL privilege to the domain user
USE [master]
GO
GRANT ALTER ANY CREDENTIAL TO [mydomain\user_name]
GO
```

# 部署 SSIS 项目
<a name="SSIS.Deploy"></a>

在 RDS 上，您不能使用 SQL Server Management Studio (SSMS) 或 SSIS 过程直接部署 SSIS 项目。要从 Amazon S3 中下载项目文件并在随后进行部署，请使用 RDS 存储过程。

要运行存储过程，请以您已向其授予运行存储过程的权限的任何用户身份登录。有关更多信息，请参阅“[为 SSIS 设置经 Windows 身份验证的用户](SSIS.Permissions.md#SSIS.Use.Auth)”。

**部署 SSIS 项目**

1. 下载项目 (.ispac) 文件。

   ```
   exec msdb.dbo.rds_download_from_s3
   @s3_arn_of_file='arn:aws:s3:::bucket_name/ssisproject.ispac',
   @rds_file_path='D:\S3\ssisproject.ispac',
   @overwrite_file=1;
   ```

1. 提交部署任务并确保：
   + 该文件夹存在于 SSIS 目录中。
   + 该项目名称与您在开发 SSIS 项目时使用的项目名称匹配。

   ```
   exec msdb.dbo.rds_msbi_task
   @task_type='SSIS_DEPLOY_PROJECT',
   @folder_name='DEMO',
   @project_name='ssisproject',
   @file_path='D:\S3\ssisproject.ispac';
   ```

# 监控部署任务的状态
<a name="SSIS.Monitor"></a>

要跟踪部署任务的状态，请调用 `rds_fn_task_status` 函数。它获取两个参数。第一个参数应该始终为 `NULL`，因为它不适用于 SSIS。第二个参数接受任务 ID。

要查看所有任务的列表，请将第一个参数设置为 `NULL`，将第二个参数设置为 `0`，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

要获取特定任务，请将第一个参数设置为 `NULL`，将第二个参数设置为任务 ID，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 函数将返回以下信息。


| 输出参数 | 描述 | 
| --- | --- | 
| `task_id` | 任务的 ID。 | 
| `task_type` | `SSIS_DEPLOY_PROJECT` | 
| `database_name` | 不适用于 SSIS 任务。 | 
| `% complete` | 用百分比表示的任务进度。 | 
| `duration (mins)` | 在任务上花费的时间 (以分钟为单位)。 | 
| `lifecycle` |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSIS.Monitor.html)  | 
| `task_info` | 有关任务的其他信息。如果在处理过程中发生错误，则此列包含有关错误的信息。 | 
| `last_updated` | 上次更新任务状态的日期和时间。 | 
| `created_at` | 任务的创建日期和时间。 | 
| `S3_object_arn` |  不适用于 SSIS 任务。  | 
| `overwrite_S3_backup_file` | 不适用于 SSIS 任务。 | 
| `KMS_master_key_arn` |  不适用于 SSIS 任务。  | 
| `filepath` |  不适用于 SSIS 任务。  | 
| `overwrite_file` |  不适用于 SSIS 任务。  | 
| `task_metadata` | 与 SSIS 任务关联的元数据。 | 

# 使用 SSIS
<a name="SSIS.Use"></a>

将 SSIS 项目部署到 SSIS 目录中后，您可以直接从 SSMS 运行程序包或使用 SQL Server Agent 安排这些程序包。您必须使用经 Windows 身份验证的登录名来执行 SSIS 程序包。有关更多信息，请参阅“[为 SSIS 设置经 Windows 身份验证的用户](SSIS.Permissions.md#SSIS.Use.Auth)”。

**Topics**
+ [为 SSIS 项目设置数据库连接管理器](#SSIS.Use.ConnMgrs)
+ [创建 SSIS 代理](#SSIS.Use.Proxy)
+ [使用 SQL Server Agent 安排 SSIS 程序包](#SSIS.Use.Schedule)
+ [从代理撤消 SSIS 访问权限](#SSIS.Use.Revoke)

## 为 SSIS 项目设置数据库连接管理器
<a name="SSIS.Use.ConnMgrs"></a>

在使用连接管理器时，可以使用以下类型的身份验证：
+ 对于使用 AWS Managed Active Directory 的本地数据库连接，您可以使用 SQL 身份验证或 Windows 身份验证。对于 Windows 身份验证，请使用 `DB_instance_name.fully_qualified_domain_name` 作为连接字符串的服务器名称。

  以 `myssisinstance.corp-ad.example.com` 为例，其中 `myssisinstance` 是数据库实例名称，`corp-ad.example.com` 是完全限定域名。
+ 对于远程连接，请始终使用 SQL 身份验证。
+ 对于使用自托管式 Active Directory 的本地数据库连接，您可以使用 SQL 身份验证或 Windows 身份验证。对于 Windows 身份验证，请使用 `.` 或 `LocalHost` 作为连接字符串的服务器名称。

## 创建 SSIS 代理
<a name="SSIS.Use.Proxy"></a>

您需要创建 SSIS 凭证和 SSIS 代理，才能使用 SQL Server Agent 安排 SSIS 程序包。以经 Windows 身份验证的用户身份运行这些过程。

**创建 SSIS 凭证**
+ 为代理创建凭证。为此，您可以使用 SSMS 或以下 SQL 语句。

  ```
  USE [master]
  GO
  CREATE CREDENTIAL [SSIS_Credential] WITH IDENTITY = N'mydomain\user_name', SECRET = N'mysecret'
  GO
  ```
**注意**  
`IDENTITY` 必须是经域身份验证的登录名。将 `mysecret` 替换为经域身份验证的登录的密码。  
每当更改 SSISDB 主机时，请更改 SSIS 代理凭证以允许新主机访问它们。

**创建 SSIS 代理**

1. 使用以下 SQL 语句创建代理。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_add_proxy @proxy_name=N'SSIS_Proxy',@credential_name=N'SSIS_Credential',@description=N''
   GO
   ```

1. 使用以下 SQL 语句向其他用户授予对代理的访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSIS_Proxy',@login_name=N'mydomain\user_name'
   GO
   ```

1. 使用以下 SQL 语句向代理授予 SSIS 子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='GRANT_SUBSYSTEM_ACCESS',@proxy_name='SSIS_Proxy',@proxy_subsystem='SSIS'
   GO
   ```

**查看代理和代理上的授权**

1. 使用以下 SQL 语句查看代理的被授权者。

   ```
   USE [msdb]
   GO
   EXEC sp_help_proxy
   GO
   ```

1. 使用以下 SQL 语句查看子系统授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_enum_proxy_for_subsystem
   GO
   ```

## 使用 SQL Server Agent 安排 SSIS 程序包
<a name="SSIS.Use.Schedule"></a>

创建凭证和代理并向 SSIS 授予对代理的访问权限后，您可以创建 SQL Server Agent 作业来安排 SSIS 程序包。

**安排 SSIS 程序包**
+ 您可以使用 SSMS 或 T-SQL 创建 SQL Server Agent 作业。以下示例使用 T-SQL。

  ```
  USE [msdb]
  GO
  DECLARE @jobId BINARY(16)
  EXEC msdb.dbo.sp_add_job @job_name=N'MYSSISJob',
  @enabled=1,
  @notify_level_eventlog=0,
  @notify_level_email=2,
  @notify_level_page=2,
  @delete_level=0,
  @category_name=N'[Uncategorized (Local)]',
  @job_id = @jobId OUTPUT
  GO
  EXEC msdb.dbo.sp_add_jobserver @job_name=N'MYSSISJob',@server_name=N'(local)'
  GO
  EXEC msdb.dbo.sp_add_jobstep @job_name=N'MYSSISJob',@step_name=N'ExecuteSSISPackage',
  @step_id=1,
  @cmdexec_success_code=0,
  @on_success_action=1,
  @on_fail_action=2,
  @retry_attempts=0,
  @retry_interval=0,
  @os_run_priority=0,
  @subsystem=N'SSIS',
  @command=N'/ISSERVER "\"\SSISDB\MySSISFolder\MySSISProject\MySSISPackage.dtsx\"" /SERVER "\"my-rds-ssis-instance.corp-ad.company.com/\"" 
  /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E',
  @database_name=N'master',
  @flags=0,
  @proxy_name=N'SSIS_Proxy'
  GO
  ```

## 从代理撤消 SSIS 访问权限
<a name="SSIS.Use.Revoke"></a>

您可以使用以下存储过程撤消对 SSIS 子系统的访问权限并删除 SSIS 代理。

**撤消访问权限并删除代理**

1. 撤消子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='REVOKE_SUBSYSTEM_ACCESS',@proxy_name='SSIS_Proxy',@proxy_subsystem='SSIS'
   GO
   ```

1. 撤消代理上的授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_revoke_login_from_proxy @proxy_name=N'SSIS_Proxy',@name=N'mydomain\user_name'
   GO
   ```

1. 删除代理。

   ```
   USE [msdb]
   GO
   EXEC dbo.sp_delete_proxy @proxy_name = N'SSIS_Proxy'
   GO
   ```

# 禁用并删除 SSIS 数据库
<a name="SSIS.DisableDrop"></a>

使用以下步骤禁用或删除 SSIS 数据库：

**Topics**
+ [禁用 SSIS](#SSIS.Disable)
+ [删除 SSISDB 数据库](#SSIS.Drop)

## 禁用 SSIS
<a name="SSIS.Disable"></a>

要禁用 SSIS，请从其选项组中删除 `SSIS` 选项。

**重要**  
删除该选项不会删除 SSISDB 数据库，因此，您可以安全地删除该选项，而不会丢失 SSIS 项目。  
您可以在删除后重新启用 `SSIS` 选项，以重用先前部署到 SSIS 目录的 SSIS 项目。

### 控制台
<a name="SSIS.Disable.Console"></a>

以下过程删除 `SSIS` 选项。

**从其选项组中删除 SSIS 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `SSIS` 选项的选项组（在前面的示例中为 `ssis-se-2016`）。

1. 选择 **Delete option (删除选项)**。

1. 在**删除选项**下，为**待删除的选项**选择 **SSIS**。

1. 在 **Apply immediately (立即应用)** 下，选择 **Yes (是)** 可立即删除选项，选择 **No (否)** 可在下次维护时段时删除。

1. 选择**删除**。

### CLI
<a name="SSIS.Disable.CLI"></a>

以下过程删除 `SSIS` 选项。

**从其选项组中删除 SSIS 选项**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name ssis-se-2016 \
      --options SSIS \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name ssis-se-2016 ^
      --options SSIS ^
      --apply-immediately
  ```

## 删除 SSISDB 数据库
<a name="SSIS.Drop"></a>

删除 SSIS 选项后并不会删除 SSISDB 数据库。要删除 SSISDB 数据库，请在删除 SSIS 选项后使用 `rds_drop_ssis_database` 存储过程。

**删除 SSIS 数据库**
+ 使用以下存储过程。

  ```
  USE [msdb]
  GO
  EXEC dbo.rds_drop_ssis_database
  GO
  ```

删除 SSISDB 数据库后，如果您重新启用 SSIS 选项，则会获得一个新的 SSISDB 目录。

# Amazon RDS for SQL Server 中的 SQL Server Reporting Services 支持
<a name="Appendix.SQLServer.Options.SSRS"></a>

Microsoft SQL Server Reporting Services (SSRS) 是一个基于服务器的应用程序，用于生成和分发报告。它是 SQL Server 服务套件的一部分，其中还包括 SQL Server Analysis Services (SSAS) 和 SQL Server Integration Services (SSIS)。SSRS 是在 SQL Server 之上构建的服务。您可以使用它从各种数据源收集数据，并以易于理解和直接可供分析的方式呈现。

Amazon RDS for SQL Server 支持直接在 RDS 数据库实例上运行 SSRS。您可以将 SSR 用于现有或新的数据库实例。

RDS 在以下版本上对于 SQL Server 标准版和企业版支持 SSRS：
+ SQL Server 2022，所有版本
+ SQL Server 2019，版本 15.00.4043.16.v1 和更高版本
+ SQL Server 2017，版本 14.00.3223.3.v1 和更高版本
+ SQL Server 2016，版本 13.00.5820.21.v1 和更高版本

**Contents**
+ [限制和建议](#SSRS.Limitations)
+ [开启 SSRS](SSRS.Enabling.md)
  + [为 SSRS 创建选项组](SSRS.Enabling.md#SSRS.OptionGroup)
  + [将 SSRS 选项添加到选项组](SSRS.Enabling.md#SSRS.Add)
  + [将选项组与数据库实例关联](SSRS.Enabling.md#SSRS.Apply)
  + [允许对 VPC 安全组的入站访问](SSRS.Enabling.md#SSRS.Inbound)
+ [报告服务器数据库](#SSRS.DBs)
+ [SSRS 日志文件](#SSRS.Logs)
+ [访问 SSRS Web 门户](SSRS.Access.md)
  + [在 RDS 上使用 SSL](SSRS.Access.md#SSRS.Access.SSL)
  + [将访问权限授予域用户](SSRS.Access.md#SSRS.Access.Grant)
  + [访问 Web 门户](SSRS.Access.md#SSRS.Access)
+ [部署报告和配置报告数据来源](SSRS.DeployConfig.md)
  + [将报告部署到 SSRS](SSRS.DeployConfig.md#SSRS.Deploy)
  + [配置报告数据来源。](SSRS.DeployConfig.md#SSRS.ConfigureDataSource)
+ [使用 SSRS 电子邮件发送报告](SSRS.Email.md)
+ [撤销系统级权限](SSRS.Access.Revoke.md)
+ [监控任务的状态](SSRS.Monitor.md)
+ [禁用和删除 SSRS 数据库](SSRS.DisableDelete.md)
  + [关闭 SSRS](SSRS.DisableDelete.md#SSRS.Disable)
  + [删除 SSRS 数据库](SSRS.DisableDelete.md#SSRS.Drop)

## 限制和建议
<a name="SSRS.Limitations"></a>

以下限制和建议适用于在 RDS for SQL Server 上运行 SSRS：
+ 您不能在具有只读副本的数据库实例上使用 SSRS。
+ 实例必须使用自行管理的 Active Directory 或 AWS Directory Service for Microsoft Active Directory，才能进行 SSRS Web 门户和 Web 服务器身份验证。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。
+ 您无法备份使用 SSRS 选项创建的报表服务器数据库。
+ 不支持从 SSRS 的其他实例导入和恢复报告服务器数据库。有关更多信息，请参阅 [报告服务器数据库](#SSRS.DBs)。
+ 您无法将 SSRS 配置为侦听默认 SSL 端口 (443)。允许的值为 1150–49511，但不包括 1234、1434、3260、3343、3389 和 47001。
+ 不支持通过 Microsoft Windows 文件共享进行订阅。
+ 不支持使用报告服务配置管理器。
+ 不支持创建和修改角色。
+ 不支持修改报告服务器属性。
+ 未授予系统管理员和系统用户角色。
+ 无法通过 Web 门户编辑系统级角色分配。

# 开启 SSRS
<a name="SSRS.Enabling"></a>

使用以下过程为数据库实例开启 SSRS：

1. 创建新的选项组或选择现有的选项组。

1. 将 `SSRS` 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

1. 允许对 SSRS 侦听器端口的 Virtual Private Cloud (VPC) 安全组进行入站访问。

## 为 SSRS 创建选项组
<a name="SSRS.OptionGroup"></a>

要使用 SSRS，请创建对应于计划使用的 SQL Server 引擎和数据库实例版本的选项组。为此，请使用 AWS 管理控制台或 AWS CLI。

**注意**  
如果现有选项组针对的是正确的 SQL Server 引擎和版本，也可以使用现有选项组。

### 控制台
<a name="SSRS.OptionGroup.Console"></a>

以下过程创建适用于 SQL Server 标准版 2017 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗格中，执行以下操作：

   1. 对于 **Name**（名称），输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **ssrs-se-2017**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **SSRS option group for SQL Server SE 2017**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于**主引擎版本**，选择 **14.00**。

1. 选择**创建**。

### CLI
<a name="SSRS.OptionGroup.CLI"></a>

以下过程创建适用于 SQL Server 标准版 2017 的选项组。

**创建选项组**
+ 运行以下命令之一。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-option-group \
    --option-group-name ssrs-se-2017 \
    --engine-name sqlserver-se \
    --major-engine-version 14.00 \
    --option-group-description "SSRS option group for SQL Server SE 2017"
```
对于：Windows  

```
aws rds create-option-group ^
    --option-group-name ssrs-se-2017 ^
    --engine-name sqlserver-se ^
    --major-engine-version 14.00 ^
    --option-group-description "SSRS option group for SQL Server SE 2017"
```

## 将 SSRS 选项添加到选项组
<a name="SSRS.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `SSRS` 选项添加到您的选项组。

### 控制台
<a name="SSRS.Add.CON"></a>

**添加 SSRS 选项**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择刚创建的选项组，然后选择 **Add Option**（添加选项）。

1. 在**选项详细信息**下，为**选项名称**选择 **SSRS**。

1. 在**选项设置**下，执行以下操作：

   1. 输入 SSRS 服务要侦听的端口。默认值为 8443。有关允许值的列表，请参阅 [限制和建议](Appendix.SQLServer.Options.SSRS.md#SSRS.Limitations)。

   1. 输入**最大内存**的值。

      **最大内存**指定阈值上限，超过该阈值后，不会允许报告服务器应用程序的新内存分配请求。该数字是占数据库实例总内存的百分比。允许的值为 10–80。

   1. 对于 **Security groups (安全组)**，请选择要与选项关联的 VPC 安全组。使用与您数据库实例关联的相同安全组。

1. 要使用 SSRS 电子邮件发送报告，选择 **Email delivery in reporting services**（报告服务中的电子邮件递送）下的 **Configure email delivery options**（配置电子邮件递送选项）复选框，然后执行以下操作：

   1. 对于 **Sender email address**（发件人电子邮件地址），在 SSRS 电子邮件发送的邮件的 **From**（发件人）字段中输入要使用的电子邮件地址。

      指定有权从 SMTP 服务器发送邮件的用户账户。

   1. 对于 **SMTP server**（SMTP 服务器），请指定要使用的 SMTP 服务器或网关。

      它可以是 IP 地址、公司内部网中计算机的 NetBIOS 名称或完全限定域名。

   1. 对于 **SMTP port**（SMTP 端口），输入要用于连接到邮件服务器的端口。默认值为 25。

   1. 要使用身份验证：

      1. 选择 **Use authentication**（使用身份验证）复选框。

      1. 对于 **Secret Amazon Resource Name (ARN)** [密钥 Amazon 资源名称（ARN）]，输入用户凭证的 AWS Secrets Manager ARN。

         使用以下格式：

         **arn:aws:secretsmanager:*Region*:*AccountId*:secret:*SecretName*-*6RandomCharacters***

         例如：

         **arn:aws:secretsmanager:*us-west-2*:*123456789012*:secret:*MySecret-a1b2c3***

         有关创建密钥的更多信息，请参阅[使用 SSRS 电子邮件发送报告](SSRS.Email.md)。

   1. 选中 **Use Secure Sockets Layer (SSL)** [使用安全套接字层 (SSL)] 复选框可使用 SSL 加密电子邮件。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

### CLI
<a name="SSRS.Add.CLI"></a>

**添加 SSRS 选项**

1. 创建 JSON 文件，例如：`ssrs-option.json`。

   1. 设置以下必需参数：
      + `OptionGroupName` – 您之前创建或选择的选项组的名称（以下示例中的 `ssrs-se-2017`）。
      + `Port` – SSRS 服务要侦听的端口。默认值为 8443。有关允许值的列表，请参阅 [限制和建议](Appendix.SQLServer.Options.SSRS.md#SSRS.Limitations)。
      + `VpcSecurityGroupMemberships` – RDS 数据库实例的 VPC 安全组成员。
      + `MAX_MEMORY` – 阈值上限，超过该阈值后，不会允许报告服务器应用程序的新内存分配请求。该数字是占数据库实例总内存的百分比。允许的值为 10–80。

   1. （可选）设置以下参数以使用 SSRS 电子邮件：
      + `SMTP_ENABLE_EMAIL` – 设置为 `true` 以使用 SSRS 电子邮件。默认值为 `false`。
      + `SMTP_SENDER_EMAIL_ADDRESS` – SSRS 电子邮件发送的邮件的 **From**（发件人）字段中要使用的电子邮件地址。指定有权从 SMTP 服务器发送邮件的用户账户。
      + `SMTP_SERVER` – 要使用的 SMTP 服务器或网关。它可以是 IP 地址、公司内部网中计算机的 NetBIOS 名称或完全限定域名。
      + `SMTP_PORT` – 用于连接到邮件服务器的端口。默认值为 25。
      + `SMTP_USE_SSL` – 设置为 `true` 以使用 SSL 加密电子邮件。默认值为 `true`。
      + `SMTP_EMAIL_CREDENTIALS_SECRET_ARN` – 用于保存用户凭证的 Secrets Manager ARN。采用以下格式：

        **arn:aws:secretsmanager:*Region*:*AccountId*:secret:*SecretName*-*6RandomCharacters***

        有关创建密钥的更多信息，请参阅[使用 SSRS 电子邮件发送报告](SSRS.Email.md)。
      + `SMTP_USE_ANONYMOUS_AUTHENTICATION` – 设置为 `true`，如果不想使用身份验证，则不包括 `SMTP_EMAIL_CREDENTIALS_SECRET_ARN`。

        当 `SMTP_ENABLE_EMAIL` 为 `true` 时，原定设置值为 `false`。

   以下示例包含使用密钥 ARN 的 SSRS 电子邮件参数。

   ```
   {
   "OptionGroupName": "ssrs-se-2017",
   "OptionsToInclude": [
   	{
   	"OptionName": "SSRS",
   	"Port": 8443,
   	"VpcSecurityGroupMemberships": ["sg-0abcdef123"],
   	"OptionSettings": [
               {"Name": "MAX_MEMORY","Value": "60"},
               {"Name": "SMTP_ENABLE_EMAIL","Value": "true"}
               {"Name": "SMTP_SENDER_EMAIL_ADDRESS","Value": "nobody@example.com"},
               {"Name": "SMTP_SERVER","Value": "email-smtp.us-west-2.amazonaws.com"},
               {"Name": "SMTP_PORT","Value": "25"},
               {"Name": "SMTP_USE_SSL","Value": "true"},
               {"Name": "SMTP_EMAIL_CREDENTIALS_SECRET_ARN","Value": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret-a1b2c3"}
               ]
   	}],
   "ApplyImmediately": true
   }
   ```

1. 将 `SSRS` 选项添加到该选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
       --cli-input-json file://ssrs-option.json \
       --apply-immediately
   ```

   对于：Windows

   ```
   aws rds add-option-to-option-group ^
       --cli-input-json file://ssrs-option.json ^
       --apply-immediately
   ```

## 将选项组与数据库实例关联
<a name="SSRS.Apply"></a>

使用 AWS 管理控制台 或 AWS CLI 将您的选项组与数据库实例关联。

如果您使用现有数据库实例，则该实例必须已经关联了 Active Directory 域和 AWS Identity and Access Management (IAM) 角色。如果您创建新实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

### 控制台
<a name="SSRS.Apply.Console"></a>

您可将您的选项组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时关联选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请修改实例并关联新选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="SSRS.Apply.CLI"></a>

您可将您的选项组与新的或现有的数据库实例关联。

**创建使用选项组的数据库实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier myssrsinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 14.00.3223.3.v1 \
      --allocated-storage 100 \
      --manage-master-user-password  \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --domain-iam-role-name my-directory-iam-role \
      --domain my-domain-id \
      --option-group-name ssrs-se-2017
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier myssrsinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 14.00.3223.3.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --domain-iam-role-name my-directory-iam-role ^
      --domain my-domain-id ^
      --option-group-name ssrs-se-2017
  ```

**修改数据库实例以使用选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier myssrsinstance \
      --option-group-name ssrs-se-2017 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier myssrsinstance ^
      --option-group-name ssrs-se-2017 ^
      --apply-immediately
  ```

## 允许对 VPC 安全组的入站访问
<a name="SSRS.Inbound"></a>

要允许对与您数据库实例关联的 VPC 安全组的入站访问，请为指定的 SSRS 侦听器端口创建入站规则。有关设置安全组的更多信息，请参阅[通过创建安全组提供对 VPC 中的数据库实例的访问](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

## 报告服务器数据库
<a name="SSRS.DBs"></a>

当数据库实例与 SSRS 选项关联时，将在数据库实例上创建两个新的数据库：
+ `rdsadmin_ReportServer`
+ `rdsadmin_ReportServerTempDB`

这些数据库充当 ReportServer 和 ReportServerTempDB 数据库。SSRS 将其数据存储在 ReportServer 数据库中，并将其数据缓存在 ReportServerTempDB 数据库中。有关更多信息，请参阅 Microsoft 文档中的[报表服务器数据库](https://learn.microsoft.com/en-us/sql/reporting-services/report-server/report-server-database-ssrs-native-mode?view=sql-server-ver15)。

RDS 拥有和管理这些数据库，因此不允许对它们进行 ALTER 和 DROP 等数据库操作。不允许访问 `rdsadmin_ReportServerTempDB` 数据库。但是，您可以对 `rdsadmin_ReportServer` 数据库执行读取操作。

## SSRS 日志文件
<a name="SSRS.Logs"></a>

您可以列出、查看并下载 SSRS 日志文件。SSRS 日志文件遵循 ReportServerService\$1*timestamp*.log 的命名约定。这些报表服务器日志位于 `D:\rdsdbdata\Log\SSRS` 目录中。（`D:\rdsdbdata\Log` 目录也是错误日志和 SQL Server 代理日志的父目录。） 有关更多信息，请参阅 [查看和列出数据库日志文件](USER_LogAccess.Procedural.Viewing.md)。

对于现有 SSRS 实例，可能需要重启 SSRS 服务才能访问报表服务器日志。可以通过更新 `SSRS` 选项来重启服务。

有关更多信息，请参阅 [使用 Amazon RDS for Microsoft SQL Server 日志](Appendix.SQLServer.CommonDBATasks.Logs.md)。

# 访问 SSRS Web 门户
<a name="SSRS.Access"></a>

使用以下过程访问 SSRS Web 门户：

1. 开启安全套接字层（SSL）。

1. 将访问权限授予域用户。

1. 使用浏览器和域用户凭证访问 Web 门户。

## 在 RDS 上使用 SSL
<a name="SSRS.Access.SSL"></a>

SSRS 为其连接使用 HTTPS SSL 协议。若要使用此协议，请将 SSL 证书导入客户端计算机上的 Microsoft Windows 操作系统。

有关 SSL 证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。有关将 SSL 与 SQL Server 一起使用的更多信息，请参阅[将 SSL 与 Microsoft SQL Server 数据库实例结合使用](SQLServer.Concepts.General.SSL.Using.md)。

## 将访问权限授予域用户
<a name="SSRS.Access.Grant"></a>

在新的 SSRS 激活中，SSRS 中没有角色分配。为了授予域用户或用户组访问 Web 门户的访问权限，RDS 提供了一个存储过程。

**向 Web 门户上的域用户授予访问权限**
+ 使用以下存储过程。

  ```
  exec msdb.dbo.rds_msbi_task
  @task_type='SSRS_GRANT_PORTAL_PERMISSION',
  @ssrs_group_or_username=N'AD_domain\user';
  ```

向域用户或用户组授予 `RDS_SSRS_ROLE` 系统角色。此角色授予了以下系统级任务：
+ 运行报告
+ 管理作业。
+ 管理共享计划
+ 查看共享计划

还授予根文件夹上 `Content Manager` 的项目级角色。

## 访问 Web 门户
<a name="SSRS.Access"></a>

`SSRS_GRANT_PORTAL_PERMISSION` 任务成功完成后，您具有使用 Web 浏览器访问门户的权限。Web 门户 URL 的格式如下。

```
https://rds_endpoint:port/Reports
```

在此格式中，以下项适用：
+ *`rds_endpoint`* – 与 SSRS 一起使用的 RDS 数据库实例的终端节点。

  您可以在数据库实例的**连接和安全性**选项卡上找到终端节点。有关更多信息，请参阅“[连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)”。
+ `port` – 您在 `SSRS` 选项中设置的 SSRS 侦听器端口。

**访问 Web 门户**

1. 在浏览器中输入 Web 门户网址。

   ```
   https://myssrsinstance.cg034itsfake.us-east-1.rds.amazonaws.com:8443/Reports
   ```

1. 使用您通过 `SSRS_GRANT_PORTAL_PERMISSION` 任务授予访问权限的域用户的凭证登录。

# 部署报告和配置报告数据来源
<a name="SSRS.DeployConfig"></a>

使用以下过程将报告部署到 SSRS 并配置报告数据来源：

**Topics**
+ [将报告部署到 SSRS](#SSRS.Deploy)
+ [配置报告数据来源。](#SSRS.ConfigureDataSource)

## 将报告部署到 SSRS
<a name="SSRS.Deploy"></a>

访问 Web 门户后，您可以将报告部署到其中。您可以使用 Web 门户中的上传工具来上传报告，或直接从 [SQL Server Data Tools (SSDT)](https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt) 部署。从 SSDT 部署时，请确保以下各项：
+ 启动 SSDT 的用户可以访问 SSRS Web 门户。
+ SSRS 项目属性中的 `TargetServerURL` 值设置为带 `ReportServer` 后缀的 RDS 数据库实例的 HTTPS 终端节点，例如：

  ```
  https://myssrsinstance.cg034itsfake.us-east-1.rds.amazonaws.com:8443/ReportServer
  ```

## 配置报告数据来源。
<a name="SSRS.ConfigureDataSource"></a>

将报告部署到 SSRS 后，应配置报告数据来源。配置报告数据来源时，请确保满足以下条件：
+ 对于已加入 AWS Directory Service for Microsoft Active Directory 的 RDS for SQL Server 数据库实例，使用完全限定域名（FQDN）作为连接字符串的数据来源名称。以 `myssrsinstance.corp-ad.example.com` 为例，其中 `myssrsinstance` 是数据库实例名称，`corp-ad.example.com` 是完全限定域名。
+ 对于已加入自行管理的 Active Directory 的 RDS for SQL Server 数据库实例，请使用 `.` 或 `LocalHost` 作为连接字符串的数据来源名称。

# 使用 SSRS 电子邮件发送报告
<a name="SSRS.Email"></a>

SSRS 包括 SSRS 电子邮件扩展，您可以使用它向用户发送报告。

要配置 SSRS 电子邮件，请使用 `SSRS` 选项设置。有关更多信息，请参阅 [将 SSRS 选项添加到选项组](SSRS.Enabling.md#SSRS.Add)。

配置 SSRS 电子邮件后，您可以在报告服务器上订阅报表。有关更多信息，请参阅 Microsoft 文档中的[报告服务中的电子邮件递送](https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/e-mail-delivery-in-reporting-services)。

与 AWS Secrets Manager 集成是 SSRS 电子邮件在 RDS 上运行所必需的。要与 Secrets Manager 集成，您需要创建密钥。

**注意**  
如果您稍后更改密钥，则还必须更新选项组中的 `SSRS` 选项。

**为 SSRS 电子邮件创建密钥**

1. 按照《AWS Secrets Manager 用户指南》**中[创建密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)的步骤操作。

   1. 对于**选择密钥类型**，选择**其他密钥类型**。

   1. 对于 **Key/value pairs**（键值对），输入以下内容：
      + **SMTP\$1USERNAME** – 输入有权从 SMTP 服务器发送邮件的用户。
      + **SMTP\$1PASSWORD** – 输入 SMTP 用户的密码。

   1. 对于 **Encryption key**（加密密钥），不要使用原定设置 AWS KMS key。使用您自己的现有密钥，或创建新密钥。

      KMS 密钥策略必须允许 `kms:Decrypt` 操作，例如：

      ```
      {
          "Sid": "Allow use of the key",
          "Effect": "Allow",
          "Principal": {
              "Service": [
                  "rds.amazonaws.com"
              ]
          },
          "Action": [
              "kms:Decrypt"
          ],
          "Resource": "*"
      }
      ```

1. 按照《AWS Secrets Manager 用户指南》**中的[将权限策略附加到密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_resource-policies.html)中的步骤进行操作。权限策略将 `secretsmanager:GetSecretValue` 操作提供给 `rds.amazonaws.com` 服务主体。

   我们建议您在策略中使用 `aws:sourceAccount` 和 `aws:sourceArn` 条件，以避免出现*混淆代理人*问题。将您的 AWS 账户用于 `aws:sourceAccount`，并将选项组 ARN 用于 `aws:sourceArn`。有关更多信息，请参阅 [防范跨服务混淆代理问题](cross-service-confused-deputy-prevention.md)。

   下面显示了一个示例权限策略。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement" : [ {
       "Effect" : "Allow",
       "Principal" : {
         "Service" : "rds.amazonaws.com"
       },
       "Action" : "secretsmanager:GetSecretValue",
       "Resource" : "*",
       "Condition" : {
         "StringEquals" : {
           "aws:sourceAccount" : "123456789012"
         },
         "ArnLike" : {
           "aws:sourceArn" : "arn:aws:rds:us-west-2:123456789012:og:ssrs-se-2017"
         }
       }
     } ]
   }
   ```

------

   有关更多示例，请参阅《AWS Secrets Manager 用户指南》**中的 [AWS Secrets Manager 的权限策略示例](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples.html)。

# 撤销系统级权限
<a name="SSRS.Access.Revoke"></a>

`RDS_SSRS_ROLE` 系统角色没有足够的权限来删除系统级角色分配。要从 `RDS_SSRS_ROLE` 中删除用户或用户组，请使用在授予角色时使用的相同存储过程，但使用 `SSRS_REVOKE_PORTAL_PERMISSION` 任务类型。

**撤消域用户对 Web 门户的访问权限**
+ 使用以下存储过程。

  ```
  exec msdb.dbo.rds_msbi_task
  @task_type='SSRS_REVOKE_PORTAL_PERMISSION',
  @ssrs_group_or_username=N'AD_domain\user';
  ```

执行此操作将从 `RDS_SSRS_ROLE` 系统角色中删除用户。如果用户有 `Content Manager` 项目级角色，则还会从其中删除该用户。

# 监控任务的状态
<a name="SSRS.Monitor"></a>

要跟踪您的授予或撤消任务的状态，请调用 `rds_fn_task_status` 函数。它获取两个参数。第一个参数应该始终为 `NULL`，因为它不适用于 SSRS。第二个参数接受任务 ID。

要查看所有任务的列表，请将第一个参数设置为 `NULL`，将第二个参数设置为 `0`，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

要获取特定任务，请将第一个参数设置为 `NULL`，将第二个参数设置为任务 ID，如以下示例所示。

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 函数将返回以下信息。


| 输出参数 | 描述 | 
| --- | --- | 
| `task_id` | 任务的 ID。 | 
| `task_type` | 对于 SSRS，任务可以具有以下任务类型： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSRS.Monitor.html)  | 
| `database_name` | 不适用于 SSRS 任务。 | 
| `% complete` | 用百分比表示的任务进度。 | 
| `duration (mins)` | 在任务上花费的时间 (以分钟为单位)。 | 
| `lifecycle` |  任务的状态。有以下可能状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SSRS.Monitor.html)  | 
| `task_info` | 有关任务的其他信息。如果在处理过程中发生错误，则此列包含有关错误的信息。 | 
| `last_updated` | 上次更新任务状态的日期和时间。 | 
| `created_at` | 任务的创建日期和时间。 | 
| `S3_object_arn` |  不适用于 SSRS 任务。  | 
| `overwrite_S3_backup_file` | 不适用于 SSRS 任务。 | 
| `KMS_master_key_arn` |  不适用于 SSRS 任务。  | 
| `filepath` |  不适用于 SSRS 任务。  | 
| `overwrite_file` |  不适用于 SSRS 任务。  | 
| `task_metadata` | 与 SSRS 任务关联的元数据。 | 

# 禁用和删除 SSRS 数据库
<a name="SSRS.DisableDelete"></a>

使用以下过程禁用 SSRS 并删除 SSRS 数据库：

**Topics**
+ [关闭 SSRS](#SSRS.Disable)
+ [删除 SSRS 数据库](#SSRS.Drop)

## 关闭 SSRS
<a name="SSRS.Disable"></a>

要关闭 SSRS，请从其选项组中删除 `SSRS` 选项。删除该选项不会删除 SSRS 数据库。有关更多信息，请参阅 [删除 SSRS 数据库](#SSRS.Drop)。

您可以通过重新添加 `SSRS` 选项以再次开启 SSRS。如果您还删除了 SSRS 数据库，则在同一数据库实例上重新添加此选项会创建新的报告服务器数据库。

### 控制台
<a name="SSRS.Disable.Console"></a>

**从其选项组中删除 SSRS 选项**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `SSRS` 选项的选项组（在前面的示例中为 `ssrs-se-2017`）。

1. 选择 **Delete option (删除选项)**。

1. 在**删除选项**下，为**待删除的选项**选择 **SSRS**。

1. 在 **Apply immediately (立即应用)** 下，选择 **Yes (是)** 可立即删除选项，选择 **No (否)** 可在下次维护时段时删除。

1. 选择**删除**。

### CLI
<a name="SSRS.Disable.CLI"></a>

**从其选项组中删除 SSRS 选项**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name ssrs-se-2017 \
      --options SSRS \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name ssrs-se-2017 ^
      --options SSRS ^
      --apply-immediately
  ```

## 删除 SSRS 数据库
<a name="SSRS.Drop"></a>

删除 `SSRS` 选项不会删除报告服务器数据库。要删除数据库，请使用以下存储过程。

要删除报表服务器数据库，请务必先删除 `SSRS` 选项。

**删除 SSRS 数据库**
+ 使用以下存储过程。

  ```
  exec msdb.dbo.rds_drop_ssrs_databases
  ```

# RDS for SQL Server 中的 Microsoft 分布式事务处理协调器支持
<a name="Appendix.SQLServer.Options.MSDTC"></a>

*分布式事务*是涉及两个或多个网络主机的数据库事务。RDS for SQL Server 支持在主机之间存在分布式事务，其中一个主机可以是以下之一：
+ RDS for SQL Server DB 实例
+ 本地 SQL Server 主机
+ 安装了 SQL Server 的 Amazon EC2 主机
+ 具有支持分布式事务的数据库引擎的任何其他 EC2 主机或 RDS 数据库实例

在 RDS 中，从 SQL Server 2012（版本 11.00.5058.0.v1 及更高版本）开始，RDS for SQL Server 的所有版本都支持分布式事务。该支持使用 Microsoft 分布式事务处理协调器 (MSDTC) 提供。有关 MSDTC 的详细信息，请参阅 Microsoft 文档中的[分布式事务处理协调器](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms684146(v=vs.85))。

**Contents**
+ [限制](#Appendix.SQLServer.Options.MSDTC.Limitations)
+ [启用 MSDTC](Appendix.SQLServer.Options.MSDTC.Enabling.md)
  + [为 MSDTC 创建选项组](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.OptionGroup)
  + [将 MSDTC 选项添加到选项组](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Add)
  + [为 MSDTC 创建参数组](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.CreateParamGroup)
  + [修改 MSDTC 的参数](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)
  + [将选项组和参数组与数据库实例关联](Appendix.SQLServer.Options.MSDTC.Enabling.md#MSDTC.Apply)
  + [修改 MSDTC 选项](Appendix.SQLServer.Options.MSDTC.Enabling.md#Appendix.SQLServer.Options.MSDTC.Modify)
+ [使用事务](#Appendix.SQLServer.Options.MSDTC.Using)
  + [使用分布式事务](#Appendix.SQLServer.Options.MSDTC.UsingXA)
  + [使用 XA 事务](#MSDTC.XA)
  + [使用事务跟踪](#MSDTC.Tracing)
+ [禁用 MSDTC](Appendix.SQLServer.Options.MSDTC.Disable.md)
+ [RDS for SQL Server 的 MSDTC 故障排除](Appendix.SQLServer.Options.MSDTC.Troubleshooting.md)

## 限制
<a name="Appendix.SQLServer.Options.MSDTC.Limitations"></a>

以下限制适用于在 RDS for SQL Server 上使用 MSDTC：
+ 使用 SQL Server 数据库镜像的实例上不支持 MSDTC。有关详细信息，请参阅[事务 – 可用性组和数据库镜像](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-ver15#non-support-for-distributed-transactions)。
+ `in-doubt xact resolution` 参数必须设置为 1 或 2。有关更多信息，请参阅 [修改 MSDTC 的参数](Appendix.SQLServer.Options.MSDTC.Enabling.md#ModifyParam.MSDTC)。
+ MSDTC 要求参与分布式事务的所有主机都可以使用其主机名进行解析。RDS 会自动为加入域的实例维护此功能。但是，对于独立实例，请确保手动配置 DNS 服务器。
+ SQL Server 2017 版本 14.00.3223.3 及更高版本和 SQL Server 2019 支持 Java Database Connectivity (JDBC) XA 事务。
+ 依赖于 RDS 实例上的客户端动态链接库 (DLL) 的分布式事务不受支持。
+ 不支持使用自定义 XA 动态链接库。

# 启用 MSDTC
<a name="Appendix.SQLServer.Options.MSDTC.Enabling"></a>

使用以下过程为数据库实例启用 MSDTC：

1. 创建新的选项组或选择现有的选项组。

1. 将 `MSDTC` 选项添加到该选项组。

1. 创建新的参数组，或选择现有参数组。

1. 修改参数组以将 `in-doubt xact resolution` 参数设置为 1 或 2。

1. 将选项组和参数组与数据库实例关联。

## 为 MSDTC 创建选项组
<a name="Appendix.SQLServer.Options.MSDTC.OptionGroup"></a>

使用 AWS 管理控制台 或 AWS CLI 创建对应于 SQL Server 引擎和数据库实例版本的选项组。

**注意**  
如果现有选项组针对的是正确的 SQL Server 引擎和版本，也可以使用现有选项组。

### 控制台
<a name="OptionGroup.MSDTC.Console"></a>

以下控制台过程创建适用于 SQL Server 标准版 2016 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗格中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **msdtc-se-2016**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **MSDTC option group for SQL Server SE 2016**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-se**。

   1. 对于**主要引擎版本**，选择 **13.00**。

1. 选择**创建**。

### CLI
<a name="OptionGroup.MSDTC.CLI"></a>

以下示例为 SQL Server 标准版 2016 创建一个选项组。

**创建选项组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name msdtc-se-2016 \
      --engine-name sqlserver-se \
      --major-engine-version 13.00 \
      --option-group-description "MSDTC option group for SQL Server SE 2016"
  ```

  对于 Windows：

  ```
  aws rds create-option-group ^
      --option-group-name msdtc-se-2016 ^
      --engine-name sqlserver-se ^
      --major-engine-version 13.00 ^
      --option-group-description "MSDTC option group for SQL Server SE 2016"
  ```

## 将 MSDTC 选项添加到选项组
<a name="Appendix.SQLServer.Options.MSDTC.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `MSDTC` 选项添加到选项组。

以下选项设置为必需：
+ **端口** – 用于访问 MSDTC 的端口。允许的值为 1150–49151，但不包括 1234、1434、3260、3343、3389 和 47001。默认值是 5000。

  确保在防火墙规则中启用了要使用的端口。此外，请确保根据需要，在与数据库实例关联的安全组的入站和出站规则中启用了此端口。有关更多信息，请参阅 [无法连接到 Amazon RDS 数据库实例](CHAP_Troubleshooting.md#CHAP_Troubleshooting.Connecting)。
+ **Security groups**（安全组）– RDS 数据库实例的 VPC 安全组成员。
+ **身份验证类型** – 主机之间的身份验证模式。支持以下身份验证类型：
  + 双向 – RDS 实例使用集成身份验证双向进行身份验证。如果选择此选项，则与此选项组关联的所有实例都必须加入域。
  + 无 – 主机之间不进行身份验证。我们建议不要在生产环境中使用此模式。
+ **事务日志大小** – MSDTC 事务日志的大小。允许的值为 4–1024 MB。默认大小为 4 MB。

以下选项设置可选：
+ **启用入站连接** – 是否允许指向与此选项组关联的实例的入站 MSDTC 连接。
+ **启用出站连接** – 是否允许来自与此选项组关联的实例的出站 MSDTC 连接。
+ **启用 XA** – 是否允许 XA 事务。有关 XA 协议的更多信息，请参阅 [XA 规范](https://publications.opengroup.org/c193)。
+ **启用 SNA LU** – 是否允许将 SNA LU 协议用于分布式事务。有关 SNA LU 协议支持的更多信息，请参阅 Microsoft 文档中的[管理 IBM CICS LU 6.2 事务](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms685136(v=vs.85))。

### 控制台
<a name="Options.MSDTC.Add.Console"></a>

**添加 MSDTC 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择刚刚创建的选项组。

1. 选择**添加选项**。

1. 在**选项详细信息**下，为**选项名称** 选择 **MSDTC**。

1. 在**选项设置**下：

   1. 对于**端口**，输入访问 MSDTC 的端口号。默认值为 **5000**。

   1. 对于 **Security groups (安全组)**，请选择要与选项关联的 VPC 安全组。

   1. 对于**身份验证类型**，请选择**双向**或**无**。

   1. 对于**事务日志大小**，请输入 4–1024 之间的值。默认值为 **4**。

1. 在**其他配置**下，执行以下操作：

   1. 对于**连接**，根据需要选择**启用入站连接**和**启用出站连接**。

   1. 对于**允许的协议**，根据需要选择**启用 XA** 和**启用 SNA LU**。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

   添加此选项不需要重新启动。

### CLI
<a name="Options.MSDTC.Add.CLI"></a>

**添加 MSDTC 选项**

1. 使用以下必需参数创建 JSON 文件，例如 `msdtc-option.json`：

   ```
   {
   "OptionGroupName":"msdtc-se-2016",
   "OptionsToInclude": [
   	{
   	"OptionName":"MSDTC",
   	"Port":5000,
   	"VpcSecurityGroupMemberships":["sg-0abcdef123"],
   	"OptionSettings":[{"Name":"AUTHENTICATION","Value":"MUTUAL"},{"Name":"TRANSACTION_LOG_SIZE","Value":"4"}]
   	}],
   "ApplyImmediately": true
   }
   ```

1. 将 `MSDTC` 选项添加到该选项组。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws rds add-option-to-option-group \
       --cli-input-json file://msdtc-option.json \
       --apply-immediately
   ```

   对于 Windows：

   ```
   aws rds add-option-to-option-group ^
       --cli-input-json file://msdtc-option.json ^
       --apply-immediately
   ```

   无需重新启动。

## 为 MSDTC 创建参数组
<a name="MSDTC.CreateParamGroup"></a>

为与 SQL Server 版本和数据库实例版本对应的 `in-doubt xact resolution` 参数创建或修改参数组。

### 控制台
<a name="CreateParamGroup.MSDTC.Console"></a>

以下示例为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择**创建参数组**。

1. 在**创建参数组**窗格中，执行以下操作：

   1. 对于**参数组系列**，选择 **sqlserver-se-13.0**。

   1. 对于**组名称**，输入参数组的标识符，如 **msdtc-sqlserver-se-13**。

   1. 对于**描述**，输入 **in-doubt xact resolution**。

1. 选择**创建**。

### CLI
<a name="CreateParamGroup.MSDTC.CLI"></a>

以下示例为 SQL Server 标准版 2016 创建一个参数组。

**创建参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-parameter-group \
      --db-parameter-group-name msdtc-sqlserver-se-13 \
      --db-parameter-group-family "sqlserver-se-13.0" \
      --description "in-doubt xact resolution"
  ```

  对于 Windows：

  ```
  aws rds create-db-parameter-group ^
      --db-parameter-group-name msdtc-sqlserver-se-13 ^
      --db-parameter-group-family "sqlserver-se-13.0" ^
      --description "in-doubt xact resolution"
  ```

## 修改 MSDTC 的参数
<a name="ModifyParam.MSDTC"></a>

修改与 SQL Server 版本和数据库实例版本对应的参数组中的 `in-doubt xact resolution` 参数。

对于 MSDTC，将 `in-doubt xact resolution` 参数设置为以下选项之一：
+ `1` – `Presume commit`。任何 MSDTC 有疑问的事务都假定为已经提交。
+ `2` – `Presume abort`。任何 MSDTC 有疑问的事务都假定为已停止。

有关更多信息，请参阅 Microsoft 文档中的[有疑问的 Xact 解析服务器配置选项](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/in-doubt-xact-resolution-server-configuration-option)。

### 控制台
<a name="ModifyParam.MSDTC.Console"></a>

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择参数组，例如 **msdtc-sqlserver-se-13**。

1. 在**参数**下，从参数列表中筛选 **xact**。

1. 选择 **in-doubt xact resolution (有疑问的 Xact 解析)**。

1. 选择**编辑参数**。

1. 输入 **1** 或 **2**。

1. 选择 **Save changes（保存更改）**。

### CLI
<a name="ModifyParam.MSDTC.CLI"></a>

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

**修改参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-parameter-group \
      --db-parameter-group-name msdtc-sqlserver-se-13 \
      --parameters "ParameterName='in-doubt xact resolution',ParameterValue=1,ApplyMethod=immediate"
  ```

  对于 Windows：

  ```
  aws rds modify-db-parameter-group ^
      --db-parameter-group-name msdtc-sqlserver-se-13 ^
      --parameters "ParameterName='in-doubt xact resolution',ParameterValue=1,ApplyMethod=immediate"
  ```

## 将选项组和参数组与数据库实例关联
<a name="MSDTC.Apply"></a>

您可以使用 AWS 管理控制台 或 AWS CLI 将 MSDTC 选项组和参数组与数据库实例相关联。

### 控制台
<a name="MSDTC.Apply.Console"></a>

您可以将 MSDTC 选项组和参数组与新的或现有的数据库实例相关联。
+ 对于新数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。
**注意**  
如果您使用加入域的现有数据库实例，则该实例必须已经关联了 Active Directory 域和 AWS Identity and Access Management (IAM) 角色。如果您创建新的加入域实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅 [将 AWS Managed Active Directory 用于 RDS for SQL Server](USER_SQLServerWinAuth.md)。

### CLI
<a name="MSDTC.Apply.CLI"></a>

您可以将 MSDTC 选项组和参数组与新的或现有的数据库实例相关联。

**注意**  
如果您使用现有的加入域数据库实例，则该实例必须已经关联了 Active Directory 域和 IAM 角色。如果您创建新的加入域实例，请指定现有的 Active Directory 域和 IAM 角色。有关更多信息，请参阅“[将 AWS Managed Active Directory 用于 RDS for SQL Server](USER_SQLServerWinAuth.md)”。

**使用 MSDTC 选项组和参数组创建数据库实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mydbinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 13.00.5426.0.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li \
      --domain-iam-role-name my-directory-iam-role \
      --domain my-domain-id \
      --option-group-name msdtc-se-2016 \
      --db-parameter-group-name msdtc-sqlserver-se-13
  ```

  对于 Windows：

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 13.00.5426.0.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --domain-iam-role-name my-directory-iam-role ^
      --domain my-domain-id ^
      --option-group-name msdtc-se-2016 ^
      --db-parameter-group-name msdtc-sqlserver-se-13
  ```

**修改数据库实例并关联 MSDTC 选项组和参数组**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mydbinstance \
      --option-group-name msdtc-se-2016 \
      --db-parameter-group-name msdtc-sqlserver-se-13 \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mydbinstance ^
      --option-group-name msdtc-se-2016 ^
      --db-parameter-group-name msdtc-sqlserver-se-13 ^
      --apply-immediately
  ```

## 修改 MSDTC 选项
<a name="Appendix.SQLServer.Options.MSDTC.Modify"></a>

启用 `MSDTC` 选项后，您可以修改其设置。有关如何修改选项设置的信息，请参阅[修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。

**注意**  
对 MSDTC 选项设置的一些更改需要重新启动 MSDTC 服务。此要求可能会影响正在运行的分布式事务。

## 使用事务
<a name="Appendix.SQLServer.Options.MSDTC.Using"></a>

### 使用分布式事务
<a name="Appendix.SQLServer.Options.MSDTC.UsingXA"></a>

在 Amazon RDS for SQL Server 中，您可以按照与本地运行分布式事务相同的方式运行分布式事务：
+ 使用 .NET 框架 `System.Transactions` 可提升事务，它通过将分布式事务的创建推迟到在需要时进行，以此优化分布式事务。

  在这种情况下，提升是自动的，不需要您进行任何干预。如果事务中只有一个资源管理器，则不执行任何提升。有关隐式事务范围的更多信息，请参阅 Microsoft 文档中的[使用事务范围实施隐式事务](https://docs.microsoft.com/en-us/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope)。

  以下 .NET 实施支持可提升事务：
  + 从 ADO.NET 2.0 开始，`System.Data.SqlClient` 支持 SQL Server 的可提升事务。有关更多信息，请参阅 Microsoft 文档中的 [System.Transactions 与 SQL Server 的集成](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/system-transactions-integration-with-sql-server)。
  + ODP.NET 支持 `System.Transactions`。将为在 `TransactionsScope` 范围内与 Oracle Database 11g 发行版 1（版本 11.1）及更高版本建立的第一个连接创建一个本地事务。建立第二个连接时，此事务将自动提升为分布式事务。有关 ODP.NET 中的分布式事务支持的更多信息，请参阅 Microsoft 文档中的 [Microsoft 分布式事务处理协调器集成](https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/ntmts/using-mts-with-oracledb.html)。
+ 使用 `BEGIN DISTRIBUTED TRANSACTION` 语句。有关更多信息，请参阅 Microsoft 文档中的 [BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-distributed-transaction-transact-sql)。

### 使用 XA 事务
<a name="MSDTC.XA"></a>

从 RDS for SQL Server 2017 版本 14.00.3223.3 开始，您可以使用 JDBC 控制分布式事务。当您在 `MSDTC` 选项将 `Enable XA` 选项设置为 `true` 时，RDS 会自动启用 JDBC 事务并授予 `SqlJDBCXAUser` 角色给 `guest` 用户。这允许通过 JDBC 执行分布式事务。有关包括代码示例在内的更多信息，请参阅 Microsoft 文档中的[了解 XA 事务](https://docs.microsoft.com/en-us/sql/connect/jdbc/understanding-xa-transactions)。

### 使用事务跟踪
<a name="MSDTC.Tracing"></a>

RDS 支持控制 MSDTC 事务跟踪并从 RDS 数据库实例下载它们以进行故障排除。您可以通过运行以下 RDS 存储过程来控制事务跟踪会话。

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'trace_action',
[@traceall='0|1'],
[@traceaborted='0|1'],
[@tracelong='0|1'];
```

以下参数是必需参数：
+ `trace_action` – 跟踪操作。它可以是 `START`、`STOP` 或 `STATUS`。

以下参数为可选参数：
+ `@traceall` – 设置为 1 可跟踪所有分布式事务。默认值为 0。
+ `@traceaborted` – 设置为 1 可跟踪已取消的分布式事务。默认值为 0。
+ `@tracelong` – 设置为 1 可跟踪长时间运行的分布式事务。默认值为 0。

**Example 启动跟踪操作示例**  
要启动新的事务跟踪会话，请运行以下示例语句。  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'START',
@traceall='0',
@traceaborted='1',
@tracelong='1';
```
一次只能有一个活动的事务跟踪会话。如果在有跟踪会话处于活动状态时发出了新的跟踪会话 `START` 命令，则返回错误，并且活动的跟踪会话保持不变。

**Example 停止跟踪操作示例**  
要停止事务跟踪会话，请运行以下语句。  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'
```
此语句停止活动的事务跟踪会话，并将事务跟踪数据保存到 RDS 数据库实例上的日志目录中。输出的第一行包含整体结果，后面的行表示操作的详细信息。  
以下是成功跟踪会话停止的示例。  

```
OK: Trace session has been successfully stopped.
Setting log file to: D:\rdsdbdata\MSDTC\Trace\dtctrace.log
Examining D:\rdsdbdata\MSDTC\Trace\msdtctr.mof for message formats,  8 found.
Searching for TMF files on path: (null)
Logfile D:\rdsdbdata\MSDTC\Trace\dtctrace.log:
 OS version    10.0.14393  (Currently running on 6.2.9200)
 Start Time    <timestamp>
 End Time      <timestamp>
 Timezone is   @tzres.dll,-932 (Bias is 0mins)
 BufferSize            16384 B
 Maximum File Size     10 MB
 Buffers  Written      Not set (Logger may not have been stopped).
 Logger Mode Settings (11000002) ( circular paged
 ProcessorCount         1 
Processing completed   Buffers: 1, Events: 3, EventsLost: 0 :: Format Errors: 0, Unknowns: 3
Event traces dumped to d:\rdsdbdata\Log\msdtc_<timestamp>.log
```
您可以使用详细信息查询生成的日志文件的名称。有关从 RDS 数据库实例下载日志文件的更多信息，请参阅 [监控 Amazon RDS 日志文件](USER_LogAccess.md)。  
跟踪会话日志在实例上保留 35 天。任何较旧的跟踪会话日志都会自动删除。

**Example 状态跟踪操作示例**  
要跟踪事务跟踪会话的状态，请运行以下语句。  

```
exec msdb.dbo.rds_msdtc_transaction_tracing 'STATUS'
```
此语句在规则集中将以下内容作为单独的行输出。  

```
OK
SessionStatus: <Started|Stopped>
TraceAll: <True|False>
TraceAborted: <True|False>
TraceLongLived: <True|False>
```
第一行表示操作的整体结果：`OK` 或 `ERROR`，并带有详细信息（如果适用）。后面的行指示有关跟踪会话状态的详细信息：  
+ `SessionStatus` 的值可以是以下值之一：
  + `Started`，有跟踪会话正在运行时。
  + `Stopped`，没有跟踪会话正在运行时。
+ 跟踪会话标志可以是 `True` 或 `False`，具体取决于它们在 `START` 命令中的设置方式。

# 禁用 MSDTC
<a name="Appendix.SQLServer.Options.MSDTC.Disable"></a>

要禁用 MSDTC，请从其选项组中删除 `MSDTC` 选项。

## 控制台
<a name="Options.MSDTC.Disable.Console"></a>

**从其选项组中删除 MSDTC 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `MSDTC` 选项的选项组（在前面的示例中为 `msdtc-se-2016`）。

1. 选择 **Delete option (删除选项)**。

1. 在**删除选项**下，为**待删除的选项**选择 **MSDTC**。

1. 在 **Apply immediately (立即应用)** 下，选择 **Yes (是)** 可立即删除选项，选择 **No (否)** 可在下次维护时段时删除。

1. 选择**删除**。

## CLI
<a name="Options.MSDTC.Disable.CLI"></a>

**从其选项组中删除 MSDTC 选项**
+ 使用以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name msdtc-se-2016 \
      --options MSDTC \
      --apply-immediately
  ```

  对于 Windows：

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name msdtc-se-2016 ^
      --options MSDTC ^
      --apply-immediately
  ```

# RDS for SQL Server 的 MSDTC 故障排除
<a name="Appendix.SQLServer.Options.MSDTC.Troubleshooting"></a>

在某些情况下，您可能无法在客户端计算机上运行的 MSDTC，与在 RDS for SQL Server 数据库实例上运行的 MSDTC 服务之间建立连接。如果是这样，请确保满足以下条件：
+ 与数据库实例关联的安全组的入站规则配置正确。有关更多信息，请参阅“[无法连接到 Amazon RDS 数据库实例](CHAP_Troubleshooting.md#CHAP_Troubleshooting.Connecting)”。
+ 您的客户端计算机配置正确。
+ 客户端计算机上的 MSDTC 防火墙规则已启用。

**配置客户端计算机**

1. 打开**组件服务**。

   或者，在**服务器管理器**中，选择**工具**，然后选择**组件服务**。

1. 展开**组件服务**，展开**计算机**，展开 **我的电脑**，然后展开**分布式事务处理协调器**。

1. 打开 **Local DTC (本地 DTC)** 的上下文（右键单击）菜单，然后选择 **Properties (属性)**。

1. 选择**安全性**选项卡。

1. 选择以下所有选项：
   + **网络 DTC 访问**
   + **允许入站**
   + **允许出站**

1. 确保选择了正确的身份验证模式：
   + **需要双向身份验证** – 客户端计算机与参与分布式事务的其他节点加入到同一个域中，或者在域之间配置了信任关系。
   + **无需身份验证** – 所有其他情况。

1. 选择**确定**以保存您的更改。

1. 如果系统提示您重新启动服务，请选择**是**。

**启用 MSDTC 防火墙规则**

1. 打开 Windows 防火墙，然后选择**高级设置**。

   打开**服务器管理器**，选择**工具**，然后选择**高级安全 Windows 防火墙**。
**注意**  
根据您的操作系统，Windows 防火墙可能称为 Windows Defender 防火墙。

1. 在左侧窗格中选择**入站规则**。

1. 如果尚未启用以下防火墙规则，请启用：
   + **分布式事务处理协调器 (RPC)**
   + **分布式事务处理协调器 (RPC) - EPMAP**
   + **分布式事务处理协调器 (TCP-In)**

1. 关闭 Windows 防火墙。

# 适用于 RDS for SQL Server 的 Microsoft SQL Server 资源调控器
<a name="Appendix.SQLServer.Options.ResourceGovernor"></a>

资源调控器是 SQL Server 企业版的一项功能，可让您精确控制实例资源。它支持您对工作负载如何使用 CPU、内存和物理 I/O 资源设置特定的限制。使用资源调控器，您可以：
+ 通过管理不同工作负载共享实例资源的方式，防止在多租户环境中发生资源垄断
+ 通过为不同的用户和应用程序设置特定的资源限制和优先级，提供可预测的性能

您可以在现有或新的 RDS for SQL Server 数据库实例上启用资源调控器。

资源调控器使用三个基本概念：
+ **资源池**：管理实例物理资源（CPU、内存和 I/O）的容器。您将获得两个内置池（内部和默认），并且可以创建其它自定义池。
+ **工作负载组**：用于存放具有相似特征的数据库会话的容器。每个工作负载组都属于一个资源池。您将获得两个内置工作负载组（内部和默认），并且可以创建其它自定义工作负载组。
+ **分类**：根据用户名、应用程序名称、数据库名称或主机名，确定哪个工作负载组处理传入会话的过程。

有关 SQL Server 中资源调控器功能的更多详细信息，请参阅 Microsoft 文档中的 [Resource Governor](https://learn.microsoft.com/en-us/sql/relational-databases/resource-governor/resource-governor?view=sql-server-ver16)。

**Contents**
+ [支持的版本和区域](#ResourceGovernor.SupportedVersions)
+ [限制和建议](#ResourceGovernor.Limitations)
+ [对 RDS for SQL Server 实例启用 Microsoft SQL Server 资源调控器](ResourceGovernor.Enabling.md)
  + [为 `RESOURCE_GOVERNOR` 创建选项组](ResourceGovernor.Enabling.md#ResourceGovernor.OptionGroup)
  + [将 `RESOURCE_GOVERNOR` 选项添加到选项组](ResourceGovernor.Enabling.md#ResourceGovernor.Add)
  + [将选项组与数据库实例关联](ResourceGovernor.Enabling.md#ResourceGovernor.Apply)
+ [对 RDS for SQL Server 实例使用 Microsoft SQL Server 资源调控器](ResourceGovernor.Using.md)
  + [管理资源池](ResourceGovernor.Using.md#ResourceGovernor.ManageResourcePool)
    + [创建资源池](ResourceGovernor.Using.md#ResourceGovernor.CreateResourcePool)
    + [更改资源池](ResourceGovernor.Using.md#ResourceGovernor.AlterResourcePool)
    + [删除资源池](ResourceGovernor.Using.md#ResourceGovernor.DropResourcePool)
  + [管理工作负载组](ResourceGovernor.Using.md#ResourceGovernor.ManageWorkloadGroups)
    + [创建工作负载组](ResourceGovernor.Using.md#ResourceGovernor.CreateWorkloadGroup)
    + [更改工作负载组](ResourceGovernor.Using.md#ResourceGovernor.AlterWorkloadGroup)
    + [删除工作负载组](ResourceGovernor.Using.md#ResourceGovernor.DropWorkloadGroup)
  + [创建并注册分类器函数](ResourceGovernor.Using.md#ResourceGovernor.ClassifierFunction)
  + [删除分类器函数](ResourceGovernor.Using.md#ResourceGovernor.DropClassifier)
  + [注销分类器函数](ResourceGovernor.Using.md#ResourceGovernor.DeregisterClassifier)
  + [重置统计数据](ResourceGovernor.Using.md#ResourceGovernor.ResetStats)
  + [资源调控器配置更改](ResourceGovernor.Using.md#ResourceGovernor.ConfigChanges)
  + [将 TempDB 绑定到资源池](ResourceGovernor.Using.md#ResourceGovernor.BindTempDB)
  + [解除 TempDB 与资源池的绑定](ResourceGovernor.Using.md#ResourceGovernor.UnbindTempDB)
  + [清理资源调控器](ResourceGovernor.Using.md#ResourceGovernor.Cleanup)
+ [多可用区部署的注意事项](#ResourceGovernor.Considerations)
+ [只读副本的注意事项](#ResourceGovernor.ReadReplica)
+ [使用适用于 RDS for SQL Server 实例的系统视图监控 Microsoft SQL Server 资源调控器](ResourceGovernor.Monitoring.md)
  + [资源池运行时统计数据](ResourceGovernor.Monitoring.md#ResourceGovernor.ResourcePoolStats)
+ [对 RDS for SQL Server 实例禁用 Microsoft SQL Server 资源调控器](ResourceGovernor.Disabling.md)
+ [在 RDS for SQL Server 上配置资源调控器的最佳实践](ResourceGovernor.BestPractices.md)

## 支持的版本和区域
<a name="ResourceGovernor.SupportedVersions"></a>

在所有提供 RDS for SQL Server 的 AWS 区域中，Amazon RDS 对于以下 SQL Server 版本支持资源调控器：
+ SQL Server 2022 开发人员版和企业版
+ SQL Server 2019 企业版
+ SQL Server 2017 企业版
+ SQL Server 2016 企业版

## 限制和建议
<a name="ResourceGovernor.Limitations"></a>

以下限制和建议适用于资源调控器：
+ 版本和服务限制：
  + 仅在 SQL Server 企业版中可用。
  + 资源管理仅限于 SQL Server 数据库引擎。不支持将资源调控器用于分析服务、集成服务和报告服务。
+ 配置限制：
  + 必须使用 Amazon RDS 存储过程来实施所有配置。
  + 不支持原生 DDL 语句和 SQL Server Management Studio GUI 配置。
+ 资源池参数：
  + 不支持以 `rds_` 开头的池名称。
  + 不允许修改内部资源池和默认资源池。
  + 对于用户定义的资源池，不支持以下资源池参数：
    + `MIN_MEMORY_PERCENT`
    + `MIN_CPU_PERCENT`
    + `MIN_IOPS_PER_VOLUME`
    + `AFFINITY`
+ 工作负载组参数：
  + 不支持以 `rds_` 开头的工作负载组名称。
  + 不允许修改内部工作负载组。
  + 对于默认工作负载组：
    + 只可修改 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 参数。
    + 对于默认工作负载组，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。
    + 所有其它参数均已锁定，无法更改。
  + 用户定义的工作负载组支持修改所有参数。
+ 分类器函数限制：
  + 分类器函数根据指定的标准（用户名、数据库、主机或应用程序名称）将连接路由到自定义工作负载组。
  + 支持多达两个用户定义的工作负载组及其各自的路由条件。
  + 将标准与每个组内的 `AND` 条件相结合。
  + 每个工作负载组需要至少一个路由标准。
  + 仅支持上面列出的分类方法。
  + 函数名称必须以 `rg_classifier_` 开头。
  + 如果没有条件匹配，则使用默认组分配。

# 对 RDS for SQL Server 实例启用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Enabling"></a>

通过向 RDS for SQL Server 数据库实例添加 `RESOURCE_GOVERNOR` 选项，启用资源调控器。使用以下过程：

1. 创建新的选项组或选择现有的选项组。

1. 将 `RESOURCE_GOVERNOR` 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

**注意**  
通过选项组启用资源调控器不要求重启。

## 为 `RESOURCE_GOVERNOR` 创建选项组
<a name="ResourceGovernor.OptionGroup"></a>

要启用资源调控器，请创建或修改与您计划使用的 SQL Server 版本和数据库实例版本对应的选项组。要完成此过程，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="ResourceGovernor.OptionGroup.Console"></a>

使用以下过程创建适用于 SQL Server 企业版 2022 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗口中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **resource-governor-ee-2022**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **RESOURCE\$1GOVERNOR option group for SQL Server EE 2022**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-ee**。

   1. 对于**主引擎版本**，选择 **16.00**。

1. 选择**创建**。

### CLI
<a name="ResourceGovernor.OptionGroup.CLI"></a>

以下过程创建适用于 SQL Server 企业版 2022 的选项组。

**创建选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name resource-governor-ee-2022 \
      --engine-name sqlserver-ee \
      --major-engine-version 16.00 \
      --option-group-description "RESOURCE_GOVERNOR option group for SQL Server EE 2022"
  ```

  对于：Windows

  ```
  aws rds create-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --engine-name sqlserver-ee ^
      --major-engine-version 16.00 ^
      --option-group-description "RESOURCE_GOVERNOR option group for SQL Server EE 2022"
  ```

## 将 `RESOURCE_GOVERNOR` 选项添加到选项组
<a name="ResourceGovernor.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `RESOURCE_GOVERNOR` 选项添加到您的选项组。

### 控制台
<a name="ResourceGovernor.Add.Console"></a>

**添加 RESOURCE\$1GOVERNOR 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择您刚创建的选项组（在此示例中为 **resource-governor-ee-2022**）。

1. 选择**添加选项**。

1. 在**选项详细信息**下，对于**选项名称**选择 **RESOURCE\$1GOVERNOR**。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

### CLI
<a name="ResourceGovernor.Add.CLI"></a>

**添加 `RESOURCE_GOVERNOR` 选项。**
+ 将 `RESOURCE_GOVERNOR` 选项添加到该选项组。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name resource-governor-ee-2022 \
      --options "OptionName=RESOURCE_GOVERNOR" \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds add-option-to-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --options "OptionName=RESOURCE_GOVERNOR" ^
      --apply-immediately
  ```

## 将选项组与数据库实例关联
<a name="ResourceGovernor.Apply"></a>

要将 `RESOURCE_GOVERNOR` 选项组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="ResourceGovernor.Apply.Console"></a>

要完成激活资源调控器，请将 `RESOURCE_GOVERNOR` 选项组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="ResourceGovernor.Apply.CLI"></a>

可以将 `RESOURCE_GOVERNOR` 选项组与新的或现有的数据库实例关联。

**使用 `RESOURCE_GOVERNOR` 选项组创建实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mytestsqlserverresourcegovernorinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-ee \
      --engine-version 16.00 \
      --license-model license-included \
      --allocated-storage 100 \
      --master-username admin \
      --master-user-password password \
      --storage-type gp2 \
      --option-group-name resource-governor-ee-2022
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mytestsqlserverresourcegovernorinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-ee ^
      --engine-version 16.00 ^
      --license-model license-included ^
      --allocated-storage 100 ^
      --master-username admin ^
      --master-user-password password ^
      --storage-type gp2 ^
      --option-group-name resource-governor-ee-2022
  ```

**修改实例并关联 `RESOURCE_GOVERNOR` 选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mytestinstance \
      --option-group-name resource-governor-ee-2022 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mytestinstance ^
      --option-group-name resource-governor-ee-2022 ^
      --apply-immediately
  ```

# 对 RDS for SQL Server 实例使用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Using"></a>

在将资源调控器选项添加到选项组后，资源调控器尚未在数据库引擎级别处于活动状态。要完全启用资源调控器，必须使用 RDS for SQL Server 存储过程启用它，并创建所需的资源调控器对象。有关更多信息，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

首先，连接到 SQL Server 数据库，然后调用相应的 RDS for SQL Server 存储过程以完成配置。有关连接到数据库的说明，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

有关如何调用每个存储过程的说明，请参阅以下主题：

**Topics**
+ [管理资源池](#ResourceGovernor.ManageResourcePool)
+ [管理工作负载组](#ResourceGovernor.ManageWorkloadGroups)
+ [创建并注册分类器函数](#ResourceGovernor.ClassifierFunction)
+ [删除分类器函数](#ResourceGovernor.DropClassifier)
+ [注销分类器函数](#ResourceGovernor.DeregisterClassifier)
+ [重置统计数据](#ResourceGovernor.ResetStats)
+ [资源调控器配置更改](#ResourceGovernor.ConfigChanges)
+ [将 TempDB 绑定到资源池](#ResourceGovernor.BindTempDB)
+ [解除 TempDB 与资源池的绑定](#ResourceGovernor.UnbindTempDB)
+ [清理资源调控器](#ResourceGovernor.Cleanup)

## 管理资源池
<a name="ResourceGovernor.ManageResourcePool"></a>

### 创建资源池
<a name="ResourceGovernor.CreateResourcePool"></a>

一旦在选项组上启用了资源调控器，您就可以使用 `rds_create_resource_pool` 创建自定义资源池。这些池可让您将特定百分比的 CPU、内存和 IOPS 分配给不同的工作负载。

**用法**

```
USE [msdb]
EXEC dbo.rds_create_resource_pool    
    @pool_name=value,
    @MAX_CPU_PERCENT=value,
    @CAP_CPU_PERCENT=value,
    @MAX_MEMORY_PERCENT=value,
    @MAX_IOPS_PER_VOLUME=value
```

以下参数为必需参数：
+ `@group_name`：是现有的用户定义工作负载组的名称。
+ `@pool_name`：是资源池的用户定义名称。*pool\$1name* 是字母数字，最多可包含 128 个字符，在数据库引擎实例中必须是唯一的，并且必须符合数据库标识符规则。

以下参数可选：
+ `@MAX_CPU_PERCENT`：指定在出现 CPU 争用时，资源池中的所有请求可获得的最大平均 CPU 带宽。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@CAP_CPU_PERCENT`：指定资源池中的所有请求可获得的 CPU 带宽的硬上限。将最大 CPU 带宽级别限制为与指定的值相同。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_MEMORY_PERCENT`：指定此资源池中的请求可以使用的最大查询工作区内存量。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_IOPS_PER_VOLUME`：指定支持用于资源池的每个磁盘卷的最大每秒 I/O 操作数（IOPS）。支持的 *value* 范围介于 0 到 2^31-1（2147483647）之间。指定 0 可移除池的 IOPS 限制。默认值是 0。

**示例**

使用所有默认值创建资源池的示例：

```
--This creates resource pool 'SalesPool' with all default values
USE [msdb]
EXEC rds_create_resource_pool @pool_name = 'SalesPool';
     
--Apply changes
USE [msdb]
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
     
--Validate configuration
select * from sys.resource_governor_resource_pools
```

使用指定的不同参数创建资源池的示例：

```
--creates resource pool
USE [msdb]
EXEC dbo.rds_create_resource_pool    
@pool_name='analytics',
@MAX_CPU_PERCENT = 30,
@CAP_CPU_PERCENT = 40,
@MAX_MEMORY_PERCENT = 20;
            
--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
    
--Validate configuration
select * from sys.resource_governor_resource_pools
```

### 更改资源池
<a name="ResourceGovernor.AlterResourcePool"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_pool    
    @pool_name=value,
    @MAX_CPU_PERCENT=value,
    @CAP_CPU_PERCENT=value,
    @MAX_MEMORY_PERCENT=value,
    @MAX_IOPS_PER_VOLUME=value;
```

以下参数为必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。Amazon RDS SQL Server 不支持更改默认资源池。

至少必须指定其中一个可选参数：
+ `@MAX_CPU_PERCENT`：指定在出现 CPU 争用时，资源池中的所有请求可获得的最大平均 CPU 带宽。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@CAP_CPU_PERCENT`：指定资源池中的所有请求可获得的 CPU 带宽的硬上限。将最大 CPU 带宽级别限制为与指定的值相同。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_MEMORY_PERCENT`：指定此资源池中的请求可以使用的最大查询工作区内存量。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_IOPS_PER_VOLUME`：指定支持用于资源池的每个磁盘卷的最大每秒 I/O 操作数（IOPS）。支持的 *value* 范围介于 0 到 2^31-1（2147483647）之间。指定 0 可移除池的 IOPS 限制。默认值是 0。

**示例**

```
--This alters resource pool
USE [msdb]
EXEC dbo.rds_alter_resource_pool    
    @pool_name='analytics',
    @MAX_CPU_PERCENT = 10,
    @CAP_CPU_PERCENT = 20,
    @MAX_MEMORY_PERCENT = 50;

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration.
select * from sys.resource_governor_resource_pools
```

### 删除资源池
<a name="ResourceGovernor.DropResourcePool"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_drop_resource_pool    
@pool_name=value;
```

以下参数是必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。

**注意**  
SQL Server 不支持删除内部资源池或默认资源池。

**示例**

```
--This drops resource pool
USE [msdb]
EXEC dbo.rds_drop_resource_pool    
@pool_name='analytics'

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_resource_pools
```

## 管理工作负载组
<a name="ResourceGovernor.ManageWorkloadGroups"></a>

使用 `rds_create_workload_group` 和 `rds_alter_workload_group` 创建和管理的工作负载组支持您为查询组设置重要性级别、内存授予和其它参数。

### 创建工作负载组
<a name="ResourceGovernor.CreateWorkloadGroup"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_create_workload_group 
@group_name = value, 
@IMPORTANCE ={ LOW | MEDIUM | HIGH }, 
@REQUEST_MAX_MEMORY_GRANT_PERCENT =value, 
@REQUEST_MAX_CPU_TIME_SEC = value , 
@REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value, 
@MAX_DOP = value, 
@GROUP_MAX_REQUESTS = value, 
@pool_name = value
```

以下参数为必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。
+ `@group_name`：是现有的用户定义工作负载组的名称。

以下参数可选：
+ `@IMPORTANCE`：指定请求在工作负载组中的相对重要性。默认值为 `MEDIUM`。
+ `@REQUEST_MAX_MEMORY_GRANT_PERCENT`：指定单个请求可以从池中占用的最大查询工作区内存量。*value* 是由 `MAX_MEMORY_PERCENT` 定义的资源池大小的百分比。默认值为 25。
+ `@REQUEST_MAX_CPU_TIME_SEC`：指定批处理请求可以使用的最大 CPU 时间量（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，这意味着无限制。
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC`：指定查询可以等待查询工作区内存中的内存授予变为可用的最长时间（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，此时使用基于查询成本的内部计算来确定最长时间。
+ `@MAX_DOP`：指定并行查询执行的最大并行度 (`MAXDOP`)。支持的 *value* 范围介于 0 到 64 之间。*value* 的默认设置为 0，此时使用全局设置。
+ `@GROUP_MAX_REQUESTS`：指定支持在工作负载组中同时执行的最大请求数。*value* 必须为 0 或正整数。*值*的默认设置为 0，支持无限制的请求。
+ `@pool_name` = 将工作负载组与由 *pool\$1name* 标识的用户定义资源池或 `default` 资源池相关联。如果未提供 *pool\$1name*，则工作负载组将与内置 `default` 池相关联。

**示例**

```
--This creates workload group named 'analytics'
USE msdb;
EXEC dbo.rds_create_workload_group 
    @group_name = 'analytics',
    @IMPORTANCE = 'HIGH',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT = 25, 
    @REQUEST_MAX_CPU_TIME_SEC = 0, 
    @REQUEST_MEMORY_GRANT_TIMEOUT_SEC = 0, 
    @MAX_DOP = 0, 
    @GROUP_MAX_REQUESTS = 0, 
    @pool_name = 'analytics';

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
  
--Validate configuration
select * from sys.resource_governor_workload_groups
```

### 更改工作负载组
<a name="ResourceGovernor.AlterWorkloadGroup"></a>

**用法**

```
EXEC msdb.dbo.rds_alter_workload_group
    @group_name = value,
    @IMPORTANCE = 'LOW|MEDIUM|HIGH',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT = value,
    @REQUEST_MAX_CPU_TIME_SEC = value,
    @REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value,
    @MAX_DOP = value,
    @GROUP_MAX_REQUESTS = value,
    @pool_name = value
```

以下参数为必需参数：
+ `@group_name`：是默认工作负载组或现有的用户定义工作负载组的名称。

**注意**  
仅支持更改默认工作负载组上的 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 参数。对于默认工作负载组，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。在默认工作负载组中不能修改其它参数。可以在用户定义的工作负载组中修改所有参数。

以下参数可选：
+ `@IMPORTANCE`：指定请求在工作负载组中的相对重要性。默认值为 MEDIUM。
+ `@REQUEST_MAX_MEMORY_GRANT_PERCENT`：指定单个请求可以从池中占用的最大查询工作区内存量。*value* 是由 `MAX_MEMORY_PERCENT` 定义的资源池大小的百分比。默认值为 25。在 Amazon RDS 上，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。
+ `@REQUEST_MAX_CPU_TIME_SEC`：指定批处理请求可以使用的最大 CPU 时间量（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，这意味着无限制。
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC`：指定查询可以等待查询工作区内存中的内存授予变为可用的最长时间（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，此时使用基于查询成本的内部计算来确定最长时间。
+ `@MAX_DOP`：指定并行查询执行的最大并行度（MAXDOP）。支持的 *value* 范围介于 0 到 64 之间。*value* 的默认设置为 0，此时使用全局设置。
+ `@GROUP_MAX_REQUESTS`：指定支持在工作负载组中同时执行的最大请求数。*value* 必须为 0 或正整数。*值*的默认设置为 0，支持无限制的请求。
+ `@pool_name`：将工作负载组与由 *pool\$1name* 标识的用户定义资源池相关联。

**示例**

修改默认工作负载组以更改 REQUEST\$1MAX\$1MEMORY\$1GRANT\$1PERCENT 的示例：

```
--Modify default workload group (set memory grant cap to 10%)
USE msdb
EXEC dbo.rds_alter_workload_group    
    @group_name = 'default',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT=10;
    
--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
SELECT * FROM sys.resource_governor_workload_groups WHERE name='default';
```

修改非默认工作负载组的示例：

```
EXEC msdb.dbo.rds_alter_workload_group    
    @group_name = 'analytics',
    @IMPORTANCE = 'HIGH',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT = 30,
    @REQUEST_MAX_CPU_TIME_SEC = 3600,
    @REQUEST_MEMORY_GRANT_TIMEOUT_SEC = 60,
    @MAX_DOP = 4,
    @GROUP_MAX_REQUESTS = 100;

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
```

将非默认工作负载组移到另一个资源池的示例：

```
EXEC msdb.dbo.rds_alter_workload_group    
@group_name = 'analytics',
@pool_name='abc'

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_workload_groups
```

### 删除工作负载组
<a name="ResourceGovernor.DropWorkloadGroup"></a>

**用法**

```
EXEC msdb.dbo.rds_drop_workload_group    
@group_name = value
```

以下参数为必需参数：
+ `@group_name`：是现有的用户定义工作负载组的名称。

**示例**

```
--Drops a Workload Group:
EXEC msdb.dbo.rds_drop_workload_group    
@group_name = 'analytics';

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_workload_groups
```

## 创建并注册分类器函数
<a name="ResourceGovernor.ClassifierFunction"></a>

此过程在主数据库中创建资源调控器分类器函数，该函数根据指定的标准（用户名、数据库、主机或应用程序名称）将连接路由到自定义工作负载组。如果启用了资源调控器并在资源调控器配置中指定了分类器函数，则函数输出将决定用于新会话的工作负载组。在没有分类器函数的情况下，所有会话都归类到 `default` 组。

**设施特点：**
+ 支持多达两个工作负载组及其各自的路由条件。
+ 将标准与每个组内的 `AND` 条件相结合。
+ 每个工作负载组需要至少一个路由标准。
+ 函数名称必须以 `rg_classifier_` 开头。
+ 如果没有条件匹配，则使用默认组分配。

分类器函数具有以下特征和行为：
+ 该函数在服务器作用域（在主数据库中）中定义。
+ 该函数是通过架构绑定定义的。
+ 即使启用了连接池，也会为每个新会话评估该函数。
+ 该函数返回会话的工作负载组上下文。会话分配给分类器在会话生命周期内返回的工作负载组。
+ 如果函数返回 NULL、默认值或不存在的工作负载组的名称，则会话将获得默认的工作负载组上下文。如果函数因任何原因失败，也会为会话提供默认上下文。
+ 可以创建多个分类器函数。但是，SQL Server 支持一次只注册一个分类器函数。
+ 除非使用将函数名称设置为 NULL 的注销过程 (`EXEC dbo.msdb.rds_alter_resource_governor_configuration @deregister_function = 1;`) 来移除分类器状态，或者使用 (`EXEC dbo.msdb.rds_alter_resource_governor_configuration @classifier_function = <function_name>;`) 注册另一个分类器函数，否则无法删除分类器函数
+ 在没有分类器函数的情况下，所有会话都归类到默认组。
+ 在资源调控器配置中引用分类器函数时，您无法修改该函数。不过，您可以修改配置以使用不同的分类器函数。如果要对分类器进行更改，可以考虑创建一对分类器函数。例如，您可以创建 `rg_classifier_a` 和 `rg_classifier_b`。

**用法**

```
EXEC msdb.dbo.rds_create_classifier_function 
@function_name = value,
@workload_group1 = value, 
@user_name1 = value,
@db_name1 = value,
@host_name1 = value, 
@app_name1 = value, 
@workload_group2 = value,
@user_name2 = value,
@db_name2 = value,
@host_name2 = value,
@app_name2 = value
```

以下参数为必需参数：
+ `@function_name`：分类器函数的名称。必须以 `rg_classifier_` 开头
+ `@workload_group1`：第一个工作负载组的名称

以下参数可选：

（必须为组 1 指定其中至少一个标准）
+ `@user_name1`：组 1 的登录名
+ `@db_name1`：组 1 的数据库名称
+ `@host_name1`：组 1 的主机名
+ `@app_name1`：组 1 的应用程序名称

（如果指定组 2，则必须至少提供一个标准）
+ `@workload_group2`：第二个工作负载组的名称
+ `@user_name2`：组 2 的登录名
+ `@db_name2`：组 2 的数据库名称
+ `@host_name2`：组 2 的主机名
+ `@app_name2`：组 2 的应用程序名称

**注意**  
系统账户、数据库、应用程序和主机受到限制。

**示例**

一个工作负载组的基本示例：

```
/*Create a classifier to route all requests from 'PowerBI' app to workload group 
'reporting_group'*/

EXEC msdb.dbo.rds_create_classifier_function
@function_name = 'rg_classifier_a',
@workload_group1 = 'reporting_group',
@app_name1 = 'PowerBI';

--Register the classifier
EXEC msdb.dbo.rds_alter_resource_governor_configuration
@classifier_function = 'rg_classifier_a';

-- Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration

/*Query sys.resource_governor_configuration to validate that resource governor is enabled and is using the classifier function we created and registered*/

use master
go
SELECT OBJECT_SCHEMA_NAME(classifier_function_id) AS classifier_schema_name,
       OBJECT_NAME(classifier_function_id) AS classifier_object_name,
       is_enabled
FROM sys.resource_governor_configuration;
```

## 删除分类器函数
<a name="ResourceGovernor.DropClassifier"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_drop_classifier_function
@function_name = value;
```

以下参数是必需参数：
+ `@function_name`：是现有的用户定义分类器函数的名称

**示例**：

```
EXEC msdb.dbo.rds_drop_classifier_function
@function_name = 'rg_classifier_b';
```

## 注销分类器函数
<a name="ResourceGovernor.DeregisterClassifier"></a>

使用此过程可注销分类器函数。注销该函数后，新的会话将自动分配给默认工作负载组。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration    
@deregister_function = 1;
```

要注销，需要使用以下参数：
+ `@deregister_function` 必须为 1

**示例**：

```
EXEC msdb.dbo.rds_alter_resource_governor_configuration 
    @deregister_function = 1;
GO

-- Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
```

## 重置统计数据
<a name="ResourceGovernor.ResetStats"></a>

资源调控器统计数据是自上次服务器重新启动以来的累积数据。如果您需要从特定时间开始收集统计数据，则可以使用以下 Amazon RDS 存储过程来重置统计数据。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration  
@reset_statistics = 1;
```

要重置统计数据，需要使用以下参数：
+ `@reset_statistics` 必须为 1

## 资源调控器配置更改
<a name="ResourceGovernor.ConfigChanges"></a>

如果未启用资源调控器，则 `rds_alter_resource_governor_configuration` 启用资源调控器。启用资源调控器会产生以下结果：
+ 对新会话执行分类器函数（如果有），并将会话分配给工作负载组。
+ 在资源调控器配置中指定的资源限制将得到遵守和执行。
+ 在资源调控器配置中指定的资源限制将得到遵守和执行。
+ 在启用资源调控器之前存在的请求可能会受到启用资源调控器时所做的任何配置更改的影响。
+ 启用资源调控器之前的现有请求可能会受到启用资源调控器时所做的任何配置更改的影响。
+ 在 RDS for SQL Server 上，必须执行 `EXEC msdb.dbo.rds_alter_resource_governor_configuration` 才能使任何资源调控器配置更改生效。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration
```

## 将 TempDB 绑定到资源池
<a name="ResourceGovernor.BindTempDB"></a>

在 Amazon RDS SQL Server 版本 2019 及更高版本中，您可以使用 `rds_bind_tempdb_metadata_to_resource_pool` 将 tempdb 内存优化型元数据绑定到特定的资源池。

**注意**  
在将 tempdb 元数据绑定到资源池之前，必须启用内存优化型 tempdb 元数据功能。要在 Amazon RDS 上启用此功能，需要使用静态参数 `tempdb metadata memory-optimized`。

在 Amazon RDS 上启用静态参数，并在不进行失效转移的情况下执行重启以使该参数生效：

```
aws rds modify-db-parameter-group \
    --db-parameter-group-name test-sqlserver-ee-2022 \
    --parameters "ParameterName='tempdb metadata memory-optimized',ParameterValue=True,ApplyMethod=pending-reboot"
```

**用法**

```
USE [msdb]
EXEC dbo.rds_bind_tempdb_metadata_to_resource_pool  
@pool_name=value;
```

以下参数是必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。

**注意**  
即使内存优化型 TempDB 元数据功能已启用，此更改也需要在不进行失效转移的情况下重启 sql 服务才能生效。

## 解除 TempDB 与资源池的绑定
<a name="ResourceGovernor.UnbindTempDB"></a>

从资源池中解除绑定 tempdb 内存优化型元数据。

**注意**  
此更改也要求在不进行失效转移的情况下重启 sql 服务才能生效

**用法**

```
USE [msdb]
EXEC dbo.rds_unbind_tempdb_metadata_from_resource_pool
```

## 清理资源调控器
<a name="ResourceGovernor.Cleanup"></a>

此过程将在您从选项组中移除资源调控器选项后，清理所有关联的对象。这将禁用资源调控器，将默认工作负载组恢复为默认设置，移除自定义工作负载组、资源池和分类器函数。

**主要特征**
+ 将默认工作负载组恢复为默认设置
+ 禁用资源调控器
+ 移除自定义工作负载组
+ 移除自定义资源池
+ 删除分类器函数
+ 如果启用，则移除 tempdb 资源池绑定

**重要**  
如果工作负载组上有活动的会话，则此清理可能会出错。要么等待活动的会话完成，要么根据您的业务要求终止活动的会话。建议在维护时段运行此操作。  
如果资源池已绑定到 tempdb，并且尚未在没有进行失效转移的情况下重启，则此清理可能会出错。如果您之前将资源池绑定到 tempdb 或解除了资源池与 tempdb 的绑定，请在不进行失效转移的情况下执行重启以使更改生效。建议在维护时段运行此操作。

**用法**

```
USE [msdb]
EXEC dbo.rds_cleanup_resource_governor
```

## 多可用区部署的注意事项
<a name="ResourceGovernor.Considerations"></a>

RDS for SQL Server 将资源调控器复制到多可用区部署中的辅助实例。您可以验证修改时间以及新的资源调控器上次与辅助实例同步的时间。

使用以下查询来检查复制的 `last_sync_time`：

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

在查询结果中，如果同步时间超过了资源调控器更新或创建时间，则资源调控器将与辅助实例同步。

要执行手动数据库失效转移以确认资源调控器复制，请先等待 `last_sync_time` 进行更新。然后，继续进行多可用区失效转移。

## 只读副本的注意事项
<a name="ResourceGovernor.ReadReplica"></a>
+ 对于与源数据库实例位于同一区域的 SQL Server 副本，请使用与源相同的选项组。对选项组的更改会立即传播到副本，而不考虑其维护时段。
+ 当您创建 SQL Server 跨区域副本时，RDS 会为其创建专用选项组。
+ 您无法从专用选项组中删除 SQL Server 跨区域副本。任何其他数据库实例都无法使用 SQL Server 跨区域副本的专用选项组。
+ 资源调控器选项为非复制的选项。您可以在专用选项组中添加或删除未复制的选项。
+ 提升 SQL Server 跨区域只读副本时，提升后的副本的行为与其他 SQL Server 数据库实例相同，包括其选项的管理。

**注意**  
当在只读副本上使用资源调控器时，在将选项添加到选项组后，您必须手动确保已使用 Amazon RDS 存储过程在只读副本上配置了资源调控器。资源调控器配置不会自动复制到只读副本。此外，只读副本上的工作负载通常与主实例不同。因此，建议根据您的工作负载和实例类型在副本上应用资源配置。您可以在只读副本上独立运行这些 Amazon RDS 存储过程，以便在只读副本上配置资源调控器。

# 使用适用于 RDS for SQL Server 实例的系统视图监控 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Monitoring"></a>

资源调控器统计数据是自上次服务器重新启动以来的累积数据。如果您需要从特定时间开始收集统计数据，则可以使用以下 Amazon RDS 存储过程来重置统计数据：

```
EXEC msdb.dbo.rds_alter_resource_governor_configuration  
@reset_statistics = 1;
```

## 资源池运行时统计数据
<a name="ResourceGovernor.ResourcePoolStats"></a>

对于每个资源池，资源调控器会跟踪 CPU 和内存利用率、内存不足事件、内存授予、I/O 以及其它统计数据。有关更多信息，请参阅 [ sys.dm\$1resource\$1governor\$1resource\$1pools](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-resource-governor-resource-pools-transact-sql?view=sql-server-ver17)。

以下查询返回所有资源池的可用统计数据的子集：

```
SELECT rp.pool_id,
       rp.name AS resource_pool_name,
       wg.workload_group_count,
       rp.statistics_start_time,
       rp.total_cpu_usage_ms,
       rp.target_memory_kb,
       rp.used_memory_kb,
       rp.out_of_memory_count,
       rp.active_memgrant_count,
       rp.total_memgrant_count,
       rp.total_memgrant_timeout_count,
       rp.read_io_completed_total,
       rp.write_io_completed_total,
       rp.read_bytes_total,
       rp.write_bytes_total,
       rp.read_io_stall_total_ms,
       rp.write_io_stall_total_ms
FROM sys.dm_resource_governor_resource_pools AS rp
OUTER APPLY (
            SELECT COUNT(1) AS workload_group_count
            FROM sys.dm_resource_governor_workload_groups AS wg
            WHERE wg.pool_id = rp.pool_id
            ) AS wg;
```

# 对 RDS for SQL Server 实例禁用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Disabling"></a>

在 RDS for SQL Server 上禁用资源调控器后，该服务将停止管理工作负载资源。在禁用资源调控器之前，请查看这会如何影响您的数据库连接和配置。

禁用资源调控器会产生以下结果：
+ 打开新连接时不会执行分类器函数。
+ 新连接会自动分类到默认工作负载组。
+ 所有现有的工作负载组和资源池设置都将重置为其默认值。
+ 达到限制时不会触发任何事件。
+ 可以对资源调控器配置进行更改，但只有在启用资源调控器后，更改才会生效。

要禁用资源调控器，请从其选项组中移除 `RESOURCE_GOVERNOR` 选项。

## 控制台
<a name="ResourceGovernor.Disabling.Console"></a>

以下过程删除 `RESOURCE_GOVERNOR` 选项。

**从其选项组中删除 RESOURCE\$1GOVERNOR 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `RESOURCE_GOVERNOR` 选项的选项组（在前面的示例中为 `resource-governor-ee-2022`）。

1. 选择 **Delete option (删除选项)**。

1. 在**删除选项**下，为**待删除的选项**选择 **RESOURCE\$1GOVERNOR**。

1. 在 **Apply immediately**（立即应用）下，选择 **Yes**（是）可立即删除选项，选择 **No**（否）可在下一个维护时段删除它。

1. 选择**删除**。

## CLI
<a name="ResourceGovernor.Disabling.CLI"></a>

以下过程删除 `RESOURCE_GOVERNOR` 选项。

**从其选项组中删除 RESOURCE\$1GOVERNOR 选项**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name resource-governor-ee-2022 \
      --options RESOURCE_GOVERNOR \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --options RESOURCE_GOVERNOR ^
      --apply-immediately
  ```

# 在 RDS for SQL Server 上配置资源调控器的最佳实践
<a name="ResourceGovernor.BestPractices"></a>

为了控制资源消耗，RDS for SQL Server 支持 Microsoft SQL Server 资源调控器。以下最佳实践有助于您避免常见的配置问题并优化数据库性能。

1. 资源调控器配置存储在 `master` 数据库中。我们建议您始终单独保存资源调控器配置脚本的一个副本。

1. 分类器函数延长了登录处理时间，因此建议避免在分类器中使用复杂的逻辑。过于复杂的函数可能会导致登录延迟或连接超时，包括 Amazon RDS 自动化会话。这可能会影响 Amazon RDS 自动化功能监控实例运行状况的能力。因此，始终建议在生产环境中实现分类器函数之前，先在预生产环境中测试分类器函数。

1. 避免在工作负载组中为 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 设置较高的值（大于 70），因为这会阻止数据库实例为其它并发查询分配足够的内存，从而可能导致内存授予超时错误（错误 8645）。相反，如果将此值设置为过低（小于 1）或设置为 0，则可能会阻止需要内存工作区的查询（例如涉及排序或哈希操作的查询）在用户定义的工作负载组中正常执行。RDS 通过在默认工作负载组上将值限制在 1 到 70 之间，来强制实施这些限制。

1. 要将 tempdb 绑定到资源池，在将内存优化型 tempdb 元数据绑定到池后，池可能会达到其最大设置，并且使用 `tempdb` 的任何查询都可能因内存不足错误而失败。在某些情况下，如果发生内存不足错误，SQL Server 可能会停止。要减少发生这种情况的机会，请将内存池的 `MAX_MEMORY_PERCENT` 设置为较高的值。

# Amazon RDS for Microsoft SQL Server 的常见 DBA 任务
<a name="Appendix.SQLServer.CommonDBATasks"></a>

本部分针对运行 Microsoft SQL Server 数据库引擎的数据库实例，介绍了一些常见 DBA 任务的 Amazon RDS 特定实施。为了让用户获得托管式服务体验，Amazon RDS 未提供对数据库实例的 Shell 访问权限，并且限制对需要高级权限的某些系统程序和表的访问权限。

**注意**  
当使用 SQL Server 数据库实例时，您可以运行脚本以修改新创建的数据库，但不能修改 [model] 数据库 (即用作新数据库模型的数据库)。

**Topics**
+ [访问 Amazon RDS 上 Microsoft SQL Server 数据库实例的临时数据库](SQLServer.TempDB.md)
+ [使用 Database Engine Tuning Advisor 分析 Amazon RDS for SQL Server 数据库实例上的数据库工作负载](Appendix.SQLServer.CommonDBATasks.Workload.md)
+ [将 Amazon RDS for SQL Server 数据库的 `db_owner` 更改为 `rdsa` 账户](Appendix.SQLServer.CommonDBATasks.ChangeDBowner.md)
+ [管理 Amazon RDS for Microsoft SQL Server 的排序规则和字符集](Appendix.SQLServer.CommonDBATasks.Collation.md)
+ [为 Amazon RDS for SQL Server 创建数据库用户](Appendix.SQLServer.CommonDBATasks.CreateUser.md)
+ [确定 Amazon RDS for SQL Server 数据库的恢复模式](Appendix.SQLServer.CommonDBATasks.DatabaseRecovery.md)
+ [确定 Amazon RDS for SQL Server 的上次失效转移时间](Appendix.SQLServer.CommonDBATasks.LastFailover.md)
+ [排查由于日志序列号差异而导致的时间点故障恢复故障](Appendix.SQLServer.CommonDBATasks.PITR-LSN-Gaps.md)
+ [拒绝或支持查看 Amazon RDS for SQL Server 的数据库名称](Appendix.SQLServer.CommonDBATasks.ManageView.md)
+ [在 Amazon RDS for SQL Server 批量加载期间禁用快速插入](Appendix.SQLServer.CommonDBATasks.DisableFastInserts.md)
+ [删除 Amazon RDS for Microsoft SQL Server 数据库实例中的数据库](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)
+ [在多可用区部署中重命名 Amazon RDS for Microsoft SQL Server 数据库](Appendix.SQLServer.CommonDBATasks.RenamingDB.md)
+ [重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)
+ [还原 Amazon RDS for SQL Server 的许可证终止的数据库实例](Appendix.SQLServer.CommonDBATasks.RestoreLTI.md)
+ [将 Amazon RDS for SQL Server 数据库从脱机状态转换为联机状态](Appendix.SQLServer.CommonDBATasks.TransitionOnline.md)
+ [在 Amazon RDS for SQL Server 上使用变更数据捕获](Appendix.SQLServer.CommonDBATasks.CDC.md)
+ [使用 SQL Server Agent for Amazon RDS](Appendix.SQLServer.CommonDBATasks.Agent.md)
+ [使用 Amazon RDS for Microsoft SQL Server 日志](Appendix.SQLServer.CommonDBATasks.Logs.md)
+ [使用 Amazon RDS for SQL Server 的跟踪和转储文件](Appendix.SQLServer.CommonDBATasks.TraceFiles.md)

# 访问 Amazon RDS 上 Microsoft SQL Server 数据库实例的临时数据库
<a name="SQLServer.TempDB"></a>

您现在可以访问 Amazon RDS 上 Microsoft RDS Server 数据库实例的 `tempdb` 数据库。您可以通过 Microsoft SQL Server Management Studio (SSMS) 或任何其他标准 SQL 客户端应用程序，使用 Transact-SQL 在 `tempdb` 上运行代码。有关连接到数据库实例的更多信息，请参阅[连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

向数据库实例的主用户授予对 `CONTROL` 的 `tempdb` 访问权限，以便此用户能够修改 `tempdb` 数据库选项。主用户不是 `tempdb` 数据库的数据库拥有者。如果需要，主用户可以授予其他用户 `CONTROL` 访问权限，使得这些用户也可以修改 `tempdb` 数据库选项。

**注意**  
您可以在 `tempdb` 数据库上运行数据库控制台命令 (DBCC)。

# 修改临时数据库选项
<a name="SQLServer.TempDB.Modifying"></a>

您可以在 Amazon RDS 数据库实例上修改 `tempdb` 数据库的数据库选项。有关可以修改哪些选项的详细信息，请参阅 Microsoft 文档中的[临时数据库](https://msdn.microsoft.com/en-us/library/ms190768%28v=sql.120%29.aspx)。

最大文件大小等数据库选项在您重新启动数据库实例之后会保留。您可以修改数据库选项以优化导入数据时的性能，以及防止存储空间不足。

## 优化导入数据时的性能
<a name="SQLServer.TempDB.Modifying.Import"></a>

在将大量数据导入数据库实例时，如果要优化性能，请将临时数据库的 `SIZE` 和 `FILEGROWTH` 属性设置为较大的数字。有关优化 `tempdb` 的更多信息，请参阅 Microsoft 文档中的[优化临时数据库性能](https://technet.microsoft.com/en-us/library/ms175527%28v=sql.120%29.aspx)。

以下示例说明了将大小设置为 100 GB 并将文件增长设置为 10%。

```
1. alter database[tempdb] modify file (NAME = N'templog', SIZE=100GB, FILEGROWTH = 10%)
```

## 防止存储问题
<a name="SQLServer.TempDB.Modifying.Full"></a>

要防止 `tempdb` 数据库使用所有可用的磁盘空间，请设置 `MAXSIZE` 属性。以下示例说明了将该属性设置为 2048 MB。

```
1. alter database [tempdb] modify file (NAME = N'templog', MAXSIZE = 2048MB)
```

# 缩减临时数据库
<a name="SQLServer.TempDB.Shrinking"></a>

可通过两种方法缩减 Amazon RDS 数据库实例上的 `tempdb` 数据库。可以使用 `rds_shrink_tempdbfile` 过程，也可以设置 `SIZE` 属性。

## 使用 rds\$1shrink\$1tempdbfile 过程
<a name="SQLServer.TempDB.Shrinking.Proc"></a>

您可以使用 Amazon RDS 过程 `msdb.dbo.rds_shrink_tempdbfile` 缩减 `tempdb` 数据库。您只能在具有对 `rds_shrink_tempdbfile` 数据库的 `CONTROL` 访问权限时调用 `tempdb`。在调用 `rds_shrink_tempdbfile` 时，数据库实例不会停机。

`rds_shrink_tempdbfile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
| `@temp_filename` | SYSNAME | — | 必需 | 要缩减的文件的逻辑名称。 | 
| `@target_size` | int | null | 可选 | 文件的新大小 (以 MB 为单位)。 | 

以下示例获取 `tempdb` 数据库的文件的名称。

```
1. use tempdb;
2. GO
3. 
4. select name, * from sys.sysfiles;
5. GO
```

以下示例缩减名为 `tempdb` 的 `test_file` 数据库文件，并请求新的 `10` MB 大小：

```
1. exec msdb.dbo.rds_shrink_tempdbfile @temp_filename = N'test_file', @target_size = 10;
```

## 设置 SIZE 属性
<a name="SQLServer.TempDB.Shrinking.Size"></a>

您也可以通过设置 `tempdb` 属性，然后重新启动数据库实例来缩减 `SIZE` 数据库。有关重新启动数据库实例的更多信息，请参阅[重启数据库实例](USER_RebootInstance.md)。

以下示例说明了将 `SIZE` 属性设置为 1024 MB。

```
1. alter database [tempdb] modify file (NAME = N'templog', SIZE = 1024MB)
```

# 多可用区部署的 TempDB 配置
<a name="SQLServer.TempDB.MAZ"></a>

如果您的 RDS for SQL Server 数据库实例位于使用数据库镜像（DBM）或 Always On 可用性组（AG）的多可用区部署内，请注意以下有关使用 `tempdb` 数据库的注意事项。

您无法将 `tempdb` 数据从主数据库实例复制到辅助数据库实例。当您失效转移到辅助数据库实例时，辅助数据库实例上的 `tempdb` 将为空。

您可以将 `tempdb` 数据库选项的配置（包括其文件大小和自动增长设置）从主数据库实例同步到辅助数据库实例。所有 RDS for SQL Server 版本都支持同步 `tempDB` 配置。您可以使用以下存储过程开启 `tempdb` 配置的自动同步：

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

**重要**  
在使用 `rds_set_system_database_sync_objects` 存储过程之前，请确保已在主数据库实例（而不是辅助数据库实例）上设置了首选 `tempdb` 配置。如果您在辅助数据库实例上更改了配置，则在您开启自动同步时，您的首选 `tempdb` 配置可能会被删除。

您可以使用以下函数来确认是否开启了 `tempdb` 配置的自动同步：

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

开启 `tempdb` 配置自动同步后，将显示 `object_class` 字段的返回值。当它关闭时，不会返回任何值。

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

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

例如，如果您在 01:00 修改 `tempdb` 配置，然后运行 `rds_fn_server_object_last_sync_time` 函数，则为 `last_sync_time` 返回的值应在 01:00 之后，表示发生了自动同步。

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

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

有关 SQL Server Agent 任务复制的更多信息，请参阅[启用 SQL Server Agent 作业复制](Appendix.SQLServer.CommonDBATasks.Agent.md#SQLServerAgent.Replicate)。

除了使用 `rds_set_system_database_sync_objects` 存储过程来确保自动同步 `tempdb` 配置更改之外，还可以使用以下手动方法之一：

**注意**  
我们建议使用 `rds_set_system_database_sync_objects` 存储过程开启 `tempdb` 配置的自动同步。使用自动同步可以防止每次更改 `tempdb` 配置时都需要执行这些手动任务。
+ 首先修改数据库实例并关闭多可用区，然后修改临时数据库，最后重新启用多可用区。此方法不会有任何停机时间。

  有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。
+ 首先在原始主实例中修改 `tempdb`，然后手动执行故障转移，最后在新的主实例中修改 `tempdb`。此方法需要停机。

  有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。

# 使用 Database Engine Tuning Advisor 分析 Amazon RDS for SQL Server 数据库实例上的数据库工作负载
<a name="Appendix.SQLServer.CommonDBATasks.Workload"></a>

Database Engine Tuning Advisor 是 Microsoft 提供的客户端应用程序，用于分析数据库工作负载，并根据您运行的查询种类对 Microsoft SQL Server 数据库提供最佳索引集建议。像 SQL Server Management Studio 一样，在连接到运行 SQL Server 的 Amazon RDS 数据库实例的客户端计算机上运行 Tuning Advisor。客户端计算机可以是在您自有网络内部运行的本地计算机，也可以是在您的 Amazon RDS 数据库实例所在区域中运行的 Amazon EC2 Windows 实例。

本部分介绍如何捕获工作负载供 Tuning Advisor 分析。对于捕获工作负载，这是一个首选过程，因为 Amazon RDS 限制了主机对 SQL Server 实例的访问。有关更多信息，请参阅 Microsoft 文档中的 [Database Engine Tuning Advisor](https://docs.microsoft.com/en-us/sql/relational-databases/performance/database-engine-tuning-advisor)。

要使用 Tuning Advisor，必须为其提供所谓的工作负载。工作负载是一系列 Transact - SQL 语句，它们是针对您要优化的一个或多个数据库上运行的。在优化数据库时，Database Engine Tuning Advisor 会以工作负载输入的形式使用跟踪文件、跟踪表、Transact - SQL 脚本或 XML 文件。在使用 Amazon RDS 时，工作负载可能是客户端计算机上的文件，也可能是客户端计算机可访问的 Amazon RDS for SQL Server 数据库上的数据库表。该文件或表必须包含对您要优化的数据库进行查询的命令，并且这些命令必须是适合重新执行的格式。

为了让 Tuning Advisor 实现最大的效率，工作负载应尽可能真实。您可以通过对数据库实例执行跟踪来生成工作负载文件或表。运行跟踪时，可以在数据库实例上模拟负载，也可以用正常负载运行应用程序。

跟踪方式有两种：客户端跟踪和服务器端跟踪。客户端跟踪的设置比较容易，并且可以在 SQL Server Profiler 中实时观察捕获到的跟踪事件。服务器端跟踪的设置比较复杂，并需要编写一些 Transact - SQL 脚本。此外，因为跟踪会写入 Amazon RDS 数据库实例上的文件中，所以跟踪会占用存储空间。请务必跟踪正在运行的服务器端跟踪所占用的存储空间大小，这点非常重要，因为数据库实例可能会进入存储已满状态，从而会在存储空间不足时不再可用。

对于客户端跟踪，在 SQL Server Profiler 捕获到足量的跟踪数据后，您可以通过以下方式生成工作负载文件：将跟踪保存到本地计算机上的文件中，或保存到客户端计算机可用的数据库实例上的数据库表中。使用客户端跟踪的主要缺点是，在高负载情况下，跟踪可能无法捕获到所有查询。这可能会降低 Database Engine Tuning Advisor 执行的分析的有效性。如果您需要在高负载下运行跟踪并要确保可捕获到跟踪会话期间的所有查询，则应使用服务器端跟踪。

对于服务器端跟踪，您必须将数据库实例上的跟踪文件存储到合适的工作负载文件，您也可以在完成跟踪后将跟踪保存到数据库实例上的表中。您可以使用 SQL Server Profiler 将跟踪保存到本地计算机上的文件，或从数据库实例的跟踪表中读取 Tuning Advisor。

# 在 SQL Server 数据库实例上运行客户端跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.ClientSide"></a>

 **在 SQL Server 数据库实例上运行客户端跟踪** 

1. 启动 SQL Server Profiler。此工具安装在 SQL Server 实例文件夹的“性能工具”文件夹内。要启动客户端跟踪，您必须加载或定义一个跟踪定义模板。

1. 在 SQL Server Profiler 的“File (文件)”菜单中，选择 **New Trace (新跟踪)**。在 **Connect to Server** 对话框中，输入要运行跟踪的数据库的数据库实例终端节点、端口、主用户名和密码。

1. 在 **Trace Properties** 对话框中，输入跟踪名称并选择跟踪定义模板。应用程序附带有默认模板 TSQL\$1Replay。您可以通过编辑此模板来定义跟踪。在 **Trace Properties** 对话框的 **Events Selection** 选项卡下编辑事件和事件信息。

   有关跟踪定义模板及使用 SQL Server Profiler 指定客户端跟踪的详细信息，请参阅 Microsoft 文档中的 [Database Engine Tuning Advisor](https://docs.microsoft.com/en-us/sql/relational-databases/performance/database-engine-tuning-advisor)。

1. 启动客户端跟踪并实时查看在数据库实例上运行的 SQL 查询。

1. 完成跟踪后，在 **File (文件)** 菜单中选择 **Stop Trace (停止跟踪)**。在数据库实例上将结果另存为文件或跟踪表。

# 在 SQL Server 数据库实例上运行服务器端跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.ServerSide"></a>

通过编写脚本创建服务器端跟踪这一过程可能较为复杂，且已超出本文档的讨论范围。本部分包含一些您可以用作示例的示例脚本。与客户端跟踪一样，服务器端跟踪的目的是，创建可通过 Database Engine Tuning Advisor 打开的工作负载文件或跟踪表。

下面显示的是一个简化的示例脚本，用于启动服务器端跟踪并将详细信息捕获到工作负载文件。跟踪最初会将信息保存到 D:\$1RDSDBDATA\$1Log 目录中的 RDSTrace.trc 文件，且会每 100 MB 转换一个跟踪文件，这样，后续的跟踪文件命会依次命名为 RDSTrace\$11.trc、RDSTrace\$12.trc 等。

```
DECLARE @file_name NVARCHAR(245) = 'D:\RDSDBDATA\Log\RDSTrace';
DECLARE @max_file_size BIGINT = 100;
DECLARE @on BIT = 1
DECLARE @rc INT
DECLARE @traceid INT

EXEC @rc = sp_trace_create @traceid OUTPUT, 2, @file_name, @max_file_size
IF (@rc = 0) BEGIN
   EXEC sp_trace_setevent @traceid, 10, 1, @on
   EXEC sp_trace_setevent @traceid, 10, 2, @on
   EXEC sp_trace_setevent @traceid, 10, 3, @on
 . . .
   EXEC sp_trace_setfilter @traceid, 10, 0, 7, N'SQL Profiler'
   EXEC sp_trace_setstatus @traceid, 1
   END
```

以下示例是停止跟踪的脚本。请注意，以前的脚本所创建的跟踪会继续运行，直到您显式地停止跟踪或磁盘空间不足以运行此进程为止。

```
DECLARE @traceid INT
SELECT @traceid = traceid FROM ::fn_trace_getinfo(default) 
WHERE property = 5 AND value = 1 AND traceid <> 1 

IF @traceid IS NOT NULL BEGIN
   EXEC sp_trace_setstatus @traceid, 0
   EXEC sp_trace_setstatus @traceid, 2
END
```

您可以将服务器端跟踪结果保存到数据库表，然后借助 fn\$1trace\$1gettable 函数，将数据库表用作 Tuning Advisor 的工作负载。以下命令会将 D:\$1rdsdbdata\$1Log 目录（包括 RDSTrace\$11.trc 等所有滚动更新文件）中名为 RDSTrace.trc 的所有文件的结果加载到当前数据库中名为 RDSTrace 的表中。

```
SELECT * INTO RDSTrace
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace.trc', default);
```

要将特定滚动更新文件保存到表中，例如 RDSTrace\$11.trc 文件，请为 fn\$1trace\$1gettable 指定滚动更新文件的名称和替换值 1，以代替默认值这一最后的参数。

```
SELECT * INTO RDSTrace_1
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace_1.trc', 1);
```

# 使用跟踪运行 Tuning Advisor
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.Running"></a>

创建跟踪后，无论是作为本地文件还是数据库表，都可以针对数据库实例运行 Tuning Advisor。借助 Amazon RDS 使用 Tuning Advisor 的进程与使用远程独立 SQL Server 实例的进程相同。您可以在客户端计算机上使用 Tuning Advisor UI，或者使用命令行 Dta.exe 实用程序。在这两种情况下，您都必须使用数据库实例的终端节点连接 Amazon RDS 数据库实例，并在使用 Tuning Advisor 时提供主用户名和主用户密码。

以下代码示例演示了针对 Amazon RDS 数据库实例（使用终端节点 **dta.cnazcmklsdei.us-east-1.rds.amazonaws.com**）使用 dta.exe 命令行实用程序的方法。此示例包含主用户名 **admin** 和主用户密码 **test**，要优化的示例数据库名为 **C:\$1RDSTrace.trc**。此外，示例命令行代码会指定名为 **RDSTrace1** 的跟踪会话，并指定输出文件到本地计算机，其中名为 **RDSTrace.sql** 的本地计算机适用于 SQL 输出脚本，名为 **RDSTrace.txt** 的本地计算机适用于结果文件，名为 **RDSTrace.xml** 的本地计算机适用于分析的 XML 文件。此外，还有一个在名为 **RDSTraceErrors** 的 RDSDTA 数据库上指定的错误表。

```
dta -S dta.cnazcmklsdei.us-east-1.rds.amazonaws.com -U admin -P test -D RDSDTA -if C:\RDSTrace.trc -s RDSTrace1 -of C:\ RDSTrace.sql -or C:\ RDSTrace.txt -ox C:\ RDSTrace.xml -e RDSDTA.dbo.RDSTraceErrors 
```

下面是相同的示例命令行代码，只有一点不同：即输入工作负载是 **RDSTrace** 数据库上名为 **RDSDTA** 的远程 Amazon RDS 实例上的一个表。

```
dta -S dta.cnazcmklsdei.us-east-1.rds.amazonaws.com -U admin -P test -D RDSDTA -it RDSDTA.dbo.RDSTrace -s RDSTrace1 -of C:\ RDSTrace.sql -or C:\ RDSTrace.txt -ox C:\ RDSTrace.xml -e RDSDTA.dbo.RDSTraceErrors
```

有关 dta 实用工具命令行参数的完整列表，请参阅 Microsoft 文档中的 [dta 实用工具](https://docs.microsoft.com/en-us/sql/tools/dta/dta-utility)。

# 将 Amazon RDS for SQL Server 数据库的 `db_owner` 更改为 `rdsa` 账户
<a name="Appendix.SQLServer.CommonDBATasks.ChangeDBowner"></a>

当您在 RDS for SQL Server 数据库实例中创建或还原数据库时，Amazon RDS 会将该数据库的所有者设置为 `rdsa`。如果您使用 SQL Server 数据库镜像（DBM）或 Always On 可用性组（AG）进行多可用区部署，Amazon RDS 会将辅助数据库实例上的数据库所有者设置为 `NT AUTHORITY\SYSTEM`。在辅助数据库实例提升为主角色之前，无法更改辅助数据库的所有者。在大多数情况下，在执行查询时将数据库的所有者设置为 `NT AUTHORITY\SYSTEM` 不会出现问题，但在执行系统存储过程（例如，需要提升权限才能执行的 `sys.sp_updatestats`）时，可能会引发错误。

您可以使用以下查询来识别 `NT AUTHORITY\SYSTEM` 所拥有的数据库的所有者：

```
SELECT name FROM sys.databases WHERE SUSER_SNAME(owner_sid) = 'NT AUTHORITY\SYSTEM';
```

您可以使用 Amazon RDS 存储过程 `rds_changedbowner_to_rdsa` 将数据库的所有者更改为 `rdsa`。不允许将以下数据库与 `rds_changedbowner_to_rdsa` 一起使用：`master, model, msdb, rdsadmin, rdsadmin_ReportServer, rdsadmin_ReportServerTempDB, SSISDB`。

要将数据库的所有者更改为 `rdsa`，请调用 `rds_changedbowner_to_rdsa` 存储过程并提供数据库的名称。

**Example 用法：**  

```
exec msdb.dbo.rds_changedbowner_to_rdsa 'TestDB1';
```

以下参数是必需参数：
+ `@db_name` – 要将数据库所有者更改为 `rdsa` 的数据库的名称。

**重要**  
您不能使用 `rds_changedbowner_to_rdsa` 将数据库的所有权更改为 `rdsa` 之外的登录名。例如，您不能将所有权更改为您创建数据库时所用的登录名。当没有其他数据库用户可用于授予成员资格时，要在 `db_owner` 角色中还原主用户丢失的成员资格，请重置主用户密码来在 `db_owner` 角色中获取成员资格。有关更多信息，请参阅 [重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)。

# 管理 Amazon RDS for Microsoft SQL Server 的排序规则和字符集
<a name="Appendix.SQLServer.CommonDBATasks.Collation"></a>

本主题提供有关如何在 Amazon RDS 中管理 Microsoft SQL Server 的排序规则和字符集的指导。它说明了如何在数据库创建期间配置排序规则并在以后对其进行修改，从而确保根据语言和区域设置要求正确处理文本数据。此外，它还介绍了在 Amazon RDS 中的 SQL Server 环境内保持兼容性和性能的最佳实践。

SQL Server 支持多个级别的排序规则。您可以在创建数据库实例时设置默认服务器排序规则。您可以在数据库、表或列级别覆盖排序规则。

**Topics**
+ [Microsoft SQL Server 的服务器级别排序规则](#Appendix.SQLServer.CommonDBATasks.Collation.Server)
+ [Microsoft SQL Server 的数据库级别排序规则](#Appendix.SQLServer.CommonDBATasks.Collation.Database-Table-Column)

## Microsoft SQL Server 的服务器级别排序规则
<a name="Appendix.SQLServer.CommonDBATasks.Collation.Server"></a>

在创建 Microsoft SQL Server 数据库实例时，您可以设置所要使用的服务器排序规则。如果您未选择其他排序规则，则服务器级别排序规则默认为 SQL\$1Latin1\$1General\$1CP1\$1CI\$1AS。服务器排序规则默认应用到所有数据库和数据库对象。

**注意**  
从数据库快照还原时，无法更改排序规则。

Amazon RDS 当前支持以下服务器排序规则：


| 排序规则 | 说明 | 
| --- | --- | 
|  Arabic\$1CI\$1AS  |  Arabic，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Chinese\$1PRC\$1BIN2  |  Chinese-PRC，二进制代码点排序顺序  | 
|  Chinese\$1PRC\$1CI\$1AS  |  Chinese-PRC，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Chinese\$1Taiwan\$1Stroke\$1CI\$1AS  |  Chinese-Taiwan-Stroke，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Danish\$1Norwegian\$1CI\$1AS  |  Danish-Norwegian，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Danish\$1Norwegian\$1CI\$1AS\$1KS  |  Danish-Norwegian，不区分大小写，区分重音，区分假名，不区分全半角  | 
|  Danish\$1Norwegian\$1CI\$1AS\$1KS\$1WS  |  Danish-Norwegian，不区分大小写，区分重音，区分假名，区分全半角  | 
|  Danish\$1Norwegian\$1CI\$1AS\$1WS  |  Danish-Norwegian，不区分大小写，区分重音，不区分假名，区分全半角  | 
|  Danish\$1Norwegian\$1CS\$1AI  |  Danish-Norwegian，区分大小写，不区分重音，不区分假名，不区分全半角  | 
|  Danish\$1Norwegian\$1CS\$1AI\$1KS  |  Danish-Norwegian，区分大小写，不区分重音，区分假名，不区分全半角  | 
|  Finnish\$1Swedish\$1100\$1BIN  |  Finnish-Swedish-100，二进制排序  | 
|  Finnish\$1Swedish\$1100\$1BIN2  |  Finnish-Swedish-100，二进制代码点比较排序  | 
|  Finnish\$1Swedish\$1100\$1CI\$1AI  |  Finnish-Swedish-100，不区分大小写，不区分重音，不区分假名，不区分全半角  | 
|  Finnish\$1Swedish\$1100\$1CI\$1AS  |  Finnish-Swedish-100，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Finnish\$1Swedish\$1CI\$1AS  |  芬兰语、瑞典语和瑞典语（芬兰）不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  French\$1CI\$1AS  |  French，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Greek\$1CI\$1AS  |  Greek，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Greek\$1CS\$1AS  |  Greek，区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Hebrew\$1BIN  |  Hebrew，二进制排序  | 
|  Hebrew\$1CI\$1AS  |  Hebrew，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Japanese\$1BIN  | Japanese，二进制排序 | 
|  Japanese\$1CI\$1AS  |  Japanese，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Japanese\$1CS\$1AS  |  Japanese，区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Japanese\$1XJIS\$1140\$1CI\$1AS  |  Japanese，不区分大小写，区分重音，不区分假名，不区分全半角，补充字符，不区分变体选择器  | 
|  Japanese\$1XJIS\$1140\$1CI\$1AS\$1KS\$1VSS  |  Japanese，不区分大小写，区分重音，区分假名，不区分全半角，补充字符，区分变体选择器  | 
|  Japanese\$1XJIS\$1140\$1CI\$1AS\$1VSS  |  Japanese，不区分大小写，区分重音，不区分假名，不区分全半角，补充字符，区分变体选择器  | 
|  Japanese\$1XJIS\$1140\$1CS\$1AS\$1KS\$1WS  |  Japanese，区分大小写，区分重音，区分假名，区分全半角，补充字符，不区分变体选择器  | 
|  Korean\$1Wansung\$1CI\$1AS  |  Korean\$1Wansung，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Latin1\$1General\$1100\$1BIN  |  Latin1-General-100，二进制排序  | 
|  Latin1\$1General\$1100\$1BIN2  |  Latin1-General-100，二进制代码点排序顺序  | 
|  Latin1\$1General\$1100\$1BIN2\$1UTF8  |  Latin1-General-100，二进制代码点排序顺序，UTF-8 编码  | 
|  Latin1\$1General\$1100\$1CI\$1AS  |  Latin1-General-100，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Latin1\$1General\$1100\$1CI\$1AS\$1SC\$1UTF8  |  Latin1-General-100，不区分大小写，区分重音，补充字符，UTF-8 编码  | 
|  Latin1\$1General\$1BIN  |  Latin1-General，二进制排序  | 
|  Latin1\$1General\$1BIN2  |  Latin1-General，二进制代码点排序顺序  | 
|  Latin1\$1General\$1CI\$1AI  |  Latin1-General，不区分大小写，不区分重音，不区分假名，不区分全半角  | 
|  Latin1\$1General\$1CI\$1AS  |  Latin1-General，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Latin1\$1General\$1CI\$1AS\$1KS  |  Latin1-General，不区分大小写，区分重音，区分假名，不区分全半角  | 
|  Latin1\$1General\$1CS\$1AS  |  Latin1-General，区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Modern\$1Spanish\$1CI\$1AS  |  Modern\$1Spanish，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Polish\$1CI\$1AS  |  Polish，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  SQL\$11xCompat\$1CP850\$1CI\$1AS  |  对于 Unicode 数据为 Latin1-General，不区分大小写，区分重音，不区分假名，不区分全半角，对于非 Unicode 数据，为代码页 850 上的 SQL Server 排序顺序 49  | 
|  SQL\$1Latin1\$1General\$1CP1\$1CI\$1AI  |  对于 Unicode 数据为 Latin1-General，不区分大小写，不区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 1252 上的 SQL Server 排序顺序 54  | 
|  **SQL\$1Latin1\$1General\$1CP1\$1CI\$1AS（默认值）**  |  对于 Unicode 数据为 Latin1-General，不区分大小写，区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 1252 上的 SQL Server 排序顺序 52  | 
|  SQL\$1Latin1\$1General\$1CP1\$1CS\$1AS  |  对于 Unicode 数据为 Latin1-General，区分大小写，区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 1252 上的 SQL Server 排序顺序 51  | 
|  SQL\$1Latin1\$1General\$1CP437\$1CI\$1AI  |  对于 Unicode 数据为 Latin1-General，不区分大小写，不区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 437 上的 SQL Server 排序顺序 34  | 
|  SQL\$1Latin1\$1General\$1CP850\$1BIN  |  Latin1-General，对于 Unicode 数据为二进制排序顺序，对于非 Unicode 数据为代码页 850 上的 SQL Server 排序顺序 40  | 
|  SQL\$1Latin1\$1General\$1CP850\$1BIN2  |  Latin1-General，对于 Unicode 数据为二进制代码点排序顺序，对于非 Unicode 数据为代码页 850 上的 SQL Server 排序顺序 40  | 
|  SQL\$1Latin1\$1General\$1CP850\$1CI\$1AI  |  对于 Unicode 数据为 Latin1-General，不区分大小写，不区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 850 上的 SQL Server 排序顺序 44  | 
|  SQL\$1Latin1\$1General\$1CP850\$1CI\$1AS  |  对于 Unicode 数据为 Latin1-General，不区分大小写，区分重音，不区分假名，不区分全半角，对于非 Unicode 数据，为代码页 850 上的 SQL Server 排序顺序 42  | 
|  SQL\$1Latin1\$1General\$1Pref\$1CP850\$1CI\$1AS  |  对于 Unicode 数据为 Latin1-General-Pref，不区分大小写，区分重音，不区分假名，不区分全半角，对于非 Unicode 数据，为代码页 850 上的 SQL Server 排序顺序 183  | 
|  SQL\$1Latin1\$1General\$1CP1256\$1CI\$1AS  |  对于 Unicode 数据为 Latin1-General，不区分大小写，区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 1256 上的 SQL Server 排序顺序 146  | 
|  SQL\$1Latin1\$1General\$1CP1255\$1CS\$1AS  |  对于 Unicode 数据为 Latin1-General，区分大小写，区分重音，不区分假名，不区分全半角；对于非 Unicode 数据，为代码页 1255 上的 SQL Server 排序顺序 137  | 
|  Thai\$1CI\$1AS  |  Thai，不区分大小写，区分重音，不区分假名，不区分全半角  | 
|  Turkish\$1CI\$1AS  |  Turkish，不区分大小写，区分重音，不区分假名，不区分全半角  | 

您也可以使用 AWS CLI 以编程方式检索支持的排序规则列表：

```
aws rds describe-db-engine-versions --engine sqlserver-ee --list-supported-character-sets --query 'DBEngineVersions[].SupportedCharacterSets[].CharacterSetName' | sort -u
```

选择排序规则：
+ 如果您使用 Amazon RDS 控制台，则在创建新的数据库实例时，请选择 **Additional configuration**（其他配置），然后在 **Collation**（排序规则）字段中输入排序规则。有关更多信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 如果使用 AWS CLI，请在 `--character-set-name` 命令中使用 `create-db-instance` 选项。有关更多信息，请参阅 [create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)。
+ 如果使用 Amazon RDS API，请在 `CharacterSetName` 操作中使用 `CreateDBInstance` 参数。有关更多信息，请参阅 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)。

## Microsoft SQL Server 的数据库级别排序规则
<a name="Appendix.SQLServer.CommonDBATasks.Collation.Database-Table-Column"></a>

当创建新数据库或数据库对象时，您可以通过覆盖排序规则在数据库、表或列级别更改默认排序规则。例如，如果您的默认服务器排序规则为 SQL\$1Latin1\$1General\$1CP1\$1CI\$1AS，您可将其更改为 Mohawk\$1100\$1CI\$1AS 以支持 Mohawk 排序规则。如果需要，甚至可以对查询中的参数进行类型转换以便使用不同的排序规则。

例如，以下查询将 AccountName 列的默认排序规则更改为 Mohawk\$1100\$1CI\$1AS

```
CREATE TABLE [dbo].[Account]
	(
	    [AccountID] [nvarchar](10) NOT NULL,
	    [AccountName] [nvarchar](100) COLLATE Mohawk_100_CI_AS NOT NULL 
	) ON [PRIMARY];
```

Microsoft SQL Server 数据库引擎通过内置 NCHAR、NVARCHAR 和 NTEXT 数据类型支持 Unicode。例如，如果您需要 CJK 支持，请对字符存储使用这些 Unicode 数据类型，并在创建数据库和表时覆盖默认的服务器排序规则。下面列出了一些由 Microsoft 提供的链接，其中包括 SQL Server 的排序规则和 Unicode 支持：
+ [使用排序规则](http://msdn.microsoft.com/en-us/library/ms187582%28v=sql.105%29.aspx) 
+ [排序规则和国际术语](http://msdn.microsoft.com/en-us/library/ms143726%28v=sql.105%29) 
+ [使用 SQL Server 排序规则](http://msdn.microsoft.com/en-us/library/ms144260%28v=sql.105%29.aspx) 
+ [数据库和数据库引擎应用程序的国际注意事项](http://msdn.microsoft.com/en-us/library/ms190245%28v=sql.105%29.aspx)

# 为 Amazon RDS for SQL Server 创建数据库用户
<a name="Appendix.SQLServer.CommonDBATasks.CreateUser"></a>

通过运行类似以下示例的 T-SQL 脚本，可以为 Amazon RDS for Microsoft SQL Server 数据库实例创建数据库用户。使用 SQL Server 管理套件（SSMS）之类的应用程序。您以创建数据库实例时创建的主用户身份登录数据库实例。

```
--Initially set context to master database
USE [master];
GO
--Create a server-level login named theirname with password theirpassword
CREATE LOGIN [theirname] WITH PASSWORD = 'theirpassword';
GO
--Set context to msdb database
USE [msdb];
GO
--Create a database user named theirname and link it to server-level login theirname
CREATE USER [theirname] FOR LOGIN [theirname];
GO
```

有关将数据库用户添加到角色的示例，请参阅[将用户添加到 SQLagentUser 角色](SQLServerAgent.AddUser.md)。

**注意**  
如果您在添加用户时出现权限错误，可以通过修改数据库实例主用户密码来恢复。有关更多信息，请参阅 [重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)。  
在应用程序中克隆主用户权限不是最佳实践。有关更多信息，请参阅 [How to clone master user permissions in Amazon RDS for SQL Server](https://aws.amazon.com/blogs/database/how-to-clone-master-user-permissions-in-amazon-rds-for-sql-server/)。

# 确定 Amazon RDS for SQL Server 数据库的恢复模式
<a name="Appendix.SQLServer.CommonDBATasks.DatabaseRecovery"></a>

在 Amazon RDS 中，恢复模式、保留期和数据库状态是相关联的。

在对这些设置之一进行更改之前，请务必了解结果。每个设置都可能会影响其他设置。例如：
+ 如果您在启用备份保留的情况下将数据库的恢复模式更改为 SIMPLE 或 BULK\$1LOGGED，Amazon RDS 会在五分钟内将恢复模式重置为 FULL。这还会导致 RDS 制作数据库实例的快照。
+ 如果您将备份保留设置为 `0` 天，则 RDS 会将恢复模式设置为 SIMPLE。
+ 如果您在将备份保留设置为 `0` 天的同时，将数据库的恢复模式从 SIMPLE 更改为任何其他选项，则 RDS 会将恢复模式重置为 SIMPLE。

**重要**  
绝不要更改多可用区实例上的恢复模式，即使您似乎可以执行此操作 – 例如，通过使用 ALTER DATABASE。Backup retention，因此，多可用区需要 FULL 恢复模式。如果您更改恢复模式，RDS 会立即将其更改回 FULL。  
此自动重置强制 RDS 完全重建镜像。在此重建期间，数据库的可用性将降低，时间约为 30-90 分钟，直到镜像已准备好故障转移。数据库实例还会遇到性能降低，与从单可用区转换为多可用区期间相同。性能降低的时间长度取决于数据库存储大小 — 存储的数据库越大，降低的时间越长。

有关 SQL Server 恢复模型的更多信息，请参阅 Microsoft 文档中的[恢复模型 (SQL Server)](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server)。

# 确定 Amazon RDS for SQL Server 的上次失效转移时间
<a name="Appendix.SQLServer.CommonDBATasks.LastFailover"></a>

要确定上次故障转移时间，请使用以下存储过程：

```
execute msdb.dbo.rds_failover_time;
```

此过程返回以下信息。


****  

| 输出参数 | 描述 | 
| --- | --- | 
|  errorlog\$1available\$1from  |  显示错误日志在日志目录中开始可用的时间。  | 
|  recent\$1failover\$1time  |  显示上次故障转移时间（如果在错误日志中可用）。否则显示为 `null`。  | 

**注意**  
存储过程搜索日志目录中的所有可用 SQL Server 错误日志，以检索最近的故障转移时间。如果故障转移消息已被 SQL Server 覆盖，则该过程不会检索故障转移时间。

**Example 最近无故障转移示例**  
此示例显示错误日志中最近没有故障转移的输出。自 2020-04-29 23:59:00.01 以来，没有发生故障转移。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  null  | 

**Example 最近故障转移示例**  
此示例显示错误日志中最近有故障转移的输出。最近一次故障转移的时间是在 2020-05-05 18:57:51.89。  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  2020-05-05 18:57:51.8900000  | 

# 排查由于日志序列号差异而导致的时间点故障恢复故障
<a name="Appendix.SQLServer.CommonDBATasks.PITR-LSN-Gaps"></a>

在 RDS for SQL Server 中尝试时间点故障恢复（PITR）时，由于日志序列号（LSN）存在差异，您可能会遇到故障。这些差异会阻止 RDS 将数据库还原到所请求的时间，并且 RDS 会将正在还原的实例置于 `incompatible-restore` 状态。

此问题的常见原因为：
+ 手动更改数据库恢复模式。
+ 由于用于完成事务日志备份的资源不足，RDS 更改了自动恢复模式。

要确定数据库中的 LSN 差异，请运行此查询：

```
SELECT * FROM msdb.dbo.rds_fn_list_tlog_backup_metadata(database_name)
ORDER BY backup_file_time_utc desc;
```

如果您发现 LSN 差异，您可以：
+ 选择 LSN 差异之前的一个还原点。
+ 等待并还原到下一次实例备份完成后的某个点。

为防止出现此问题，我们建议您不要手动更改 RDS for SQL Server 数据库的恢复模式，因为这会中断实例的持久性。我们还建议您选择具有足够资源来处理工作负载的实例类型，以确保定期备份事务日志。

有关事务日志管理的更多信息，请参阅 Microsoft SQL Server 文档中的 [SQL Server transaction log architecture and management guide](https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver16)。

# 拒绝或支持查看 Amazon RDS for SQL Server 的数据库名称
<a name="Appendix.SQLServer.CommonDBATasks.ManageView"></a>

主用户无法设置 `DENY VIEW ANY DATABASE TO LOGIN` 来向用户隐藏数据库。要更改此权限，请改用以下存储过程：
+ 拒绝 *LOGIN* 的数据库视图访问权限：

  ```
  EXEC msdb.dbo.rds_manage_view_db_permission @permission=‘DENY’, @server_principal=‘LOGIN’  
  go
  ```
+ 支持 *LOGIN* 的数据库视图访问权限：

  ```
  EXEC msdb.dbo.rds_manage_view_db_permission @permission='GRANT', @server_principal='LOGIN' 
   go
  ```

使用此存储过程时，请注意以下事项：
+ 数据库名称对于 SSMS 和内部 DMV（动态管理视图）处于隐藏状态。但是，仍然可以从审计、日志和元数据表中看到数据库名称。这些是受保护的 `VIEW ANY DATABASE` 服务器权限。有关更多信息，请参阅 [DENY Server Permissions](https://learn.microsoft.com/en-us/sql/t-sql/statements/deny-server-permissions-transact-sql?view=sql-server-ver16#permissions)。
+ 一旦权限恢复为 `GRANT`（支持），*LOGIN* 就可以查看所有数据库。
+ 如果您删除并重新创建 *LOGIN*，则与 LOGIN 相关的查看权限将重置为 `ALLOW`。
+ 对于多可用区实例，仅在主要主机上为 *LOGIN* 设置 `DENY` 或 `GRANT` 权限。更改会自动传播到辅助主机。
+ 此权限仅更改登录名是否可以查看数据库名称。但是，对数据库和其中对象的访问权限是单独管理的。

# 在 Amazon RDS for SQL Server 批量加载期间禁用快速插入
<a name="Appendix.SQLServer.CommonDBATasks.DisableFastInserts"></a>

从 SQL Server 2016 开始，便默认启用了快速插入。快速插入利用数据库处于简单或批量日志记录恢复模型时发生的最小日志记录来优化插入性能。使用快速插入，每个批量加载批次都会获得新范围，从而绕过对具有可用空闲空间的现有范围的分配查找，从而优化插入性能。

然而，使用快速插入时，小批量大小的批量加载可能会增加对象消耗的未使用空间。如果不能提高批量大小，则启用跟踪标志 692 可以帮助减少未使用的预留空间，但以牺牲性能为代价。启用此跟踪标志会在将数据批量加载到堆或集群化索引时禁用快速插入。

使用数据库参数组启用跟踪标志 692 作为启动参数。有关更多信息，请参阅“[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)”。

在 SQL Server 2016 及更高版本上针对 Amazon RDS 支持跟踪标志 692。有关跟踪标志的更多信息，请参阅 Microsoft 文档中的 [DBCC TRACEON - 跟踪标志](https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql)。

# 删除 Amazon RDS for Microsoft SQL Server 数据库实例中的数据库
<a name="Appendix.SQLServer.CommonDBATasks.DropMirrorDB"></a>

您可以删除在单可用区或多可用区部署中运行 Microsoft SQL Server 的 Amazon RDS 数据库实例上的数据库。要删除数据库，请使用以下命令：

```
--replace your-database-name with the name of the database you want to drop
EXECUTE msdb.dbo.rds_drop_database  N'your-database-name'
```

**注意**  
在命令中使用直单引号。智能引号会引发错误。

在您使用此过程删除数据库之后，Amazon RDS 将删除与数据库的现有连接并删除数据库的备份历史记录。

要向其他用户授予备份和还原限额，请按照以下步骤操作：

```
USE master
GO
CREATE LOGIN user1 WITH PASSWORD=N'changeThis', DEFAULT_DATABASE=master, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE msdb
GO
CREATE USER user1 FOR LOGIN user1
GO
use msdb
GO
GRANT EXECUTE ON msdb.dbo.rds_backup_database TO user1
GO
GRANT EXECUTE ON msdb.dbo.rds_restore_database TO user1
GO
```

# 在多可用区部署中重命名 Amazon RDS for Microsoft SQL Server 数据库
<a name="Appendix.SQLServer.CommonDBATasks.RenamingDB"></a>

要对使用多可用区的 Microsoft SQL Server 数据库实例重命名，请使用以下过程：

1. 首先，为此数据库实例关闭多可用区。

1. 运行 `rdsadmin.dbo.rds_modify_db_name`，对数据库重命名。

1. 然后，为此数据库实例启用“多可用区镜像”或“永不停机”可用性组，将它恢复为原始状态。

有关更多信息，请参阅“[向 Microsoft SQL Server 数据库实例添加多可用区](USER_SQLServerMultiAZ.md#USER_SQLServerMultiAZ.Adding)”。

**注意**  
如果实例未使用多可用区，则无需在运行 `rdsadmin.dbo.rds_modify_db_name` 之前或之后更改任何设置。  
您无法在只读副本源实例上重命名数据库。

**示例：**在以下示例中，存储的 `rdsadmin.dbo.rds_modify_db_name` 过程会将数据库由 **MOO** 重命名为 **ZAR**。这与运行 `DDL ALTER DATABASE [MOO] MODIFY NAME = [ZAR]` 语句类似。

```
EXEC rdsadmin.dbo.rds_modify_db_name N'MOO', N'ZAR'
GO
```

# 重置 Amazon RDS for SQL Server 主用户的 db\$1owner 角色成员资格
<a name="Appendix.SQLServer.CommonDBATasks.ResetPassword"></a>

如果您将主用户锁定在 RDS for SQL Server 数据库上的 `db_owner` 角色成员资格之外，并且没有其他数据库用户可以授予该成员资格，则可以通过修改数据库实例主用户密码来还原丢失的成员资格。

通过更改数据库实例的主用户密码，RDS 可以向 `db_owner` 授予针对数据库实例中数据库的可能已被意外撤销的成员资格。您可以使用 Amazon RDS 控制台、AWS CLI 命令 [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)，或者使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) API 操作更改数据库实例密码。有关修改数据库实例的更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 还原 Amazon RDS for SQL Server 的许可证终止的数据库实例
<a name="Appendix.SQLServer.CommonDBATasks.RestoreLTI"></a>

Microsoft 要求一些未报告其 Microsoft 许可证移动性信息的 Amazon RDS 客户终止其数据库实例。Amazon RDS 会获取这些数据库实例的快照，您可以从快照还原到包含许可证模型的新数据库实例。

您可以从标准版快照还原到标准版或企业版。

您可以从企业版快照还原到标准版或企业版。

**要在 Amazon RDS 创建您的实例的最终快照后从 SQL Server 快照还原，请执行以下操作：**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**快照**。

1. 选择 SQL Server 数据库实例的快照。Amazon RDS 会创建数据库实例的最终快照。已终止的实例快照的名称采用格式 `instance_name-final-snapshot`。例如，如果数据库实例名称是 **mytest.cdxgahslksma.us-east-1.rds.com**，那么最终快照的名称将为 ** mytest-final-snapshot**，并位于与原始数据库实例相同的 AWS 区域。

1. 对于 **Actions (操作)**，选择 **Restore Snapshot (还原快照)**。

   将显示 **Restore DB Instance** 窗口。

1. 对于 **License Model (许可模式)**，选择 **license-included (附带许可)**。

1. 选择要使用的 SQL Server 数据库引擎。

1. 对于 **DB Instance Identifier (数据库实例标识符)**，请输入还原后的数据库实例的名称。

1. 选择 **Restore DB Instance**。

有关从快照还原的更多信息，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。

# 将 Amazon RDS for SQL Server 数据库从脱机状态转换为联机状态
<a name="Appendix.SQLServer.CommonDBATasks.TransitionOnline"></a>

您可以将 Amazon RDS 数据库实例上的 Microsoft SQL Server 数据库从 `OFFLINE` 转换为 `ONLINE` 状态。


****  

| SQL Server 方法 | Amazon RDS 方法 | 
| --- | --- | 
| ALTER DATABASE *db\$1name* SET ONLINE; | EXEC rdsadmin.dbo.rds\$1set\$1database\$1online *db\$1name* | 

# 在 Amazon RDS for SQL Server 上使用变更数据捕获
<a name="Appendix.SQLServer.CommonDBATasks.CDC"></a>

Amazon RDS 支持运行 Microsoft SQL Server 的数据库实例的更改数据捕获 (CDC)。CDC 可捕获对表中的数据进行的更改。它存储有关每个更改的元数据，您稍后可以访问这些元数据。有关 CDC 的工作原理的更多信息，请参阅 Microsoft 文档中的[更改数据捕获](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server#Capture)。在将 CDC 用于您的 Amazon RDS 数据库实例之前，请通过运行 `msdb.dbo.rds_cdc_enable_db` 在数据库中启用它。启用 CDC 后，具备该数据库的 `db_owner` 身份的任何用户都可以在该数据库中的表上启用或禁用 CDC。

**重要**  
在还原期间，CDC 将被禁用。所有相关元数据都将自动从数据库中删除。这适用于快照还原和时间点还原。执行这些类型的还原之一后，您可以重新启用 CDC 并重新指定要跟踪的表。

要为数据库实例启用 CDC，请运行 `msdb.dbo.rds_cdc_enable_db` 存储过程。

```
1. exec msdb.dbo.rds_cdc_enable_db 'database_name'
```

要为数据库实例禁用 CDC，请运行 `msdb.dbo.rds_cdc_disable_db` 存储过程。

```
1. exec msdb.dbo.rds_cdc_disable_db 'database_name'
```

要向用户授予 CDC 权限，请使用以下过程：

```
1. go
2. 		GRANT EXECUTE ON msdb.dbo.rds_cdc_enable_db TO User1
3. 		GRANT EXECUTE ON msdb.dbo.rds_cdc_disable_db TO User1
```

**Topics**
+ [使用更改数据捕获跟踪表](#Appendix.SQLServer.CommonDBATasks.CDC.tables)
+ [更改数据捕获作业](#Appendix.SQLServer.CommonDBATasks.CDC.jobs)
+ [多可用区实例的更改数据捕获](#Appendix.SQLServer.CommonDBATasks.CDC.Multi-AZ)

## 使用更改数据捕获跟踪表
<a name="Appendix.SQLServer.CommonDBATasks.CDC.tables"></a>

在数据库上启用 CDC 后，您可以开始跟踪特定表。通过运行 [sys.sp\$1cdc\$1enable\$1table](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-enable-table-transact-sql)，您可以选择要跟踪的表。

```
 1. --Begin tracking a table
 2. exec sys.sp_cdc_enable_table   
 3.    @source_schema           = N'source_schema'
 4. ,  @source_name             = N'source_name'
 5. ,  @role_name               = N'role_name'
 6. 
 7. --The following parameters are optional:
 8.  
 9. --, @capture_instance       = 'capture_instance'
10. --, @supports_net_changes   = supports_net_changes
11. --, @index_name             = 'index_name'
12. --, @captured_column_list   = 'captured_column_list'
13. --, @filegroup_name         = 'filegroup_name'
14. --, @allow_partition_switch = 'allow_partition_switch'
15. ;
```

要查看您的表的 CDC 配置，请运行 [sys.sp\$1cdc\$1help\$1change\$1data\$1capture](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-help-change-data-capture-transact-sql)。

```
1. --View CDC configuration
2. exec sys.sp_cdc_help_change_data_capture 
3. 
4. --The following parameters are optional and must be used together.
5. --  'schema_name', 'table_name'
6. ;
```

有关 CDC 表、函数和 SQL Server 文档中的存储过程的更多信息，请参阅以下内容：
+ [更改数据捕获存储过程 (Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/change-data-capture-stored-procedures-transact-sql)
+ [更改数据捕获函数 (Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/change-data-capture-functions-transact-sql)
+ [更改数据捕获表 (Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-tables/change-data-capture-tables-transact-sql)

## 更改数据捕获作业
<a name="Appendix.SQLServer.CommonDBATasks.CDC.jobs"></a>

当您启用 CDC 时，SQL Server 会创建 CDC 作业。数据库所有者 (`db_owner`) 可以查看、创建、修改和删除 CDC 作业。但是，RDS 系统账户拥有这些作业。因此，这些作业从本机视图、过程或 SQL Server Management Studio 中不可见。

要控制 CDC 在数据库中的行为，请使用本机 SQL Server 过程，例如 [sp\$1cdc\$1enable\$1table](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-enable-table-transact-sql) 和 [sp\$1cdc\$1start\$1job](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-start-job-transact-sql)。要更改 CDC 作业参数（例如 `maxtrans` 和 `maxscans`），您可以使用 [sp\$1cdc\$1change\$1jobs](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql)。

要获取有关 CDC 作业的更多信息，您可以查询以下动态管理视图：
+ sys.dm\$1cdc\$1errors
+ sys.dm\$1cdc\$1log\$1scan\$1sessions
+ sysjobs
+ sysjobhistory

## 多可用区实例的更改数据捕获
<a name="Appendix.SQLServer.CommonDBATasks.CDC.Multi-AZ"></a>

如果您在多可用区实例上使用 CDC，请确保镜像的 CDC 作业配置与主体上的配置匹配。CDC 作业映射到 `database_id`。如果辅助副本上的数据库 ID 与主体不同，则作业不会与正确的数据库关联。要尝试阻止故障转移后发生错误，RDS 将删除并在新的主体上重新创建作业。重新创建的作业使用故障转移之前主体记录的参数。

尽快此过程快速运行，CDC 作业仍然可能在 RDS 更正它们之前运行。以下是在主副本和辅助副本之间使参数保持一致的三种方式：
+ 对启用了 CDC 的所有数据库使用相同作业参数。
+ 在更改 CDC 作业配置之前，将多可用区实例转换为单可用区。
+ 只要您在主体上更改参数，就手动传输参数。

查看并定义故障转移后用于重新创建 CDC 作业的 CDC 参数，使用 `rds_show_configuration` 和 `rds_set_configuration`。

以下示例将返回 `cdc_capture_maxtrans` 的值。对于设置为 `RDS_DEFAULT` 的任何参数，RDS 会自动配置该值。

```
-- Show configuration for each parameter on either primary and secondary replicas. 
exec rdsadmin.dbo.rds_show_configuration 'cdc_capture_maxtrans';
```

要在辅助副本上设置配置，请运行 `rdsadmin.dbo.rds_set_configuration`。此过程将设置辅助服务器上所有数据库的参数值。这些设置仅在故障转移后使用。以下示例将所有 CDC 捕获作业的 `maxtrans` 设置为 *1000*：

```
--To set values on secondary. These are used after failover.
exec rdsadmin.dbo.rds_set_configuration 'cdc_capture_maxtrans', 1000;
```

要在委托人上设置 CDC 作业参数，请改用 [sys.sp\$1cdc\$1change\$1job](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql)。

# 使用 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 期间计划运行作业。由 AWS 启动的维护和备份过程可能会中断作业或导致作业取消。  
在多可用区部署中，启用作业复制功能时，SQL Server Agent 作业将从主要主机复制到辅助主机。有关更多信息，请参阅 [启用 SQL Server Agent 作业复制](#SQLServerAgent.Replicate)。  
多可用区部署具有 10000 个 SQL Server 代理任务的限制。如果您需要更高的限制，则可联系 支持 请求增加限制。打开 [AWS 支持 Center (Amazon Web Services Support 中心)](https://console.aws.amazon.com/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.aws.amazon.com/zh_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.aws.amazon.com/zh_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)。

# SQL Server Agent 角色
<a name="SQLServerAgent.AgentRoles"></a>

RDS for SQL Server 支持以下 SQL Server Agent 角色，这些角色具有不同的权限级别来管理作业：
+ **SQLAgentUserRole**

  权限
  + 创建和管理自己的作业、计划和操作员
  + 查看自己的作业和计划的属性
  + 无法查看或管理由其他用户创建的作业

  此角色适用于需要创建和管理自己的作业，但不需要访问由其他用户创建的作业的用户。
+ **SQLAgentReaderRole**

  权限
  + SQLAgentUserRole 的所有权限
  + 查看所有作业和计划（包括其他用户创建的作业和计划）的列表
  + 查看所有作业的属性
  + 查看作业历史记录

  此角色适用于需要监控所有作业的状态但不需要管理这些作业的用户。
+ **SQLAgentOperatorRole**

  权限
  + SQLAgentUserRole 和 SQLAgentReaderRole 的所有权限
  + 执行、停止或启动作业
  + 管理作业历史记录
  + 启用/禁用作业和计划
  + 查看操作员和代理

  此角色提供最全面的权限，适合需要完全控制所有作业的用户。

使用以下命令将角色分配给您的 SQL Server 登录名：

```
USE msdb;
EXEC sp_addrolemember 'SQLAgentOperatorRole', 'username';
```

## 在 RDS for SQL Server 中管理 SQLAgentOperatorRole
<a name="SQLServerAgent.AgentRoles.ManageSQLAgentOperatorRole"></a>

要查看当前作业，必须将 SQLAgentOperatorRole 添加到 SQL Server 登录名，并在断开与数据库的连接之前将其移除。

要在 SQL Server Management Studio 中可视化 SQL Server Agent 树，请按照以下说明操作：

**在 SQL Server Management Studio（SSMS）上查看 SQL Server Agent**

1. 使用 RDS 主凭证，登录 RDS SQL Server 实例并向所需用户授予 SQLAgentUserRole。

   ```
   USE msdb
   GO
   IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = 'UserName')
   BEGIN
   CREATE USER UserName FROM LOGIN UserName
   END
   GO
   ALTER ROLE SQLAgentUserRole ADD MEMBER UserName
   GO
   GRANT ALTER ON ROLE::[SQLAgentOperatorRole] to UserName
   GO
   ```

   如果该用户不存在，则这些命令会在 `msdb` 数据库上创建该用户。它还会在 SQLAgentUserRole 上添加用户，因此可以看到 SSMS 上的 SQL Server Agent 树。最后，它向用户授予对 SQLAgentOperatorRole 的更改权限。这可让用户在该角色中添加/移除自身。

1. 要将自己添加到上述角色中，请使用需要查看作业的用户连接到 RDS SQL Server 实例，然后运行以下脚本。

   ```
   use msdb
   go
   ALTER ROLE SQLAgentOperatorRole ADD MEMBER UserName
   GO
   ```

   之后，右键单击**作业**文件夹，然后选择**刷新**。

1. 执行此操作时，**作业**选项卡会显示一个 **\$1**（加号）按钮。单击可展开 SQL Server Agent 作业列表。

1. 
**重要**  
在断开与 RDS SQL Server 实例的连接之前，您需要将自己从 SQLAgentOperatorRole 中移除。

   要从 SQLAgentOperatorRole 中移除登录名，请在断开或关闭 Management Studio 之前运行以下查询：

   ```
   USE msdb
   GO
   ALTER ROLE SQLAgentOperatorRole DROP MEMBER UserName
   GO
   ```

有关更多信息，请参阅 [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)。

# 将用户添加到 SQLagentUser 角色
<a name="SQLServerAgent.AddUser"></a>

要允许其他登录名或用户使用 SQL Server Agent，请以主用户身份登录并执行以下操作：

1. 使用 `CREATE LOGIN` 命令创建另一个服务器级别的登录名。

1. 使用 `msdb` 命令在 `CREATE USER` 内创建一个用户，然后将此用户链接到上一步骤中创建的登录名。

1. 使用 `SQLAgentUserRole` 系统存储过程将用户添加到 `sp_addrolemember`。

例如，假设您的主用户名为 **admin**，并且您要授予一个用户对 SQL Server Agent 的访问权限，此用户的用户名为 **theirname**，密码为 **theirpassword**。在这种情况下，您可以使用以下过程。

**要将用户添加到 SQLagentUser 角色**

1. 以主用户身份登录。

1. 运行以下命令：

   ```
   --Initially set context to master database
   USE [master];
   GO
   --Create a server-level login named theirname with password theirpassword
   CREATE LOGIN [theirname] WITH PASSWORD = 'theirpassword';
   GO
   --Set context to msdb database
   USE [msdb];
   GO
   --Create a database user named theirname and link it to server-level login theirname
   CREATE USER [theirname] FOR LOGIN [theirname];
   GO
   --Added database user theirname in msdb to SQLAgentUserRole in msdb
   EXEC sp_addrolemember [SQLAgentUserRole], [theirname];
   ```

# 删除 SQL Server Agent 作业
<a name="SQLServerAgent.DeleteJob"></a>

您可以使用 `sp_delete_job` 存储过程删除 Amazon RDS for Microsoft SQL Server 上的 SQL Server Agent 作业。

不能使用 SSMS 删除 SQL Server Agent 作业。如果您尝试这样做，就会收到类似于以下内容的错误消息：

```
The EXECUTE permission was denied on the object 'xp_regread', database 'mssqlsystemresource', schema 'sys'.
```

作为托管服务，RDS 在运行访问 Windows 注册表的过程时受到了限制。使用 SSMS 时，其会尝试运行没有 RDS 授权的进程 (`xp_regread`)。

**注意**  
在 RDS for SQL Server 上，只允许 sysadmin 角色的成员更新或删除由其他登录账户拥有的任务。有关更多信息，请参阅 [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)。

**要删除 SQL Server Agent 作业**
+ 运行以下 T-SQL 语句：

  ```
  EXEC msdb..sp_delete_job @job_name = 'job_name';
  ```

# 使用 Amazon RDS for Microsoft SQL Server 日志
<a name="Appendix.SQLServer.CommonDBATasks.Logs"></a>

您可使用 Amazon RDS 控制台来查看、监视和下载 SQL Server Agent 日志、Microsoft SQL Server 错误日志以及 SQL Server Reporting Services（SSRS）日志。

## 监视日志文件
<a name="Appendix.SQLServer.CommonDBATasks.Logs.Watch"></a>

如果在 Amazon RDS 控制台中查看日志，则可查看该日志中的实时内容。通过在控制台中监视日志，可以打开日志并使其处于动态状态，以便能实时查看该日志的更新。

仅最新日志处于活动状态以供监视。例如，假设您拥有以下所示日志：

![\[Amazon RDS 控制台中“日志”部分的图像，其中选择了错误日志。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/logs_sqlserver.png)


仅主动更新 log/ERROR (最新日志)。您可选择监视其他日志，但它们是静态的且不会更新。

## 存档日志文件
<a name="Appendix.SQLServer.CommonDBATasks.Logs.Archive"></a>

Amazon RDS 控制台显示过去一周直至当日的日志。您可下载日志并将其存档以便在该时间后进行参考。一种对日志进行存档的方法是，将日志加载到 Amazon S3 存储桶中。有关如何设置 Amazon S3 存储桶和上传文件的说明，请参阅 *Amazon Simple Storage Service 入门指南* 中的 [Amazon S3 基础知识](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AmazonS3Basics.html)，并单击**开始使用**。

## 查看错误和代理日志
<a name="Appendix.SQLServer.CommonDBATasks.Logs.SP"></a>

要查看 Microsoft SQL Server 错误和代理日志，请将 Amazon RDS 存储过程 `rds_read_error_log` 与以下参数配合使用：
+ **`@index`** – 要检索的日志的版本。默认值为 0，检索当前错误日志。指定 1 可检索上一个日志，指定 2 可检索该日志之前的日志，依此类推。
+ **`@type`** – 要检索的日志的类型。指定 1 可检索错误日志。指定 2 可检索代理日志。

**Example**  
以下示例请求当前错误日志。  

```
EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;
```

有关 SQL Server 错误的更多信息，请参阅 Microsoft 文档中的 [数据库引擎错误](https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors)。

# 使用 Amazon RDS for SQL Server 的跟踪和转储文件
<a name="Appendix.SQLServer.CommonDBATasks.TraceFiles"></a>

本部分介绍对运行 Microsoft SQL Server 的 Amazon RDS 数据库实例使用跟踪文件和转储文件。

## 生成跟踪 SQL 查询
<a name="Appendix.SQLServer.CommonDBATasks.TraceFiles.TraceSQLQuery"></a>

```
1. declare @rc int 
2. declare @TraceID int 
3. declare @maxfilesize bigint 
4. 
5. set @maxfilesize = 5
6. 
7. exec @rc = sp_trace_create @TraceID output,  0, N'D:\rdsdbdata\log\rdstest', @maxfilesize, NULL
```

## 查看打开的跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TraceFiles.ViewOpenTrace"></a>

```
1. select * from ::fn_trace_getinfo(default)
```

## 查看跟踪内容
<a name="Appendix.SQLServer.CommonDBATasks.TraceFiles.ViewTraceContents"></a>

```
1. select * from ::fn_trace_gettable('D:\rdsdbdata\log\rdstest.trc', default)
```

## 设置跟踪文件和转储文件的保留期
<a name="Appendix.SQLServer.CommonDBATasks.TraceFiles.PurgeTraceFiles"></a>

跟踪文件和转储文件会累积并占用磁盘空间。默认情况下，Amazon RDS 可清除超过 7 天的跟踪文件和转储文件。

要查看当前跟踪和转储文件保留期，请使用 `rds_show_configuration` 过程，如以下示例中所示。

```
1. exec rdsadmin..rds_show_configuration;
```

要修改跟踪文件的保留期，请使用 `rds_set_configuration` 过程并设置 `tracefile retention` (以分钟为单位)。以下示例将跟踪文件保留期设置为 24 小时。

```
1. exec rdsadmin..rds_set_configuration 'tracefile retention', 1440; 
```

要修改转储文件的保留期，请使用 `rds_set_configuration` 过程并设置 `dumpfile retention` (以分钟为单位)。以下示例将转储文件保留期设置为 3 天。

```
1. exec rdsadmin..rds_set_configuration 'dumpfile retention', 4320; 
```

出于安全考虑，您无法删除 SQL Server 数据库实例上的特定跟踪文件或转储文件。要删除所有未使用的跟踪文件或转储文件，请将这些文件的保留期设置为 0。