8.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 后,它会捕获提交给启用 CDD 的表的所有 INSERT
、UPDATE
和 DELETE
操作。然后 Debezium 连接器可以捕获这些事件并将其发送到 Kafka 主题。
8.3.1. 在 SQL Server 数据库中启用 CDC
在为表启用 CDC 前,您必须为 SQL Server 数据库启用它。SQL Server 管理员通过运行系统存储的步骤来启用 CDC。可使用 SQL Server Management Studio 或使用 Transact-SQL 运行系统存储的步骤。
先决条件
- 您是 SQL Server 系统管理员 固定服务器角色的成员。
- 您是数据库的 db_owner。
- SQL Server Agent 正在运行。
SQL Server CDC 功能处理仅在用户创建的表中发生的更改。您不能在 SQL Server master
数据库上启用 CDC。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Template Explorer。
- 在 模板浏览器中, 展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后点 Enable Database for CDC。
-
在模板中,将
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
8.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。
- 在 模板浏览器中, 展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后点 Enable Table Specifying Filegroup options。
-
在模板中,将
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
必须已经存在。最好不要在用于源表的同一filegroup
中找到更改表。
8.3.3. 验证用户有权访问 CDC 表
SQL Server 管理员可以运行系统存储的步骤,以查询数据库或表以检索其 CDC 配置信息。可使用 SQL Server Management Studio 或使用 Transact-SQL 运行存储的步骤。
先决条件
-
您有对捕获实例的所有捕获列的
SELECT
权限。db_owner
数据库角色的成员可以查看所有定义的捕获实例的信息。 - 在为查询包含的表信息定义的任何 gating 角色中都有成员资格。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Object Explorer。
- 在 Object Explorer 中,展开 Databases,然后扩展您的数据库对象,如 MyDB。
- 展开 Programmability > Stored stepss > System Stored procedures。
运行
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 表。
8.3.4. Azure 上的 SQL Server
Debezium SQL Server 连接器可用于 Azure 上的 SQL Server。有关在 Azure 上为 SQL Server 配置 CDC 并在 Debezium 中使用它的信息,请参阅此示例。
8.3.5. SQL Server 捕获作业代理配置对服务器负载和延迟的影响
当数据库管理员为源表启用数据捕获时,捕获作业代理开始运行。代理从事务日志中读取新的更改事件记录,并将事件记录复制到更改数据表中。在源表中提交更改的时间之间,更改在对应的更改表中出现的时间,始终会有一个小的延迟间隔。这个延迟间隔代表了在源表中更改时以及 Debezium 被流传输到 Apache Kafka 间的差距。
理想情况下,对于必须快速响应数据更改的应用程序,您希望在源和更改表之间保持同步。您可能希望运行捕获代理来持续处理更改事件,可能会导致吞吐量增加吞吐量,并减少在事件发生后尽快使用新的事件记录更改表。然而,这不一定是这种情况。在更直接同步时,会牺牲性能损失。每次捕获作业代理查询数据库以获取新事件记录时,它会增加数据库主机上的 CPU 负载。服务器上的额外负载可能会对整体数据库性能造成负面影响,并可能会降低事务效率,特别是在峰值数据库使用期间。
监控数据库指标非常重要,以便您知道数据库是否达到服务器不再支持捕获代理级别的活动点。如果您发现性能问题,您可以修改 SQL Server 捕获代理设置,以帮助平衡具有可容忍延迟的数据库主机上的总体 CPU 负载。
8.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
在恢复扫描前暂停轮询interval 指定的时间长度。 - 较低值可减少数据库主机上的负载并增加延迟。
-
默认值为
10
。
-
指定捕获作业可以尝试捕获数据库事务日志的所有内容的扫描周期数量的限制。如果将
其他资源
- 有关捕获代理参数的更多信息,请参阅 SQL Server 文档。