

# 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)。 | 