9.3. 设置 SQL Server 以运行 Debezium 连接器
要使 Debezium 从 SQL Server 表捕获更改事件,具有所需权限的 SQL Server 管理员必须首先运行查询,以便在数据库中启用 CDC。然后,管理员必须为您要 Debezium 捕获的每个表启用 CDC。
默认情况下,与 Microsoft SQL Server 的 JDBC 连接受 SSL 加密保护。如果没有为 SQL Server 数据库启用 SSL,或者您希望在没有使用 SSL 的情况下连接到数据库,您可以通过将连接器配置中的 database.encrypt
属性的值设置为 false
来禁用 SSL。
有关设置 SQL Server 以与 Debezium 连接器搭配使用的详情,请查看以下部分:
应用 CDC 后,它会捕获所有 INSERT
、UPDATE
和 DELETE
操作,它们提交到启用了 CDD 的表。然后,Debezium 连接器可以捕获这些事件并将其发送到 Kafka 主题。
9.3.1. 在 SQL Server 数据库中启用 CDC
在为表启用 CDC 之前,您必须为 SQL Server 数据库启用它。SQL Server 管理员通过运行系统存储的步骤启用 CDC。系统存储的流程可以使用 SQL Server Management Studio 运行,也可以使用 Transact-SQL 运行。
先决条件
- 您是 SQL Server 的 sysadmin 固定服务器角色的成员。
- 您是数据库的 db_owner。
- SQL Server Agent 正在运行。
SQL Server CDC 功能只处理在用户创建的表中发生的更改。您无法在 SQL Server master
数据库中启用 CDC。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Template Explorer。
- 在 Template Browser 中,展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后点 CDC 的 Enable Database。
-
在模板中,将
USE
语句中的数据库名称替换为您要为 CDC 启用的数据库的名称。 运行存储的步骤
sys.sp_cdc_enable_db
,为 CDC 启用数据库。为 CDC 启用数据库后,会创建一个名称
cdc
的模式,以及 CDC 用户、元数据表和其他系统对象。以下示例演示了如何为数据库
MyDB
启用 CDC:示例:为 CDC 模板启用 SQL Server 数据库
USE MyDB GO EXEC sys.sp_cdc_enable_db GO
9.3.2. 在 SQL Server 表中启用 CDC
SQL Server 管理员必须在您要捕获的源表中启用更改数据捕获。必须已经为 CDC 启用数据库。要在表中启用 CDC,SQL Server 管理员为表运行存储的步骤 sys.sp_cdc_enable_table
。可以使用 SQL Server Management Studio 或使用 Transact-SQL 运行存储的流程。对于您要捕获的每个表,必须启用 SQL Server CDC。
先决条件
- 在 SQL Server 数据库上启用了 CDC。
- SQL Server Agent 正在运行。
-
您是
db_owner
固定数据库角色的成员。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Template Explorer。
- 在 Template Browser 中,展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后单击 Enable Table Specifying Filegroup Option。
-
在模板中,将
USE
语句中的表名称替换为您要捕获的表的名称。 运行存储的步骤
sys.sp_cdc_enable_table
。以下示例演示了如何为表
MyTable
启用 CDC:示例:为 SQL Server 表启用 CDC
USE MyDB GO EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'MyTable', //<.> @role_name = N'MyRole', //<.> @filegroup_name = N'MyDB_CT',//<.> @supports_net_changes = 0 GO
<.> 指定要捕获的表的名称。<.> 指定角色
MyRole
,您可以将其添加到您要为源表捕获的列授予SELECT
权限的用户。sysadmin
或db_owner
角色的用户也有权访问指定的更改表。将@role_name
的值设置为NULL
,仅允许sysadmin
或db_owner
中的成员具有捕获信息的完整访问权限。<.> 指定 SQL Server 放置捕获表的filegroup
。namedfilegroup
必须已经存在。最好不要找到用于源表的同一filegroup
中的更改表。
9.3.3. 验证用户是否有权访问 CDC 表
SQL Server 管理员可以运行系统存储的步骤来查询数据库或表来检索其 CDC 配置信息。可以使用 SQL Server Management Studio 或使用 Transact-SQL 运行存储的流程。
先决条件
-
您有 capture 实例捕获的所有列的
SELECT
权限。db_owner
数据库角色的成员可以查看所有定义的捕获实例的信息。 - 您在为查询包括的表信息定义的任何 gating 角色中有一个成员资格。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Object Explorer。
- 从 Object Explorer,展开 Databases,然后展开您的数据库对象,如 MyDB。
- 展开 Programmability > Stored processs > System Stored process。
运行
sys.sp_cdc_help_change_data_capture
存储的流程来查询表。查询不应返回空结果。
以下示例在数据库
MyDB
上运行存储的步骤sys.sp_cdc_help_change_data_capture
:示例:查询 CDC 配置信息的表
USE MyDB; GO EXEC sys.sp_cdc_help_change_data_capture GO
查询会返回为 CDC 启用的每个表的配置信息,其中包含调用者有权访问的更改数据。如果结果为空,请验证用户具有访问捕获实例和 CDC 表的特权。
9.3.4. Azure 上的 SQL Server
Debezium SQL Server 连接器可用于 Azure 上的 SQL Server。有关在 Azure 上为 SQL Server 配置 CDC 并在 Debezium 中使用它的信息,请参阅此示例。https://learn.microsoft.com/en-us/samples/azure-samples/azure-sql-db-change-stream-debezium/azure-sql%2D%2Dsql-server-change-stream-with-debezium/
9.3.5. SQL Server 捕获服务器负载和延迟上的作业代理配置的影响
当数据库管理员为源表启用更改数据捕获时,捕获作业代理开始运行。代理从事务日志中读取新的更改事件记录,并将事件记录复制到更改数据表中。在源表中提交更改的时间以及更改出现在对应更改表中的时间,总有较小的延迟间隔。这个延迟间隔代表在源表中发生更改时以及 Debezium 可用于 Apache Kafka 的更改时之间的差距。
理想情况下,对于必须快速响应数据变化的应用程序,您希望在源和更改表之间保持关闭同步。您可能想,运行捕获代理以尽可能快地持续处理事件更改事件,可能会导致吞吐量增加,并减少 latency netobserv-wagoning 更改表,以便在事件发生后马上使用新事件记录(在最近实时发生)。但是,这不一定如此。在寻求更多即时同步时,需要支付性能损失。每次捕获作业代理查询数据库以获取新事件记录时,它会增加数据库主机上的 CPU 负载。服务器上的额外的负载可能会对整个数据库性能造成负面影响,并可能会降低事务效率,特别是在高峰数据库使用时。
监控数据库指标非常重要,以便您知道数据库是否达到服务器无法支持捕获代理的活动级别。如果您注意到性能问题,可以修改 SQL Server 捕获代理设置,以帮助平衡数据库主机上的总体 CPU 负载与可容忍的延迟程度。
9.3.6. SQL Server 捕获作业代理配置参数
在 SQL Server 上,控制捕获作业代理行为的参数在 SQL Server 表 msdb.dbo.cdc_jobs
中定义。如果您在运行捕获作业代理时遇到问题,请调整捕获作业设置,以通过运行 sys.sp_cdc_change_job
存储的步骤并提供新值来减少 CPU 负载。
有关如何配置 SQL Server 捕获作业代理参数的具体指导超出了本文档的范围。
以下参数对于修改捕获代理行为与 Debezium SQL Server 连接器一起使用的最显著:
pollinginterval
- 指定捕获代理在日志扫描周期之间等待的时间。
- 较高的值可减少数据库主机上的负载并增加延迟。
-
值
0
指定扫描之间没有等待。 -
默认值为
5
。
maxtrans
-
指定每个日志扫描周期内进程的最大事务数。在捕获作业处理指定数量的事务后,它会暂停
pollinginterval
指定下一次扫描开始前的时间长度。 - 较低值可减少数据库主机上的负载并增加延迟。
-
默认值为
500
。
-
指定每个日志扫描周期内进程的最大事务数。在捕获作业处理指定数量的事务后,它会暂停
maxscans
-
指定捕获作业可以尝试捕获数据库事务日志的扫描周期数的限制。如果
continuous
参数设为1
,则作业会在恢复扫描前暂停pollinginterval
指定的时间长度。 - 较低值可减少数据库主机上的负载并增加延迟。
-
默认值为
10
。
-
指定捕获作业可以尝试捕获数据库事务日志的扫描周期数的限制。如果
其他资源
- 有关捕获代理参数的更多信息,请参阅 SQL Server 文档。