flink oracle cdc实时同步(超详细)

这篇具有很好参考价值的文章主要介绍了flink oracle cdc实时同步(超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01 引言

官方文档:https://github.com/ververica/flink-cdc-connectors/blob/release-master/docs/content/connectors/oracle-cdc.md

本文参照官方文档来记录Oracle CDC 的配置。

在本文开始前,需要先安装Oracle,有兴趣的同学可以参考博主之前写的《docker下安装oracle11g(一次安装成功)》。

02 前提条件

如果要做oracle的实时同步,Oracle数据库配置必须满足如下:

  1. Oracle数据库启用日志归档
  2. 定义具有适当权限的Oracle用户
  3. 被捕获的表或数据库上必须启用增量日志记录

在官网的安装教程中,可以看到有两种数据库类型的配置,分别是:

类型 描述 版本
独立的数据库架构(Non-CDB database) 是传统的独立数据库架构,每个数据库实例包含所有的对象和数据 Oracle 11g以及之前的版本中使用
多租户数据库架构(CDB database) 多租户架构的数据库,包含一个根容器和多个子容器(PDB),每个PDB可以看作是一个独立的数据库 Oracle 12c开始

因为 之前安装 的是Oracle11g,所以本文以独立的数据库架构(Non-CDB database)的配置来讲解。

03 配置

注意以下执行的条件是基于之前安装好的oracle环境来执行的,详情参阅:《docker下安装oracle11g(一次安装成功)》。

3.1 启用日志归档

Step1:进入容器:

docker exec -it oracle_11g bash

Step2:以DBA的权限登录数据库:

sqlplus /nolog
CONNECT sys/system AS SYSDBA

Step3:启用日志归档:

-- 设置数据库恢复文件目标大小为10G
alter system set db_recovery_file_dest_size = 10G;

-- 设置数据库恢复文件目标路径
alter system set db_recovery_file_dest = '/home/oracle/app/oracle/product/11.2.0' scope=spfile;

-- 立即关闭数据库
shutdown immediate;

-- 以mount模式启动数据库
startup mount;

-- 启用数据库归档日志模式
alter database archivelog;

-- 打开数据库,允许用户访问
alter database open;

操作记录如下:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
Step4:查看日志归档是否启用(如果显示“Archive Mode”表示已经启用)

archive log list;

flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
/home/oracle/app/oracle/product/11.2.0目录也能看到数据库恢复文件(按日期分目录):
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据


备注:

  • 启用日志归档需要重启数据库。
  • 归档日志将占用大量的磁盘空间,因此需要定期清理过期的日志。

3.2 用户赋权

Step1创建表空间(创建表空间是为了提供一个独立、可控、可扩展的存储区域,以供CDC工具捕获和管理数据库的增量数据,这对于实时同步和数据变更追踪非常重要,并为数据流和数据仓库等应用提供可靠的数据源。)

-- 以DBA的权限登录数据库
sqlplus /nolog
CONNECT sys/system AS SYSDBA
-- 创建一个名为"logminer_tbs"的表空间
-- 指定表空间的数据文件路径为"/home/oracle/app/oracle/product/11.2.0/logminer_tbs.dbf",其中"/home/oracle/app/oracle/product/11.2.0"是数据文件存储的目录,"logminer_tbs.dbf"是数据文件的文件名
-- 设置表空间的初始大小为25MB
-- 如果数据文件已经存在且可重用,将其重用,否则创建一个新的数据文件
-- 启用表空间的自动扩展功能,即当表空间空间不足时,自动增加数据文件的大小
-- 设置表空间的最大允许大小为无限,即表空间可以无限制地自动扩展
CREATE TABLESPACE logminer_tbs DATAFILE '/home/oracle/app/oracle/product/11.2.0/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
可以看到在“/home/oracle/app/oracle/product/11.2.0”目录里已经创建了logminer_tbs.dbf文件:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

Step2:创建用户并赋予权限

-- 创建一个名为"flinkuser"的用户,密码为"flinkpw",将其默认表空间设置为"LOGMINER_TBS",并在该表空间上设置无限配额。
CREATE USER flinkuser IDENTIFIED BY flinkpw DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMITED ON LOGMINER_TBS;

-- 允许"flinkuser"用户创建会话,即允许该用户连接到数据库。
GRANT CREATE SESSION TO flinkuser;

-- (不支持Oracle 11g)允许"flinkuser"用户在多租户数据库(CDB)中设置容器。
-- GRANT SET CONTAINER TO flinkuser;

-- 允许"flinkuser"用户查询V_$DATABASE视图,该视图包含有关数据库实例的信息。
GRANT SELECT ON V_$DATABASE TO flinkuser;

-- 允许"flinkuser"用户执行任何表的闪回操作。
GRANT FLASHBACK ANY TABLE TO flinkuser;

-- 允许"flinkuser"用户查询任何表的数据。
GRANT SELECT ANY TABLE TO flinkuser;

-- 允许"flinkuser"用户拥有SELECT_CATALOG_ROLE角色,该角色允许查询数据字典和元数据。
GRANT SELECT_CATALOG_ROLE TO flinkuser;

-- 允许"flinkuser"用户拥有EXECUTE_CATALOG_ROLE角色,该角色允许执行一些数据字典中的过程和函数。
GRANT EXECUTE_CATALOG_ROLE TO flinkuser;

-- 允许"flinkuser"用户查询任何事务。
GRANT SELECT ANY TRANSACTION TO flinkuser;

-- (不支持Oracle 11g)允许"flinkuser"用户进行数据变更追踪(LogMiner)。
-- GRANT LOGMINING TO flinkuser;

-- 允许"flinkuser"用户创建表。
GRANT CREATE TABLE TO flinkuser;

-- 允许"flinkuser"用户锁定任何表。
GRANT LOCK ANY TABLE TO flinkuser;

-- 允许"flinkuser"用户修改任何表。
GRANT ALTER ANY TABLE TO flinkuser;

-- 允许"flinkuser"用户创建序列。
GRANT CREATE SEQUENCE TO flinkuser;

-- 允许"flinkuser"用户执行DBMS_LOGMNR包中的过程。
GRANT EXECUTE ON DBMS_LOGMNR TO flinkuser;

-- 允许"flinkuser"用户执行DBMS_LOGMNR_D包中的过程。
GRANT EXECUTE ON DBMS_LOGMNR_D TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOG视图,该视图包含有关数据库日志文件的信息。
GRANT SELECT ON V_$LOG TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOG_HISTORY视图,该视图包含有关数据库历史日志文件的信息。
GRANT SELECT ON V_$LOG_HISTORY TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOGMNR_LOGS视图,该视图包含有关LogMiner日志文件的信息。
GRANT SELECT ON V_$LOGMNR_LOGS TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOGMNR_CONTENTS视图,该视图包含LogMiner日志文件的内容。
GRANT SELECT ON V_$LOGMNR_CONTENTS TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOGMNR_PARAMETERS视图,该视图包含有关LogMiner的参数信息。
GRANT SELECT ON V_$LOGMNR_PARAMETERS TO flinkuser;

-- 允许"flinkuser"用户查询V_$LOGFILE视图,该视图包含有关数据库日志文件的信息。
GRANT SELECT ON V_$LOGFILE TO flinkuser;

-- 允许"flinkuser"用户查询V_$ARCHIVED_LOG视图,该视图包含已归档的数据库日志文件的信息。
GRANT SELECT ON V_$ARCHIVED_LOG TO flinkuser;

-- 允许"flinkuser"用户查询V_$ARCHIVE_DEST_STATUS视图,该视图包含有关归档目标状态的信息。
GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO flinkuser;

3.3 表或数据库上启用增量日志记录(supplemental log)

在讲解Oracle之前,很有必要先了解Oracle的逻辑结构。

3.3.1 Oracle 逻辑结构

Oracle数据库的物理结构与MySQL以及SQLServer有着很大的不同,在使用MySQL或SQLServer时,我们不需要去关心它们的逻辑结构和物理结构。

Oracle在逻辑结构中,分别是如下的结构:数据库实例 => 表空间 => 数据段(表) => 区 => 块

  • 数据库实例:前面的《docker下安装oracle11g(一次安装成功)》,在启动容器时,已经指定了Oracle的数据库实例的唯一ID,每个Oracle数据库实例都有一个唯一的SID,也就是说,安装的时候,已经创建好了一个“helowin”数据库实例了。flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
  • 表空间:在 “用户赋权”的第1步骤,可以看出已经创建了“logminer_tbs”表空间(CREATE TABLESPACE logminer_tbs…)

相关的查询SQL:

-- 以DBA的权限登录数据库
sqlplus /nolog
CONNECT sys/system AS SYSDBA

-- 查询数据库实例名称
SELECT NAME FROM V$DATABASE;

-- 查询所有表空间名称
SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;

结果如下:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
ok,接下来就可以进入“LOGMINER_TBS”表空间去创建表了。

3.3.2 创建表

LOGMINER_TBS表空间下的flinkuser用户下创建customers表:

-- 切换至flinkuser用户
sqlplus /nolog
CONNECT flinkuser/flinkpw

-- 创建customers表
CREATE TABLE customers (
    customer_id NUMBER PRIMARY KEY,
    customer_name VARCHAR2(50),
    email VARCHAR2(100),
    phone VARCHAR2(20)
) TABLESPACE LOGMINER_TBS;

查看表是否创建成功:

-- 查看LOGMINER_TBS表空间下的所有表
select tablespace_name, table_name from user_tables
where tablespace_name = 'LOGMINER_TBS';

可以看到表创建成功:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

3.3.3 启用增量日志

切换至SYS用户,以DBA的权限登录数据库,为表和数据库启用增量日志:

-- 以DBA的权限登录数据库
sqlplus /nolog
CONNECT sys/system AS SYSDBA

-- 为LOGMINER_TBS表空间下的customers表启用增强日志记录
ALTER TABLE FLINKUSER.CUSTOMERS ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS

-- 为数据库启用增强日志记录:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

操作成功:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

04 flink sql

注意:源表的字段定义、schema-name以及table-name都要大写,否则无法同步

-- 创建Oracle CDC源表table_source_oracle,从Oracle数据库中读取数据
CREATE TABLE table_source_oracle (
        CUSTOMER_ID INT,
        CUSTOMER_NAME STRING,
        EMAIL STRING,
        PHONE STRING,
        PRIMARY KEY (CUSTOMER_ID) NOT ENFORCED
        )
WITH (
		'connector' = 'oracle-cdc',
		'hostname' = '10.194.183.120',
		'port' = '30026',
		'username' = 'flinkuser',
		'password' = 'flinkpw',
		'database-name' = 'helowin',
		'schema-name' = 'FLINKUSER',
		'table-name' = 'CUSTOMERS'
)

-- 创建MySQL JDBC接收表table_sink_mysql,将数据写入到MySQL数据库
CREATE TABLE table_sink_mysql (
    customer_id INT,
    customer_name STRING,
    email STRING,
    phone STRING,
    PRIMARY KEY (customer_id) NOT ENFORCED
)
WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://10.194.183.120:30025/test',
    'username' = 'root',
    'password' = 'root',
    'table-name' = 'customers'
);

