

# 在 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\_cdc\_enable\_table](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\_cdc\_help\_change\_data\_capture](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\_cdc\_enable\_table](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-enable-table-transact-sql) 和 [sp\_cdc\_start\_job](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-start-job-transact-sql)。要更改 CDC 作业参数（例如 `maxtrans` 和 `maxscans`），您可以使用 [sp\_cdc\_change\_jobs](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql)。

要获取有关 CDC 作业的更多信息，您可以查询以下动态管理视图：
+ sys.dm\_cdc\_errors
+ sys.dm\_cdc\_log\_scan\_sessions
+ 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\_cdc\_change\_job](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql)。