本文涉及到的版本
oracle19C
Flink1.13.6
FlinkCDC2.1.0
确保oracle中开启了日志归档(百度)
oracle的sqlPlus 下运行
archive log list; //查看是否开启日志归档(百度)
开启后需要创建新用户原因:
FlinkCDC默认会把SYS与SYSTEM的用户下的表过滤掉 导致监控不到这两个用户下的表变化,
所以创建用户
如果您想要监控SYS或SYSTEM用户下的表,您可以修改FlinkCDC的配置,在flink-conf.yam1 或者在提交任务时指定-D 参数,将cdc.ignore-table-pattern设置为空字符串,这样Flink CDC
将不会过滤任何表。但请注意,在监控这些用户下的表时要小心,确保不会影响系统的正常运行和安全性。(百度到的 没试过)
本文中创建的用户:
创建用户(c##不懂自行百度):
create user c##xyd identified by 123456;
给用户授权
GRANT DBA TO c##xyd;
用户下建表:
CREATE TABLE c##xyd.flink_cdc_test (
ID NUMBER,
USERNAME VARCHAR2(255),
PASSWORD VARCHAR2(255));
----为一个特定的表启用补充日志记录:修改表目录。客户添加补充日志数据(所有)列;
ALTER TABLE c##xyd.flink_cdc_test ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
--为数据库启用补充日志修改数据库添加补充日志数据(执行一次即可);
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
最重要的依赖:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.13.6</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.13.6</version>
</dependency>
<!--<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>-->
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-oracle-cdc</artifactId>
<!-- the dependency is available only for stable releases. -->
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.12</artifactId>
<version>1.13.6</version>
</dependency>
</dependencies>
FlinkCDC代码
package org.example;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import com.ververica.cdc.connectors.oracle.OracleSource;
/**
* @author xueyadong
* @ClassName: OracleCDC
* @Description: (这里用一句话描述这个类的作用)
* @date 2023/11/23 15:14
*/
public class OracleCDC {
public static void main(String[] args) throws Exception {
SourceFunction<String> sourceFunction = OracleSource.<String>builder()
.hostname("oracle的ip地址")
.port(1521)
.database("ORCL") // oracle的实例名
.schemaList("c##xyd") // 创建的用户
.tableList("c##xyd.*") // 监控用户下的表.*代表所有表 可以自行测试
.username("c##xyd")//用户名
.password("****")//密码
.deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
.build();
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(sourceFunction)
.print().setParallelism(1); // use parallelism 1 for sink to keep message ordering
env.execute();
}
}