13594780322

加密货币,让财富增值再简单不过!

在 Amazon RDS for SQL Server 上配置变更数据捕获参数 数据库博客

在 Amazon RDS for SQL Server 上配置变更数据捕获参数 数据库博客

发表时间:2026-01-27

浏览次数:8

在 Amazon RDS for SQL Server 上配置变更数据捕获参数

关键要点

在这篇文章中,我们详细探讨了如何在 Amazon RDS for SQL Server 上配置变更数据捕获 (CDC) 参数,以确保 AWS 数据库迁移服务AWS DMS有效捕获数据库表中的变更。启用 CDC 可以帮助您在数据库迁移过程中保持高可用性。我们将讨论 CDC 的基本概念、AWS DMS 如何与 SQL Server 一起工作、参数调优的实际步骤,以及一些最佳实践。

AWS 数据库迁移服务AWS DMS是一个托管的迁移和复制服务,能够快速且安全地将数据库和分析工作负载迁移至 AWS。在迁移过程中,源数据库保持完全运营,尽量减少依赖数据库的应用程序的停机时间。AWS DMS 能够从大多数商业和开源数据库迁移数据至 AWS,也能从 AWS 迁移数据到这些数据库。

SQL Server 是 Microsoft 开发的一款关系数据库。Amazon RDS for SQL Server 简化了在云中设置、运营和扩展 SQL Server 部署的过程。Amazon RDS 支持通过 CDC 进行数据复制,且启用 CDC 是使用 AWS DMS 配合 Amazon RDS for SQL Server 的前提之一。CDC 捕获对数据库表中数据所做的更改,并存储有关每次更改的元数据,以便后续访问。

在本文中,我们将深入探讨 CDC 参数,并解释这些参数在配置 AWS DMS 时的影响,同时还会讨论一些最佳实践。

前提条件

要跟随本文进行操作,您需要熟悉以下 AWS 服务:

AWS DMSAmazon RDS for SQL Server

此外,您需要一个具备足够权限的 AWS 账户,以便启动此解决方案所需的资源。

AWS DMS 如何与 Amazon RDS for SQL Server 协同工作

在 Amazon RDS for SQL Server 中,AWS DMS 使用 Microsoft 函数读取事务日志Tlog,默认获取前 50000 个事件。AWS DMS 首先查询数据库日志中的特定分区 ID,这与在 AWS DMS 任务 中定义的表关联。在每次表重新加载、任务重启和任务继续的过程中,都会读取这些分区 ID。AWS DMS 获取对象 ID,并获取与这些对象 ID 相关的数据分区 ID。获得分区 ID 后,将会从 Tlog 中提取相关的分区。此循环每秒钟运行一次。

下图展示了关联的架构示例,以 Amazon RDS for SQL Server 作为数据源。AWS DMS 任务的目标可以是任何 支持的端点。

AWS DMS 通过 Microsoft 函数读取 Tlog,并要求源数据库及其将包含在 AWS DMS 任务范围内的表启用 CDC。

为什么 AWS DMS 需要 CDC?

当在表上启用 CDC 时,SQL Server 会为该表创建一个位于 cdc 架构中的表。该变更表将包含变更数据,并根据被追踪的架构和表名称被命名。例如,如果您有一个名为 customer 的表在 dbo 架构下,则会在 cdc 架构中创建一个名为 cdccustomerCT 的表来记录所有对 dbocustomer 表所做的更改。

AWS DMS 并不直接从变更表中读取数据。AWS DMS 环境下要求启用 CDC,以确保在 Tlog 中捕获增强的日志记录供 AWS DMS 读取。如前所述,AWS DMS 使用 Microsoft 函数读取 Tlog。以下是在源数据库中的示例表:

sqlCREATE TABLE [dbo][dmstest]( [id] [int] NOT NULL [name] [varchar](50) NULL CONSTRAINT [PKdmstest] PRIMARY KEY CLUSTERED ( [id] ASC ) WITH (PADINDEX = OFF STATISTICSNORECOMPUTE = OFF IGNOREDUPKEY = OFF ALLOWROWLOCKS = ON ALLOWPAGELOCKS = ON OPTIMIZEFORSEQUENTIALKEY = OFF) ON [PRIMARY]) ON [PRIMARY]

如果您在该表上执行 UPDATE 语句并更新 [name] 列,您将看到启用和禁用 CDC 时 [RowLog Contents 0] 和 [RowLog Contents 1] 之间的差异。由于篇幅限制,以下是 AWS DMS 在源数据库上执行的查询的一个片段:

sqlselect top 50000 [Current LSN] [operation] [RowLog Contents 0] [RowLog Contents 1] After Image

查询的输出显示第二条记录中捕获的完整信息在启用 CDC 后发出的 UPDATE 语句。

Current LSNoperationRowLog Contents 0RowLog Contents 10000014f0000c16d0002LOPMODIFYROW0x18007465737475736572670x1900746573747573657261620000014f0000c9ba0016LOPMODIFYROW0x300008000200000002000001001900746573747573657261620x300008000200000002000001001800746573747573657267

理解 CDC 参数

对于 CDC,会创建两个作业:

在 Amazon RDS for SQL Server 上配置变更数据捕获参数 数据库博客捕获作业 扫描 Tlog 文件以读取更改,并将这些更改推送至变更跟踪表清理作业 清除已超出保留期的变更跟踪表记录

以下是与 AWS DMS 有关的 CDC 参数:

maxtrans 每次扫描周期内要处理的最大事务数maxscans 提取日志中所有行所需的最大扫描周期数量continuous 捕获作业是否应连续运行1或仅运行一次0pollinginterval 日志扫描周期之间的秒数retention 变更行在变更表中保留的分钟数

