

# Amazon RDS for SQL Server에 변경 데이터 캡처 사용
<a name="Appendix.SQLServer.CommonDBATasks.CDC"></a>

Amazon RDS는 Microsoft SQL Server를 실행하는 DB 인스턴스에 대해 CDC(변경 데이터 캡처)를 지원합니다. 테이블의 데이터에 대한 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. ;
```

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 동작을 제어하려면 [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)과 같은 기본 SQL Server 절차를 사용합니다. `maxtrans` 및 `maxscans`와 같은 CDC 작업 파라미터를 변경하려면 [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

## 다중 AZ 인스턴스에 대한 변경 데이터 캡처
<a name="Appendix.SQLServer.CommonDBATasks.CDC.Multi-AZ"></a>

다중 AZ 인스턴스에서 CDC를 사용하는 경우 미러의 CDC 작업 구성이 보안 주체에 있는 것과 일치해야 합니다. CDC 작업은 `database_id`로 매핑됩니다. 보조의 데이터베이스 ID가 보안 주체의 ID와 다른 경우 작업이 올바른 데이터베이스와 연결되지 않습니다. 장애 조치 이후 오류를 방지하기 위해 RDS는 작업을 취소하고 새 보안 주체에 작업을 다시 생성합니다. 다시 생성된 작업은 장애 조치 이전에 보안 주체가 기록한 파라미터를 사용합니다.

이 프로세스가 빠르게 실행되기는 하지만 CDC 작업은 RDS가 이를 수정하기 전에 실행될 수 있습니다. 기본 복제본과 보조 복제본 사이의 파라미터를 강제로 일관되게 하는 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\$1job](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-change-job-transact-sql)을 대신 사용합니다.