

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