请问下Flink CDC 抽取Oracle的数据,报这个错误,有谁遇到过么?
jsORA-00604: error occurred at recursive SQL level 1
ORA-00972: identifier is too long
ORA-06512: at "SYS.LOGMNR_KRVRDLUID3", line 1351
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_LOGMNR", line 58
解决方案:
检查相关的数据库对象名称,确保它们不超过 30 个字符。
如果可能,重命名过长的标识符。
解决方案:
检查 LogMiner 的配置,确保它正确设置并且与 Flink CDC 连接器兼容。
确保执行的 SQL 语句正确无误。
错误 "ORA-00604: error occurred at recursive SQL level 1" 是 Oracle 数据库返回的一个内部错误,它通常表明在执行 SQL 语句时发生了某种类型的系统或内部错误。这个错误信息本身比较通用,因此确定具体错误原因可能需要进一步的信息。
以下是一些可能导致 ORA-00604 错误的原因和解决步骤:
错误原因
"java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1"错误通常发生在一个递归SQL语句中出现了错误。递归SQL语句是指在执行一个SQL语句时,又触发了另一个SQL语句的执行。这个错误的原因可能是以下几种情况之一:
递归SQL语句中的循环。当一个SQL语句触发了另一个SQL语句的执行,而后者又触发了前者的执行,这样就会形成一个循环,导致递归SQL语句无法终止,最终引发错误。
数据库对象的无限递归。当数据库中的某个对象触发了自身的操作,而这个操作又触发了同一个对象的另一个操作,就会导致无限递归,最终引发错误。
SQL语句中的错误。有时候,递归SQL语句本身就存在错误,例如语法错误、查询条件错误等,这些错误也会导致"java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1"错误的发生。
解决方法
——参考链接。
这个问题可能是由于Flink CDC连接器与Oracle数据库之间的兼容性问题导致的,这里有几个可能的解决方案,这些解决方案基于常见的错误原因和最佳实践:
一、错误原因及通用解决方案
不支持的SQL语句
问题描述:Flink CDC的Oracle Connector使用了Debezium库来解析和抽取数据库中的DML(数据操作语言)语句。如果遇到了一个不受支持的SQL语句,就会抛出错误。
解决方案:
检查Oracle数据库中的SQL语句,确保它们都是Flink CDC支持的。
如果可能,尝试修改Oracle数据库中的SQL语句,使其符合Flink CDC的要求。
升级Flink CDC和Debezium Connector的版本,以查看是否已修复此问题。
连接器版本不兼容
问题描述:Flink CDC和Debezium Connector存在版本兼容性,某些Oracle特定功能或修复可能需要特定的Connector版本才能使用。
解决方案:
检查并确认正在使用的Flink CDC和Debezium Connector版本是否兼容。
如果不兼容,请升级到一个兼容的版本。
权限不足
问题描述:Oracle数据库的用户没有足够的权限来执行某些操作。
解决方案:
确保Oracle数据库用户具有足够的权限来访问和操作所需的表和视图。
使用GRANT语句授予用户所需的权限或角色。
二、具体错误代码及解决方案
ORA-65040:不允许从可插入数据库内部执行该操作
问题描述:这是一个Oracle数据库的错误,通常发生在用户尝试在可插入数据库(PDB)内部执行特定操作,而这实际上必须在根容器(CDB)中执行。
解决方案:
将Flink CDC的工作放在根容器中执行,而不是在可插入数据库中执行。
如果无法将工作放到根容器中执行,尝试修改Flink CDC的配置,使其能够在可插入数据库中执行所必需的操作。
连接问题
问题描述:无法连接到Oracle数据库,可能是由于数据库地址、端口或服务名配置错误,或者数据库未启动或不可用。
解决方案:
检查并确认Oracle数据库的地址、端口和服务名配置正确。
确保Oracle数据库已启动并可用。
认证问题
问题描述:无法使用提供的用户名和密码连接到Oracle数据库,可能是因为用户名和密码不正确,或者用户没有足够的权限。
解决方案:
检查并确认提供的用户名和密码正确。
确保用户具有足够的权限来执行所需的操作。
这个问题可能是由于Flink CDC连接器与Oracle数据库之间的兼容性问题导致的。为了解决这个问题,你可以尝试以下方法:
确保你的Flink和Flink CDC的版本与Oracle数据库的版本兼容。你可以查阅官方文档或者社区讨论来获取更多关于版本兼容性的信息。
检查你的Oracle数据库驱动程序是否正确安装并配置。确保你已经下载了正确版本的Oracle JDBC驱动,并将其添加到Flink的类路径中。
检查你的Flink配置文件(flink-conf.yaml)中的相关设置,如连接字符串、用户名和密码等,确保它们是正确的。
如果问题仍然存在,你可以尝试升级或降级Flink和Flink CDC的版本,以找到一个与你的Oracle数据库兼容的版本。
如果以上方法都无法解决问题,你可以在Flink社区论坛或者GitHub仓库中提交一个issue,详细描述你遇到的问题,以便开发者和其他用户能够提供帮助。
Flink CDC 3.0 提供了 Change Data Capture (CDC) 功能,可以捕获数据库的变更事件。当使用 Flink CDC 将数据写入 Doris 时,可以通过以下方式保证有序:
确保源数据库(如 MySQL)的 binlog_format 设置为 ROW 或 MIXED。这样可以确保在 binlog 中记录的是行级别的变更事件,而不是表级别的 DDL 语句或其他非数据变更事件。
在 Flink 程序中,使用 Flink SQL 或者 DataStream API 对 CDC 的数据进行排序。例如,可以使用 ORDER BY 子句对数据流进行排序,以确保数据按照某个字段的顺序进行处理。
在 Doris 中,创建表时可以设置主键和分区键,以便在插入数据时自动进行排序。这样,即使 Flink 输出的数据是无序的,Doris 也会根据主键和分区键对数据进行排序存储。
如果需要全局有序,可以考虑使用 Flink 的窗口操作(如时间窗口、计数窗口等)对数据进行分组处理,然后再写入 Doris。这样可以确保每个窗口内的数据都是有序的。
在 Doris 中,可以使用 INSERT INTO ... SELECT 语句将有序的数据插入到目标表中。这样可以确保插入的数据是有序的。
总之,要保证 Flink CDC 写入 Doris 的数据有序,需要在源数据库、Flink 程序和目标数据库三个层面进行相应的配置和处理。
在使用Apache Flink的CDC(Change Data Capture)功能从Oracle数据库抽取数据时遇到ORA-00604和ORA-09722错误,通常指示着在Oracle数据库执行的操作中存在一些问题。下面是一些可能的解决步骤和考虑因素:
解决步骤:
检查Flink CDC作业中引用的所有Oracle数据库对象名,确保它们不超过30个字符。
如果可能,修改Oracle数据库中的对象名,使其符合长度限制。
检查任何可能由Flink CDC自动生成的SQL查询,确保它们不包含过长的标识符。
解决步骤:
仔细检查Oracle数据库的错误日志和堆栈跟踪,以获取更多关于ORA-00604错误发生上下文的信息。
如果Flink CDC作业涉及复杂的SQL查询或存储过程调用,尝试简化这些查询或过程,以排除潜在的递归或嵌套SQL问题。
确保Oracle数据库的PL/SQL代码(如触发器、存储过程等)没有导致递归调用或无限循环。
您在使用Apache Flink的CDC功能从Oracle数据库抽取数据时遇到了一个错误。根据您提供的信息,错误提示是ORA-00604: recursive SQL level error at line 1351以及ORA-09722: identifier is too long。
这表明您可能在Oracle中遇到了递归SQL级别错误或者标识符长度超过限制的问题。通常这类问题可能是由于您的查询或存储过程中的某些部分导致了Oracle解析器的内部错误。
从你提供的错误信息来看,Flink CDC 在抽取 Oracle 数据时遇到了一个 SQL 错误。具体错误信息如下:
java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-0972: identifier is too long
ORA-06512: at "SYS.LOGWR_KRVRDLUID3", line 1351
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_LOGMNR", line 584
ORA-06512: at line 1
这些错误信息表明在使用 Oracle 的 LogMiner 时遇到了一些问题。以下是一些可能的原因和解决方法:
ORA-0972: identifier is too long
表示某个标识符(如表名、列名等)超过了 Oracle 允许的最大长度。Oracle 标识符的最大长度通常是 30 个字符。
ORA-00604: error occurred at recursive SQL level 1
表示在递归 SQL 执行过程中发生了错误。这通常与 ORA-0972
错误一起出现。
ORA-06512
错误通常表示在存储过程或触发器中发生了错误。这些错误可能是由于 LogMiner 的内部操作引起的。
确保 Flink CDC 的配置正确,特别是与 Oracle 连接相关的配置。
Properties properties = new Properties();
properties.setProperty("connector", "oracle-cdc");
properties.setProperty("hostname", "your_oracle_host");
properties.setProperty("port", "your_oracle_port");
properties.setProperty("username", "your_username");
properties.setProperty("password", "your_password");
properties.setProperty("database-name", "your_database");
properties.setProperty("table-name", "your_table");
properties.setProperty("pdi.enabled", "true"); // 启用 PDI (Parallel Data Import)
properties.setProperty("debezium.snapshot.locking.mode", "none"); // 不使用锁
OracleSourceBuilder<String> builder = OracleSource.<String>builder()
.hostname(properties.getProperty("hostname"))
.port(Integer.parseInt(properties.getProperty("port")))
.databaseList(properties.getProperty("database-name"))
.tableList(properties.getProperty("table-name"))
.username(properties.getProperty("username"))
.password(properties.getProperty("password"))
.deserializer(new JsonDebeziumDeserializationSchema()) // 使用 JSON 格式反序列化
.debeziumProperties(properties);
DataStreamSource<String> source = env.fromSource(builder.build(), WatermarkStrategy.noWatermarks(), "Oracle CDC Source");
确保 Oracle 数据库的参数设置正确,特别是与 LogMiner 相关的参数。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
通过上述步骤,你应该能够诊断并解决 Flink CDC 抽取 Oracle 数据时遇到的 ORA-0972
和 ORA-00604
错误。如果问题仍然存在,建议联系 Oracle 支持团队或 Flink 社区获取进一步的帮助。
ORA-00972: identifier is too long 错误,这是因为 Oracle 对标识符的长度有限制,通常标识符的最大长度为 30 个字符
参考文档https://blog.csdn.net/jike11231/article/details/109306890
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。