-- 将table_source_oracle表的数据插入到table_sink_mysql表中
INSERT INTO table_sink_mysql SELECT * FROM table_source_oracle;

执行flinksql后,可以看到控制台没有报错,程序已经正常启动:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

往customers插入一条数据:

-- 切换至flinkuser用户
sqlplus /nolog
CONNECT flinkuser/flinkpw

-- 插入数据
INSERT INTO customers (customer_id, customer_name, email, phone)
VALUES (1, 'Dumas', 'Dumas@example.com', '123-456-7890');

flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

可以看到,已经写入成功了:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据

05 其它问题

问题解决参考:https://flink-learning.org.cn/article/detail/bf01dd4ff3ed8a11d6d38f365bc2a15d

虽然能做同步了,但是感觉还是有很多坑的,比如控制台会报错:
flink oracle cdc实时同步(超详细),# BMS项目实战记录,# Flink,flink,oracle,大数据
解决方式:在 create 语句中加上

'debezium.database.tablename.case.insensitive'='false'

还有数据延迟较大,也是在create语句加上:

'debezium.log.mining.strategy'='online_catalog',
'debezium.log.mining.continuous.mine'='true'

所以,最终的Flink SQL如下:

-- 创建Oracle CDC源表table_source_oracle,从Oracle数据库中读取数据
CREATE TABLE table_source_oracle (
        CUSTOMER_ID INT,
        CUSTOMER_NAME STRING,
        EMAIL STRING,
        PHONE STRING,
        PRIMARY KEY (CUSTOMER_ID) NOT ENFORCED
        )
