为RDI准备SQL Server
准备SQL Server数据库以与RDI配合使用
为了为Debezium准备您的SQL Server数据库,您必须首先运行一个查询以全局启用CDC,然后分别为您想要捕获的每个表启用CDC。您需要管理员权限才能执行此操作。
一旦启用CDC,它就会捕获所选表上的所有INSERT、UPDATE和DELETE操作。然后,Debezium连接器可以将这些事件发送到Kafka主题。
1. 在数据库上启用CDC
有两个系统存储过程可以启用CDC(你需要管理员权限来运行这些)。使用sys.sp_cdc_enable_db
来为整个数据库启用CDC,然后你可以使用SQL Server Management Studio或Transact-SQL来运行这个过程。
在运行程序之前,请确保:
- 您是 SQL Server 的
sysadmin
固定服务器角色的成员。 - 您是数据库的
db_owner
。 - SQL Server 代理正在运行。
然后,按照以下步骤启用CDC:
-
从SQL Server Management Studio的视图菜单中,点击模板资源管理器。
-
在模板浏览器中,展开SQL Server 模板。
-
展开变更数据捕获 > 配置,然后点击为数据库启用CDC。
-
在模板中,将
USE
语句中的数据库名称替换为您想要启用CDC的数据库名称。例如,如果您的数据库名为myDB
,则模板应为:USE MyDB GO EXEC sys.sp_cdc_enable_db GO
-
运行存储过程
sys.sp_cdc_enable_db
以启用数据库的CDC。
当您为数据库启用CDC时,它会创建一个名为cdc
的模式,并且还会创建一个CDC用户、元数据表和其他系统对象。
保持变更数据捕获 > 配置折叠面板在模板资源管理器中打开,因为你接下来需要它来在单个表上启用CDC。
2. 为您想要捕获的表启用CDC
您还必须按照以下步骤在您希望Debezium捕获的表上启用CDC(同样,您需要管理员权限才能执行此操作):
-
在模板资源管理器中仍然打开更改数据捕获 > 配置折叠菜单时,选择启用表指定文件组选项。
-
在模板中,将USE语句中的表名替换为您想要捕获的表的名称。例如,如果您的表名为
MyTable
,那么模板将如下所示: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
-
运行存储过程
sys.sp_cdc_enable_table
以为表启用CDC。 -
对每个你想要捕获的表重复步骤1到3。
3. 检查您是否有权访问CDC表
你可以使用另一个存储过程 sys.sp_cdc_help_change_data_capture
来查询数据库的CDC信息,并检查你是否正确启用了它。在执行此操作之前,请检查以下内容:
- 您对捕获实例的所有捕获列拥有
SELECT
权限。 如果您是db_owner
数据库角色的成员,那么您可以查看所有已定义捕获实例的信息。 - 您是查询中包含的表所定义的任何门控角色的成员。
按照以下步骤运行 sys.sp_cdc_help_change_data_capture
:
-
从SQL Server Management Studio的视图菜单中,点击对象资源管理器。
-
从对象资源管理器中,展开数据库,然后展开您的数据库对象,例如,
MyDB
。 -
展开 可编程性 > 存储过程 > 系统存储过程。
-
运行
sys.sp_cdc_help_change_data_capture
存储过程来查询表。例如,如果您的数据库名为MyDB
,那么您将运行以下内容:USE MyDB; GO EXEC sys.sp_cdc_help_change_data_capture GO
-
查询返回数据库中每个启用了CDC并包含您有权访问的更改数据的表的配置信息。如果结果为空,则应检查您是否有权限访问捕获实例和CDC表。
Azure 上的 SQL Server
你也可以在Azure上使用Debezium SQL Server连接器与SQL Server。 有关更多信息,请参阅Microsoft的指南 配置Azure上的SQL Server以使用Debezium进行CDC。
SQL Server 捕获作业代理配置参数
在SQL Server中,控制捕获作业代理行为的参数在SQL Server表msdb.dbo.cdc_jobs
中定义。如果您在运行捕获作业代理时遇到性能问题,可以调整捕获作业设置以减少CPU负载。为此,请使用新的参数值运行sys.sp_cdc_change_job
存储过程。
以下参数是修改Debezium SQL Server连接器的捕获代理行为最重要的参数:
pollinginterval
: 这指定了捕获代理在日志扫描周期之间等待的秒数。较高的值会减少数据库主机的负载,但会增加延迟。值为0表示扫描之间没有等待。默认值为5。maxtrans
: 这指定了每次日志扫描周期中要处理的最大事务数。在捕获作业处理了指定数量的事务后,它会暂停pollinginterval
指定的时间长度,然后开始下一次扫描。较低的值会减少数据库主机的负载,但会增加延迟。默认值为500。maxscans
: 这指定了捕获作业在捕获数据库事务日志的完整内容时可以尝试的扫描周期数的限制。如果continuous参数设置为1,作业会在继续扫描之前暂停pollinginterval
指定的时间长度。较低的值会减少数据库主机的负载,但会增加延迟。默认值为10。
有关捕获代理参数的更多信息,请参阅SQL Server文档。
处理模式更改
当你在SQL Server中更改CDC表的模式时,RDI无法自动适应。例如, 如果你向正在捕获的表中添加一个新列,RDI将生成错误 而不是正确捕获更改。有关更多信息,请参阅Debezium的 SQL Server模式演变 文档。
如果您拥有管理员权限,您可以按照以下步骤在模式更改后更新RDI并恢复CDC。有关更多详细信息,请参阅在线模式更新文档。
-
对源表模式进行更改。
-
通过运行
sys.sp_cdc_enable_table
存储过程,为更新的源表创建一个新的捕获表,并为参数@capture_instance
指定一个新的唯一值。例如,如果旧值是dbo_customers
,你可以将其替换为dbo_customers_v2
:EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'customers', @role_name = NULL, @supports_net_changes = 0, @capture_instance = 'dbo_customers_v2'; GO
-
当Debezium开始从新的捕获表流式传输时,通过运行
sys.sp_cdc_disable_table
存储过程并设置参数@capture_instance
为旧的捕获实例名称dbo_customers
来删除旧的捕获表:EXEC sys.sp_cdc_disable_table @source_schema = 'dbo', @source_name = 'dbo_customers', @capture_instance = 'dbo_customers'; GO
@capture_instance
值(步骤2)之间的时间间隔内发生的变化。
尽量缩短这个时间间隔,或者在预计数据变化较少的时候进行更新。