

# RDS Custom for SQL Server 支持更改数据捕获（CDC）
<a name="custom-sqlserver-features.cdc"></a>

## 概览
<a name="custom-sqlserver-features.cdc.overview"></a>

RDS Custom for SQL Server 为更改数据捕获（CDC）提供原生支持，使您能够跟踪和捕获 SQL Server 表中的数据修改。CDC 存储有关这些更改的详细元数据，以供后续检索和分析。有关 CDC 功能的详细信息，请参阅 Microsoft 文档中的 [Change data capture](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server#Capture)。

在 SQL Server 中执行 CDC 操作时，需要确保 `sys.servers` 中*本地服务器*（具有 `server_id` = 0）的值与 `SERVERPROPERTY('ServerName')` 标识符的值相匹配。RDS Custom for SQL Server 在实例的整个生命周期中自动保持这种同步，以确保 CDC 持续正常运行，即使在维护或恢复操作期间更换了主机也是如此。

**重要**  
在多可用区实例失效转移后，`SERVERPROPERTY('Servername')` 功能会自动反映网络/计算机名称的更改。但是，在重新启动 `MSSQLSERVER` 服务之前，`@@SERVERNAME` 函数会保留旧的服务器名称。失效转移后，查询 @@SERVERNAME 会返回先前的服务器名称。要在失效转移后获得准确的服务器名称，请使用以下 SQL 查询：  

```
SELECT name FROM sys.servers WHERE server_id=0
```
此查询无需重新启动服务，即可提供最新的服务器名称信息。

## 区域和版本可用性
<a name="custom-sqlserver-features.cdc.regionAvail"></a>

在 RDS Custom for SQL Server 可用的所有 AWS 区域中，对于 RDS Custom 支持的所有 SQL Server 版本，均支持 CDC 功能。有关 RDS Custom for SQL Server 支持的版本和区域可用性的更多信息，请参阅[支持 RDS Custom for SQL Server 的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.md#Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.sq)。

## 要求和限制
<a name="custom-sqlserver-features.cdc.reqsLims"></a>

在 RDS Custom for SQL Server 上实施 CDC 时，请注意以下关键注意事项：
+ 如果您在 `sys.servers` 中手动设置 `@@SERVERNAME` 和/或*本地服务器*以使用 MS 复制等功能，并且 `sys.servers` 中本地服务器（具有 `server_id = 0`）的值设置为与 `*.rds.amazonaws.com` 或 `*.awsrds.*.com` 匹配的格式，则 RDS Custom for SQL Server 不会尝试将其修改为与 `SERVERPROPERTY('ServerName')` 匹配。
+ 当远程登录名或链接服务器当前正在使用旧主机名时，RDS 无法将 `sys.servers` 中的本地服务器（具有 `server_id = 0`）修改为新主机名。此限制适用于两种情况：
  + 当链接服务器使用与旧主机名关联的远程登录名与本地服务器建立连接时
  + 当 RDS Custom for SQL Server 实例充当发布者或分发者，并对其订阅用户实例具有与旧主机名关联的链接登录名时。

## 故障排除
<a name="custom-sqlserver-features.cdc.Troubleshooting"></a>

要识别与旧服务器名称关联的远程登录名或链接登录名，请使用以下查询。验证结果并移除这些登录名，以确保 CDC 功能正常。

```
SELECT * FROM sys.remote_logins WHERE server_id=0
```

或

```
select sss.srvname,ssp.name,srl.remote_name  from sys.server_principals ssp 
inner join sys.remote_logins srl on srl.local_principal_id=ssp.principal_id
inner join sys.sysservers sss  on srl.server_id = sss.srvid
where sss.srvname = @@SERVERNAME
```