SQL Server CDC数据增量抽取

本文介绍了如何使用 SQL Server CDC 客户端源从 CDC 表中提取数据增量。内容涵盖安装 JDBC 驱动、支持的操作、时间窗口配置、多线程处理等,详细解析了如何配置和优化 CDC 数据处理,适用于数据库复制和数据同步场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL Server CDC 客户端

支持的管道类型:
  • 数据收集器

SQL 服务器 CDC 客户端源处理微软 SQL 服务器更改数据捕获 (CDC) 表中的数据。源获取时间窗口的变化,并使用多个线程来启用数据的并行处理。

使用 SQL 服务器 CDC 客户端源从 CDC 表生成记录。若要从微软 SQL 服务器更改跟踪表中读取数据,请使用 SQL 服务器更改跟踪源。有关 CDC 和更改跟踪数据之间的差异的详细信息,请参阅 Microsoft SQL 服务器文档

SQL 服务器 CDC 客户端源在记录标头属性中包含 CRUD 操作类型,因此启用了 CRUD 的目标可以轻松处理生成的记录。有关数据收集器更改数据处理的概述以及启用了 CRUD 的目标的列表,请参阅处理已更改的数据

您可以使用此源来执行数据库复制。您可以将单独的管道与 JDBC 查询使用者或 JDBC 多表使用者源结合使用,以读取现有数据。然后,使用 SQL Server CDC 客户端源启动管道以处理后续更改。

配置源时,请指定 SQL Server 捕获实例名称 - 源处理相关的 CDC 表。可以定义同一数据库中的表组以及要使用的任何初始偏移量。省略初始偏移量时,原点将处理 CDC 表中的所有可用数据。

您可以启用延迟表处理,以允许源处理管道启动后出现的表。您还可以配置源以检查已处理表中的架构更改,并在发现更改后生成事件。

要确定源连接到数据库的方式,请指定连接信息、查询间隔、重试次数以及所需的任何定制 JDBC 配置属性。 您可以配置高级连接属性。要使用早于 4.0 的 JDBC 版本,请指定驱动程序类名并定义运行状况检查查询。

源可以为事件流生成事件。有关数据流触发器和事件框架的详细信息,请参阅数据流触发器概述

安装 JDBC 驱动程序

在使用 SQL 服务器 CDC 客户端源之前,请为数据库安装 JDBC 驱动程序。在安装所需的驱动程序之前,您无法访问数据库。

注意:流集已使用适用于 SQL 服务器的微软 JDBC 驱动程序 4.2 测试了 SQL Server 2017 的 SQL 服务器 CDC 客户端源。

有关安装其他驱动程序的信息,请参阅安装外部库

支持的操作

SQL 服务器 CDC 客户端源支持 SQL 服务器插入和删除操作。在更新操作之后捕获的更新被视为更新,在更新操作之前捕获的更新被视为不受支持的操作。

时间窗口

SQL 服务器 CDC 客户端源从时间窗口中的表中提取更改。默认情况下,源在一个时间窗口中获取更改,从上次提交的偏移量开始,以最新数据结束。当您有大量数据时,可以通过配置多个时间窗口来提高性能。

若要配置多个时间窗口,请将“最大事务长度”属性设置为所需的时间窗口的所需大小。第一个时间窗口从初始偏移量或上次保存的偏移量开始,并在指定的秒数后结束。下一个窗口从上一个窗口结束的位置开始,并在指定的秒数后结束,依此类推。在每个时间范围内,源会根据批处理设置创建批处理。

启用事件生成后,即使后续时间窗口仍保留以供处理,源也会在每个时间窗口结束时生成无更多数据事件。

当在首次时间窗口期间没有更改时,预览数据不会显示任何值。

多线程处理

SQL Server CDC 客户端源执行并行处理,并允许创建多线程管道。

启动管道时,SQL Server CDC 客户端源将检索与表配置中定义的源表关联的 CDC 表的列表。然后,源根据“线程数”属性使用多个并发线程。每个线程从单个表中读取数据。

注意:“高级”选项卡上的“最大池大小”属性定义了源可以与数据库建立的最大连接数。它必须等于或大于为“线程数”属性定义的值。

在管道运行时,每个线程都连接到源系统,创建一批数据,并将该批数据传递给可用的管道运行程序。管道运行程序是无源管道实例 - 管道的实例,包括管道中的所有处理器和目标,并在源之后执行所有管道处理。

