

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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。所有相關中繼資料會自動從資料庫移除。這適用於快照還原和point-in-time還原。執行其中一個還原類型後，您就可以重新啟用 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. ;
```

如需 SQL Server 文件中 CDC 資料表、函數和預存程序的詳細資訊，請參閱下列：
+ [變更資料擷取預存程序 (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\$1job.](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 會在新委託人上放置並重新建立任務。重新建立的任務會使用委託人在容錯移轉之前記錄的參數。

儘管此程序的執行速度很快，但在 RDS 可更正 CDC 任務前這些任務可能仍會執行。以下是強制讓主要和次要複本之間的參數一致的三個方式：
+ 對已啟用 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)。