

# Amazon RDS で実行している Microsoft SQL Server DB インスタンスの tempdb データベースへのアクセス
<a name="SQLServer.TempDB"></a>

Amazon RDS で実行している Microsoft SQL Server DB インスタンスの `tempdb` データベースにアクセスできます。`tempdb` に対してコードを実行するには、Microsoft SQL Server Management Studio (SSMS) 経由で Transact-SQL を使用するか、他の標準の SQL クライアントアプリケーションを使用します。DB インスタンスへの接続の詳細については、「[SQL Server DB インスタンスへの接続](USER_ConnectToMicrosoftSQLServerInstance.md)」を参照してください。

DB インスタンスのマスターユーザーは、`CONTROL` への `tempdb` アクセスが付与されるため、`tempdb` データベースオプションを変更できます。マスターユーザーは、`tempdb` データベースの所有者ではありません。必要に応じて、マスターユーザーは他のユーザーに `CONTROL` アクセスを付与し、他のユーザーにも `tempdb` データベースオプションを変更することを許可できます。

**注記**  
`tempdb` データベースに対して Database Console Command (DBCC) を実行することはできません。

# tempdb データベースオプションの変更
<a name="SQLServer.TempDB.Modifying"></a>

Amazon RDS DB インスタンスで `tempdb` データベースのデータベースオプションを変更できます。変更可能なオプションの詳細については、Microsoft ドキュメントの「[tempdb データベース](https://msdn.microsoft.com/en-us/library/ms190768%28v=sql.120%29.aspx)」を参照してください。

ファイルの最大サイズオプションなどのデータベースオプションは、DB インスタンスの再起動後も保持されます。データベースオプションを変更して、データをインポートする際のパフォーマンスを最適化したり、ストレージ不足を防止したりすることができます。

## データをインポートする際のパフォーマンスの最適化
<a name="SQLServer.TempDB.Modifying.Import"></a>

大量のデータを DB インスタンス内にインポートする際のパフォーマンスを最適化するには、tempdb データベースの `SIZE` プロパティと `FILEGROWTH` プロパティに大きな数値を設定します。`tempdb` を最適化する方法の詳細については、Microsoft ドキュメントの「[tempdb のパフォーマンスの最適化](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)
```

# tempdb データベースの圧縮
<a name="SQLServer.TempDB.Shrinking"></a>

Amazon RDS DB インスタンスの `tempdb` データベースを圧縮するには、2 つの方法があります。`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` を呼び出すとき、DB インスタンスのダウンタイムはありません。

`rds_shrink_tempdbfile` プロシージャには以下のパラメータがあります。


****  

| パラメータ名 | データ型 | デフォルト | 必須 | 説明 | 
| --- | --- | --- | --- | --- | 
| `@temp_filename` | SYSNAME | — | 必須 | 圧縮するファイルの論理名。 | 
| `@target_size` | int | null | optional | ファイルの新しいサイズ (メガバイト単位)。 | 

次の例では、`tempdb` データベース用にファイル名を取得します。

```
1. use tempdb;
2. GO
3. 
4. select name, * from sys.sysfiles;
5. GO
```

以下の例では、`tempdb` という名前の `test_file` データベースファイルを圧縮し、新しいサイズとして `10` メガバイトをリクエストしています。

```
1. exec msdb.dbo.rds_shrink_tempdbfile @temp_filename = N'test_file', @target_size = 10;
```

## SIZE プロパティの設定
<a name="SQLServer.TempDB.Shrinking.Size"></a>

`tempdb` を設定して DB インスタンスを再起動することでも、`SIZE` データベースを圧縮できます。DB インスタンスの再起動の詳細については、「[ DB インスタンスの再起動](USER_RebootInstance.md)」を参照してください。

次の例では、`SIZE` プロパティを 1024 MB に設定しています。

```
1. alter database [tempdb] modify file (NAME = N'templog', SIZE = 1024MB)
```

# マルチ AZ 配置の TempDB 設定
<a name="SQLServer.TempDB.MAZ"></a>

データベースミラーリング (DBM) または Always On Availability Groups (AG) を使用して、RDS for SQL Server DB インスタンスがマルチ AZ 配置にある場合、`tempdb` データベースの使用については、以下の考慮事項に留意してください。

プライマリ DB インスタンスからセカンダリ DB インスタンスに `tempdb` データをレプリケートすることはできません。セカンダリ DB インスタンスにフェイルオーバーすると、そのセカンダリ DB インスタンスの `tempdb` は空になります。

プライマリ DB インスタンスからセカンダリ DB インスタンスに、ファイルのサイズ設定や自動拡張設定などの `tempdb` データベースオプションの設定を同期できます。`tempDB` 設定の同期は、すべての RDS for SQL Server バージョンでサポートされています。次のストアドプロシージャを使用して、`tempdb` 設定の自動同期を有効にできます。

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

**重要**  
`rds_set_system_database_sync_objects` ストアドプロシージャを使用する前に、セカンダリ DB インスタンスではなく、プライマリ DB インスタンスで希望の `tempdb` 設定を行ってください。セカンダリ DB インスタンスで設定を変更した場合、自動同期を有効にすると、希望の `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();
```

例えば、`tempdb` 設定を 01:00 に変更してから `rds_fn_server_object_last_sync_time` 関数を実行した場合、`last_sync_time` として返される値は 01:00 より後であり、自動同期が発生したことを示します。

SQL Server Agent ジョブレプリケーションも使用している場合は、 `@object_type` パラメータで指定することで、SQL Agent ジョブと `tempdb` 設定の両方のレプリケーションを有効にできます。

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

SQL Server Agent ジョブのレプリケーションの詳細については、「[SQL Server エージェントジョブレプリケーションをオンにする](Appendix.SQLServer.CommonDBATasks.Agent.md#SQLServerAgent.Replicate)」を参照してください。

`rds_set_system_database_sync_objects` ストアドプロシージャを使用して `tempdb` 設定変更が自動的に同期されるようにする代わりに、次のいずれかの手動方法を使用できます。

**注記**  
`rds_set_system_database_sync_objects` ストアドプロシージャを使用して `tempdb` 設定の自動同期を有効にすることをお勧めます。自動同期を使用すると、`tempdb` 設定を変更するたびにこれらの手動タスクを実行する必要がなくなります。
+ まず DB インスタンスを変更してマルチ AZ を無効にします。次に tempdb を変更し、最後にマルチ AZ を再度有効にします。この方法に伴うダウンタイムはありません。

  詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。
+ まず元のプライマリインスタンスで `tempdb` を変更します。次に手動でフェイルオーバーし、最後に新しいプライマリインスタンスで `tempdb` を変更します。このメソッドではダウンタイムが生じます。

  詳しくは、「[ DB インスタンスの再起動](USER_RebootInstance.md)」を参照してください。