WITH (
        'connector' = 'oracle-cdc',
        'hostname' = '10.194.183.120',
        'port' = '30026',
        'username' = 'flinkuser',
        'password' = 'flinkpw',
        'database-name' = 'HELOWIN',
        'schema-name' = 'FLINKUSER',
        'table-name' = 'CUSTOMERS',
        'debezium.database.tablename.case.insensitive'='false',
        'debezium.log.mining.strategy'='online_catalog',
        'debezium.log.mining.continuous.mine'='true'
);

-- 创建MySQL JDBC接收表table_sink_mysql,将数据写入到MySQL数据库
CREATE TABLE table_sink_mysql (
    customer_id INT,
    customer_name STRING,
    email STRING,
    phone STRING,
    PRIMARY KEY (customer_id) NOT ENFORCED
)
WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://10.194.183.120:30025/test',
    'username' = 'root',
    'password' = 'root',
    'table-name' = 'customers'
);

-- 将table_source_oracle表的数据插入到table_sink_mysql表中
INSERT INTO table_sink_mysql SELECT * FROM table_source_oracle;

06 文末

本文主要讲解了Flink Oracle CDC实时同步的所有步骤,希望能帮助到大家,谢谢大家的阅读,本文完!文章来源地址https://www.toymoban.com/news/detail-657325.html

