Debezium SQL Server连接器启动后未捕获CDC表问题排查
Debezium SQL Server连接器0表捕获问题排查方案
按问题命中概率从高到低排序,所有校验步骤均可直接在数据库侧完成,无需反复部署容器浪费时间:
- 最高概率根因:未开启表级CDC
Debezium SQL Server连接器筛选待捕获表时,会直接过滤掉未开启表级CDC的对象,仅开启库级CDC不会被识别,且该场景不会抛出权限类报错,仅会输出空的捕获表列表,和你日志中的现象完全一致。
直接在目标数据库执行以下SQL校验:
如果返回结果中SELECT s.name AS schema_name, t.name AS table_name, t.is_tracked_by_cdc FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name = 'testTable'is_tracked_by_cdc字段值为0,执行以下命令开启对应表的CDC即可:USE <你的业务数据库名>; EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'testTable', @role_name = NULL; - 次高概率根因:配置格式/拼写错误
你测试的5组配置里存在两类明确错误:table.include.list不允许添加数据库名前缀,仅支持<schema名>.<表名>的格式,所有带DBNAME.前缀的配置均无效- Debezium的列表匹配规则大小写敏感,必须和上述SQL查询返回的
schema_name、table_name值完全一致,不要自行调整大小写
正确的最小配置组合仅需保留以下两项,其余冗余配置全部删除即可:
"schema.include.list": "dbo", "table.include.list": "dbo.testTable" - 第三概率根因:连接账号权限不足
用你配置给Debezium的数据库账号执行以下SQL,能正常返回CDC表列表则权限正常,返回空或报错即为权限不足:
权限不足时执行以下语句授权:USE <你的业务数据库名>; SELECT * FROM cdc.change_tables;USE <你的业务数据库名>; GRANT SELECT ON SCHEMA :: cdc TO <Debezium连接账号名>; GRANT VIEW DATABASE STATE TO <Debezium连接账号名>; - 第四概率根因:未指定目标数据库名
SQL Server连接器必须显式配置database.dbname参数为你的业务数据库名,漏配时连接器会默认连接master库,自然无法识别业务库下的表。
排障提效提示
Kafka Topic是否提前创建和该问题完全无关:Debezium只有识别到待捕获表之后,才会进入Topic相关的校验/创建逻辑,提前建Topic属于无效操作。
无需每次重新部署Docker容器等25分钟,直接在本地拉取和生产版本一致的Debezium镜像,挂载配置文件本地启动,1分钟即可完成一轮配置校验。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

