

# Amazon RDS for SQL Server の変更データキャプチャの使用
<a name="Appendix.SQLServer.CommonDBATasks.CDC"></a>

Amazon RDS は、Microsoft SQL Server で実行されている DB インスタンスの変更データキャプチャをサポートします。CDC は、テーブル内のデータに行われる変更をキャプチャします。また、各変更に関するメタデータを保存します。これにより、後にアクセスできるようになります。CDC の動作の詳細については、Microsoft ドキュメントの「[変更データキャプチャ](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server#Capture)」を参照してください。Amazon RDS DB インスタンスで CDC を使用するには、`msdb.dbo.rds_cdc_enable_db` を実行して、データベース上で有効にします。CDC が有効になると、該当データベースの `db_owner` であるユーザーは誰でも、そのデータベースのテーブルの CDC を有効または無効にすることができます。

**重要**  
復元中、CDC は無効になります。関連するメタデータはすべて、データベースより自動的に削除されます。これは、スナップショット復元とポイントインタイムリストアに適用されます。これらの復元のいずれかを実行すると、CDC を再度有効にして、追跡するテーブルを再度指定できます。

DB インスタンスの CDC を有効にするには、`msdb.dbo.rds_cdc_enable_db` ストアドプロシージャを実行します。

```
1. exec msdb.dbo.rds_cdc_enable_db 'database_name'
```

DB インスタンスの 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)
+ [マルチ AZ インスタンスの変更データキャプチャ](#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

## マルチ AZ インスタンスの変更データキャプチャ
<a name="Appendix.SQLServer.CommonDBATasks.CDC.Multi-AZ"></a>

マルチ AZ インスタンスで CDC を使用する場合は、ミラーの CDC ジョブ設定がプリンシパルのいずれかと一致していることを確認します。CDC ジョブは、`database_id` にマッピングされています。セカンダリのデータベース ID がプリンシパルと異なる場合、そのジョブは正しいデータベースと関連付けられません。フェイルオーバー後のエラーを防ぐために、RDS によってジョブは削除され、新しいプリンシパルに再作成されます。再作成されたジョブでは、フェイルオーバー前に記録されたパラメータがプリンシパルによって使用されます。

このプロセスはすぐに実行されますが、RDS によって変更される前に CDC ジョブを実行できる場合があります。プリンシパルとセカンダリレプリカの間で一貫したパラメータを維持するには、次の 3 つの方法があります。
+ CDC を有効にしたすべてのデータベースに対して、同じジョブパラメータを使用する。
+ CDC ジョブ設定を変更する前に、マルチ AZ インスタンスを単一 AZ に変換する。
+ プリンシパルでパラメータを変更する場合は、必ず手動で転送する。

フェイルオーバー後に 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\$1jobs](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql) を使用します。