到了这里,关于flink oracle cdc实时同步(超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Flink CDC 的实时同步系统

    摘要: 本文整理自科杰科技大数据架构师张军,在 FFA 2022 数据集成专场的分享。本篇内容主要分为四个部分: 功能概述 架构设计 技术挑战 生产实践 Tips: 点击 「阅读原文」 查看原文视频演讲 ppt 科杰科技是专门做大数据服务的供应商,目前的客户包括能源、金融、证券等

    2024年02月05日
    浏览(33)
  • Flink CDC 实时抽取 Oracle 数据-排错&调优

    Flink CDC 于 2021 年 11 月 15 日发布了最新版本 2.1,该版本通过引入内置 Debezium 组件,增加了对 Oracle 的支持。对该版本进行试用并成功实现了对 Oracle 的实时数据捕获以及性能调优,现将试用过程中的一些关键细节进行分享。 Oracle:11.2.0.4.0(RAC 部署) Flink:1.13.1 Hadoop:3.2.1

    2024年01月16日
    浏览(30)
  • Flink CDC实时同步PG数据库

    JDK:1.8 Flink:1.16.2 Scala:2.11 Hadoop:3.1.3 github地址:https://github.com/rockets0421/FlinkCDC-PG.git  1、更改配置文件postgresql.conf # 更改wal日志方式为logical wal_level = logical # minimal, replica, or logical # 更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots max_replication_slots = 20 # m

    2024年02月13日
    浏览(53)
  • 基于Flink CDC实时同步数据(MySQL到MySQL)

    jdk8 Flink 1.16.1(部署在远程服务器:192.168.137.99) Flink CDC 2.3.0 MySQL 8.0(安装在本地:192.168.3.31) (安装部署过程略) 准备三个数据库:flink_source、flink_sink、flink_sink_second。 将flink_source.source_test表实时同步到flink_sink和flink_sink_second的sink_test表。 (建库建表过程略) 开发过程

    2024年02月06日
    浏览(89)
  • Flink CDC 基于mysql binlog 实时同步mysql表

    环境说明: flink 1.15.2 mysql 版本5.7    注意:需要开启binlog,因为增量同步是基于binlog捕获数据 windows11 IDEA 本地运行 先上官网使用说明和案例:MySQL CDC Connector — Flink CDC documentation 1. mysql开启binlog (注意,引擎是 InnoDB,如果是ndbcluster,本人测试是捕获不到binlog日志的,增量相

    2024年02月10日
    浏览(42)
  • flink postgresql cdc实时同步(含pg安装配置等)

    类型 版本/描述 docker 20.10.9 Postgresql 10.6 初始化账号密码:postgres/postgres 普通用户:test1/test123 数据库:test_db flink 1.13.6 step1 : 拉取 PostgreSQL 10.6 版本的镜像: step2 :创建并启动 PostgreSQL 容器,在这里,我们将把容器的端口 5432 映射到主机的端口 30028,账号密码设置为 postgre

    2024年02月11日
    浏览(33)
  • flink sqlserver cdc实时同步(含sqlserver安装配置等)

    官方文档:https://github.com/ververica/flink-cdc-connectors/blob/master/docs/content/connectors/sqlserver-cdc.md 如果要使用flink cdc做sqlserver的实时同步,需要满足以下条件: 需要安装SQLServer(需要支持CDC的功能,SQLServer 2008之后的版本都支持) ; 需要开启SQL Server代理; 启用CDC功能。 ok,接下来

    2024年02月08日
    浏览(32)
  • 用flink cdc sqlserver 将数据实时同步到clickhouse

    flink cdc 终于支持 sqlserver 了。 现在互联网公司用sqlserver的不多,大部分都是一些国企的老旧系统。我们以前同步数据,都是用datax,但是不能实时同步数据。现在有了flinkcdc,可以实现实时同步了。 1、首先sqlserver版本:要求sqlserver版本为14及以上,也就是 SQL Server 2017 版。

    2023年04月08日
    浏览(27)
  • 【FLINK】Kafka数据源通过Flink-cdc进行实时数据同步

    CDC是Change Data Capture的缩写,中文意思是 变更数据获取 ,flink-cdc的作用是,通过flink捕获数据源的事务变动操作记录,包括数据的增删改操作等,根据这些记录可作用于对目标端进行实时数据同步。 下图是flink-cdc最新支持的数据源类型: kafka的数据源要通过flink-cdc进行实时数

    2024年02月12日
    浏览(35)
  • 基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步

    这篇教程将展示如何基于 Flink CDC 快速构建 MySQL 到 Databend 的实时数据同步。本教程的演示都将在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 假设我们有电子商务业务,商品的数据存储在 MySQL ,我们需要实时把它同步到 Databend 中。 接下来的内容

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包