每个管道运行程序一次处理一个批处理,就像在单个线程上运行的管道一样。当数据流变慢时,管道运行器会闲置等待,直到需要它们,并定期生成一个空批处理。可以配置“运行器空闲时间”管道属性以指定间隔或选择退出空批处理生成。

多线程管道保留每个批处理中的记录顺序,就像单线程管道一样。但是,由于批处理由不同的管道运行程序处理,因此无法确保将批处理写入目标的顺序。

有关多线程管道的更多信息,请参见多线程管道概述

假设您正在阅读10张表格。将“线程数”属性设置为 5,将“最大池大小”属性设置为 6。启动管道时,源将检索表列表。然后,源创建五个线程以从前五个表中读取,默认情况下,数据收集器将创建匹配数量的管道运行程序。接收到数据后,线程将一个批处理传递给每个管道运行器进行处理。

在任何给定时刻,五个管道运行程序可以分别处理一个批处理,因此此多线程管道一次最多可以处理五个批处理。当传入数据变慢时,管道运行程序将处于空闲状态,一旦数据流增加,就可以使用。

批处理策略

每个源线程从单个表创建一批数据。您可以定义线程用于创建每个批处理的以下策略之一:

处理表中的所有可用行

每个线程从一个表创建多个批次的数据,直到从该表中读取所有可用行。线程对从表创建的所有批处理运行一个 SQL 查询。然后,线程切换到下一个可用表,运行另一个 SQL 查询以读取该表中的所有可用行。

例如,假设源的批大小设置为 100。源配置为使用两个并发线程并从四个表中读取,每个表包含 1,000 行。第一个线程运行一个 SQL 查询,从 table1 创建 10 个批次,每个批次 100 行,而第二个线程使用相同的策略从 table2 读取数据。完全读取表 1 和表 2 后,线程将切换到表 3 和表 4 并完成相同的过程。当第一个线程完成对 table3 的读取时,该线程将切换回下一个可用表,以从上次保存的偏移量中读取所有可用数据。

交换表

每个线程根据“结果集中的批处理”属性从一个表创建一组批处理,然后切换到下一个可用表以创建下一组批处理。线程运行初始 SQL 查询以从表中创建第一组批处理。数据库将结果集中的其余行缓存在数据库中,以便同一线程再次访问,然后该线程切换到下一个可用表。在以下情况下可以使用一个表:
  • 该表没有打开的结果集缓存。在这种情况下,线程运行初始 SQL 查询以创建第一个批处理,缓存数据库中结果集中的其余行。
  • 该表具有由同一线程创建的打开的结果集缓存。在这种情况下,线程从数据库中的结果集缓存创建批处理,而不是运行另一个 SQL 查询。

当表具有由另一个线程创建的打开的结果集缓存时,该表不可用。在结果集关闭之前,任何其他线程都无法从该表中读取数据。

配置切换表策略时,请定义结果集缓存大小以及线程可以从结果集创建的批数。线程创建配置的批处理数后,数据库将关闭结果集,然后其他线程可以从表中读取。

注意:默认情况下,源指示数据库缓存无限数量的结果集。线程可以从该结果集创建无限数量的批处理。

例如,假设源的批大小设置为 100。源配置为使用两个并发线程并从四个表中读取,每个表包含 10,000 行。将结果集缓存大小设置为 500,并将从结果集中读取的批数设置为 5。

线程 1 对表 1 运行 SQL 查询,该查询返回所有 10,000 行。线程在读取前 100 行时创建一个批处理。接下来的 400 行将作为结果集缓存在数据库中。由于 thread2 同样处理表 2,因此 thread1 切换到下一个可用表 table3,并重复相同的过程。从 table3 创建批处理后,thread1 将切换回 table1,并从它以前在数据库中缓存的结果集中检索下一批行。

在 thread1 使用 table1 的结果集缓存创建五个批处理后,数据库将关闭结果集缓存。Thread1 切换到下一个可用表。另一个线程运行 SQL 查询以从 table1 中读取其他行,从上次保存的偏移量开始。

表配置

配置 SQL 服务器 CDC 客户端时,可以使用一组表配置属性定义多个 CDC 表。您还可以定义多个表配置来处理多组 CDC 表。

定义表配置时,可以为每组表定义以下属性:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVASoftEngineer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值