当前位置: 首页 > news >正文

FlinkCDC初始化时报错“IllegalArgumentException: Unexpected input: “异常定位与原理分析

本篇是纯技术文章,是排查线上问题的真实记录。这个异常我在网上没搜到相同案例,所以特此记录下,方便后期回顾。

一、背景

利用FlinkCDC3.0动态监听数据库Schema变更的能力开发了一个生产数据库DDL语句变更审计告警的服务,这两天突然发现服务一直报错,经过4个小时的排查,找到了告警原因和为什么会导致服务异常。

二、报错原因

通过观察下面这张图的堆栈信息,能够发现 FlinkCDC 在底层运用的是debezium中的io.debezium.relational.TableIdParser类,而该类抛出了参数不合法异常,具体表现为 “Unexpected input: d” 这一提示信息。
在这里插入图片描述

先说结论:这个错的原因就是数据库中的表名出现了空格导致的。

三、报错根因

从源码角度去分析。

第一步:

在任务初始化阶段,会通过Debeziumio.debezium.relational.TableId.parse(String str, boolean useCatalogBeforeSchema)静态方法调用io.debezium.relational.TableId.parseParts(str)方法对数据库内所有表名包含的字符进行校验工作。前文所提到的报错情况,实际上就是在这一校验步骤中出现的。如下图:

在这里插入图片描述

第二步:

io.debezium.relational.TableIdParser类主要用于解析库表信息。在数据库环境中,我们都知道表名通常具有一定的结构,可能包含数据库名、模式(schema)名和表的实际名称等多个部分。这个类能够将一个完整的表标识符(如包含数据库、模式和表名的字符串)分解为这些组成部分。

例如,在一个复杂的数据库系统中,表的完整标识符可能是 “mydatabase.myschema.mytable” 的形式。io.debezium.relational.TableIdParser类可以将这个字符串解析为 “mydatabase”(数据库名)、“myschema”(模式名)和 “mytable”(表名)这几个单独的部分,以便在后续的操作中(如数据同步、变更追踪等)能够准确地识别和处理这些不同层次的信息。

io.debezium.relational.TableIdParser.parse(String identifier)方法接收到需要解析的表名字符串(也就是identifier参数所传入的内容)后,其重点调用了io.debezium.relational.TokenStream.start()方法,该方法是整个表名解析流程的起始触发点。

在这里插入图片描述

第三步:

在创建io.debezium.relational.TokenStream对象时,会把接收到的表名转换为字符数组,然后调用tokenizer.tokenize(characterStream, tokenFactory)接口针对字符数组里的每一个字符展开校验工作。这个接口具体有着三种不同的实现方式,重点关注io.debezium.relational.TableIdTokenizer实现即可。
在这里插入图片描述

第四步:

Debezium通过一个枚举定义了INITIAL,IN_IDENTIFIER,BEFORE_SEPARATOR,AFTER_SEPARATOR,IN_QUOTED_IDENTIFIER5种表名解析时的状态。在TableIdTokenizer类的tokenize()方法中,默认将解析状态ParsingState设定为INITIAL,然后在一个while循环中,调用currentState.handleCharacter(input.next(), parsingContext)方法,来针对每一个字符展开校验工作。

当针对某一个字符的校验工作完成之后,会对ParsingState进行更新,进行下一次校验。
在这里插入图片描述

以下为5种枚举值的定义逻辑:

 INITIAL {@OverrideParsingState handleCharacter(char c, ParsingContext context) {if (Character.isWhitespace(c)) {return INITIAL;}else if (c 

相关文章:

  • 【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路
  • el-input 限制只能输入负数、正数或2位小数的数值
  • 详解JVM的底层原理
  • JVM 什么是逃逸分析?它有哪些优化手段?
  • 前端根据后端返回的excel二进制文件流进行导出下载
  • 内存编码手册:整数与浮点数的二进制世界
  • OSCP - Proving Grounds - DriftingBlues6
  • 鸿蒙智行多款重磅新品发布,开启智慧出行新篇章
  • 【DVWA 靶场通关】 File Inclusion(文件包含漏洞)
  • 【八大排序】冒泡、直接选择、直接插入、希尔、堆、归并、快速、计数排序
  • C++学习:六个月从基础到就业——面向对象编程:虚函数与抽象类
  • 【Maven】手动安装依赖到本地仓库
  • 【C++】priority_queue的底层封装和实现
  • 线性代数 | 知识点整理 Ref 2
  • 考研单词笔记 2025.04.17
  • 从“链主”到“全链”:供应链数字化转型的底层逻辑
  • 青少年编程与数学 02-016 Python数据结构与算法 25课题、量子算法
  • 【C/C++】深入理解指针(二)
  • 考道路运输安全员证应具备哪些经验?
  • IDEA使用jclasslib Bytecode Viewer查看jvm字节码
  • 俄媒:俄乌代表团抵达谈判会场
  • 证监会强化上市公司募资监管七要点:超募资金不得补流、还贷
  • 证监会发布《上市公司募集资金监管规则》,6月15日起施行
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 白玉兰奖征片综述丨综艺市场破局焕新,多元赛道重塑价值坐标
  • 上海建筑领域绿色发展2025年工作要点发布