

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