

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