虽然 AWS DMS 并不读取变更表,但您必须调优 CDC 参数以控制 Tlog 中变更的保留时间。

在下一节中,我们将解释参数 maxtrans、maxscans 和 pollinginterval 如何帮助保留 Tlog 中的日志记录,以及如何调优它们以确保 AWS DMS 能够在足够的时间内捕获变更。

CDC 参数的实际操作

我们将通过以下步骤来说明这些参数:

创建一个名为 dmscdc 的数据库和一个名为 dmstestcdc 的表:

sql create database dmscdc use dmscdc CREATE TABLE dbodmstestcdc(n INT NOT NULL PRIMARY KEY)

在 dmscdc 数据库和 dmstestcdc 表上启用 CDC:

sql exec msdbdbordscdcenabledb dmscdc use dmscdc exec sysspcdcenabletable @sourceschema = dbo @sourcename = dmstestcdc @rolename = CDCRole @supportsnetchanges = 1

您需要调优 CDC 参数,以确保日志记录在足够的时间内保留,以便 AWS DMS 能查询到事务记录,即它在源数据库的事务日志文件中要查找的特定日志序列号LSN。这些会受到以下因素的影响:

目标与源之间的事务差距有多少?轮询间隔是多少,特别是 CDC 作业运行的频率?

Maxtrans 和 Maxscans 的值是什么?这些参数决定了 CDC 在每次运行时将处理多少事务。

配置捕获作业,如下所示。每次更改捕获作业参数时在我们的例子中是 pollinginterval,必须停止并启动 CDC 作业:

sql EXECUTE sysspcdcchangejob @jobtype = Ncapture @pollinginterval = 3599 设置轮询间隔为 1 小时

EXEC sysspcdcstopjob @jobtype = Ncapture EXEC sysspcdcstartjob @jobtype = Ncapture

通过运行以下命令确认 CDC 参数:

sql exec sysspcdchelpjobs

jobidjobtypejobnamemaxtransmaxscanscontinuouspollingintervalretentionthresholdA49487C5BF3C4A8C93856AFA7A3541B9capturecdcdmscdccapture5001013599001751102059D24C9EBEA90578C0D23B11cleanupcdcdmscdccleanup000043205000

在上述设置下,捕获作业将在每小时处理 5000 条记录maxtrans maxscans。

向表 dmstestcdc 中插入一些记录以确认这一点:

sql DECLARE @max AS INT @min AS INT SET @max = 100000 SET @min = 1

梯子vp

WHILE @min lt= @max BEGIN INSERT INTO dbodmstestcdc VALUES(@min) SET @min=@min1 END

捕获作业从 Tlog 中读取上述事务,并将其标记为 replicated,在我们的例子中为 100001 条记录。当 CDC 作业运行时,捕获作业将标记这些事务为完成。

运行以下查询检查 CDC 会话,应该会取回 10 行。该查询将告诉我们 CDC 处理的记录数量,在我们的例子中是 5000:

sql SELECT trancount starttime endtime scanphase FROM sysdmcdclogscansessions WHERE scanphase ltgtAggregate ORDER BY endtime DESC

trancountstarttimeendtimescanphase50020231207 20341510020231207 203415123Done50020231207 20341506720231207 203415083Done50020231207 20341503720231207 203415053Done50020231207 20341500320231207 203415023Done50020231207 20341496320231207 203414990Done50020231207 20341492720231207 203414950Done50020231207 20341488320231207 203414910Done50020231207 20341484020231207 203414870Done50020231207 20341479720231207 203414827Done50020231207 20341454020231207 203414773Done

以上记录将在 Amazon RDS for SQL Server 上进行 Tlog 备份时被清除,通常为每 5 分钟,这帮助保持 Tlog 的大小并将 LSN 向前移动。剩余的记录95001将在捕获作业的后续运行中被处理。

SQL Server 不会在交易被 CDC 读取之前就冲洗 Tlog。您需要在保留 Tlog 中的记录数量和 AWS DMS 复制延迟之间取得平衡。在此情况下,我们通过定义更短的轮询间隔使捕获作业参数变得激进;此时可能出现 LSN 在 Tlog 中缺失的情况。为了避免 Tlog 被截断,并确保更改在 Tlog 中保持足够的时间,我们建议将轮询间隔设置为 1 天,执行以下命令:

sqluse dbnameEXEC sysspcdcchangejob @jobtype = capture @pollinginterval = 86399exec spcdcstopjob captureexec spcdcstartjob capture

捕获 CDC 的历史信息

要监控捕获作业的历史信息,您可以查询 sysdmcdclogscansessions 表。该表为当前数据库中的每个日志扫描会话包含一行。最多可包含 32 个扫描会话。运行以下查询以获取最新的 10 条记录:

sqlSELECT sessionid starttime endtime duration scanphaseerrorcount trancount commandcount lastcommitcdctime latency emptyscancount failedsessionscountFROM sysdmcdclogscansessionsORDER BY endtime DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

以下是输出的示例:

sessionidstarttimeendtimedurationscanphaseerrorcounttrancountcommandcountlastcommitcdctimelatencyemptyscancountfailedsessionscount020231207 19212728320231208 0034128376Aggregate012500112500120231207 195032657170200065120231208 00341282020231208 0034128370Done050050020231207 195032657170200065020231208 00341279020231208 0034128100Done050050020231207 195031700170210064920231208 00341276020231208 0034127800Done050050020231207 195030707170220064820231208 00341270320231208 0034127230Done050050020231207 195029757170230064720231208 00341267020231208 0034126930Done0500