请问flink CDC中使用cdc查询oracle表数据,报这个错是什么原因?[ERROR] Could not execute SQL statement. Reason:java.lang.AbstractMethodError: Method io/debezium/connector/oracle/OracleChangeEventSourceFactory.getSnapshotChangeEventSource(Lio/debezium/pipeline/source/spi/SnapshotProgressListener;)Lio/debezium/pipeline/source/spi/SnapshotChangeEventSource; is abstract
flink-sql-connector-oracle-cdc-2.2.1.jar。
如果在 Flink CDC 中使用 CDC 查询 Oracle 表数据时,出现以下错误:
pgsql
Copy
org.apache.flink.table.api.ValidationException: Table 'oracle' is not an append-only table. Append-only tables are required to be able to use the CDC source.
这个错误通常是由于 Oracle 表不支持 CDC 或者未正确启用 CDC 导致的。在 Oracle 数据库中,必须启用 CDC 功能才能使用 Flink CDC 连接器读取表中的数据。如果未启用 CDC,则无法使用 CDC 连接器。
要启用 Oracle 表的 CDC 功能,需要使用 DBMS_CDC_PUBLISH 包中的 ENABLE_CAPTURE 子程序来启用表的 CDC。具体而言,可以按照以下步骤启用 CDC:
首先,使用 Oracle 用户登录到数据库中,该用户必须具有 SYSDBA 或 SYSOPER 角色。
然后,运行以下命令启用表的 CDC:
sql
Copy
BEGIN
DBMS_CDC_PUBLISH.ENABLE_CAPTURE(
object_schema => 'schema_name',
object_name => 'table_name',
capture_values => 'ALL',
use_rowid => TRUE,
enqueue_name => null,
source_database => null,
column_group => null,
capture_function => null);
END;
其中,schema_name 和 table_name 分别是要启用 CDC 的表所在的模式和表名。capture_values 参数指定要捕获的列,use_rowid 参数指定是否使用 ROWID 进行标识行,enqueue_name 参数指定 CDC 队列的名称,source_database 参数指定源数据库的名称,column_group 参数指定捕获列的分组,capture_function 参数指定 CDC 函数的名称。
例如,可以按照以下方式启用表的 CDC:
sql
Copy
BEGIN
DBMS_CDC_PUBLISH.ENABLE_CAPTURE(
object_schema => 'test_schema',
object_name => 'test_table',
capture_values => 'ALL',
use_rowid => TRUE,
enqueue_name => null,
source_database => null,
column_group => null,
capture_function => null);
END;
最后,可以使用 Flink CDC 连接器读取已启用 CDC 的表中的数据。
如果在启用 CDC 后仍然出现相同的错误,请确保使用的 Oracle JDBC 驱动程序版本正确
推测是由于使用的Flink CDC连接器库中缺少OracleChangeEventSourceFactory的实现类所导致的。OracleChangeEventSourceFactory是Debezium连接器库中用于创建Oracle数据源的工厂类。需要确保您的Flink应用程序包含完整的Debezium连接器库,并且该库中包含OracleChangeEventSourceFactory的实现类。如果使用的是Maven项目,需要在pom.xml文件中添加以下依赖项:
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-core</artifactId>
<version>1.4.1.Final</version>
</dependency>
如果使用的是Gradle项目,您需要在build.gradle文件中添加以下依赖项:
dependencies {
implementation 'io.debezium:debezium-core:1.4.1.Final'
}
也可能是由于使用的 Flink CDC 版本与Oracle 数据库版本不兼容导致的。建议检查Flink CDC 版本和 Oracle 数据库版本是否匹配,并尝试升级或降级其中一个版本以解决此问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。