kafka-connect + debezium 实时采集oracle 11 xe

oracle版本:11.2 xe

kafka版本1.1.1

准备:

1.下载oracle connect相关jar包 :https://repo1.maven.org/maven2/io/debezium/debezium-connector-oracle/1.6.1.Final/debezium-connector-oracle-1.6.1.Final-plugin.tar.gz

2.并将解压到kafka connect的plugn 上详情参考上篇文章mysql的实时采集

3.下载oracle的ojdbc和xstream 放在kafka 的libs下 下载方法如下:下载orale instance:https://www.oracle.com/database/technologies/instant-client/downloads.html

目录下有ojdbc和xstream

oracle配置

1.sqlplus / as sysdb 配置log

alter system set db_recovery_file_dest_size = 10G;
alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;
shutdown immediate
startup mount
alter database archivelog;
alter database open;
-- Should now "Database log mode: Archive Mode"
archive log list

exit;

2.赋值权限

官方文档提供的为oracle12的需要配置CDB和PDB,oracle 11不存在,所有只需要配置下面的即可

 CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/logminer_tbs.dbf'
    SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
CREATE USER debezium IDENTIFIED BY 123456
    DEFAULT TABLESPACE TEST0
    QUOTA UNLIMITED ON TEST0

  GRANT CREATE SESSION TO debezium ;
  GRANT SET CONTAINER TO debezium ;
  GRANT SELECT ON V_$DATABASE to debezium ;
  GRANT FLASHBACK ANY TABLE TO debezium ;
  GRANT SELECT ANY TABLE TO debezium ;
  GRANT SELECT_CATALOG_ROLE TO debezium ;
  GRANT EXECUTE_CATALOG_ROLE TO debezium ;
  GRANT SELECT ANY TRANSACTION TO debezium ;
  --GRANT LOGMINING TO debezium ;

  GRANT CREATE TABLE TO debezium ;
  GRANT LOCK ANY TABLE TO debezium ;
  GRANT ALTER ANY TABLE TO debezium ;
  GRANT CREATE SEQUENCE TO debezium ;

  GRANT EXECUTE ON DBMS_LOGMNR TO debezium ;
  GRANT EXECUTE ON DBMS_LOGMNR_D TO debezium ;

  GRANT SELECT ON V_$LOG TO debezium ;
  GRANT SELECT ON V_$LOG_HISTORY TO debezium ;
  GRANT SELECT ON V_$LOGMNR_LOGS TO debezium ;
  GRANT SELECT ON V_$LOGMNR_CONTENTS TO debezium ;
  GRANT SELECT ON V_$LOGMNR_PARAMETERS TO debezium ;
  GRANT SELECT ON V_$LOGFILE TO debezium ;
  GRANT SELECT ON V_$ARCHIVED_LOG TO debezium ;
  GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO debezium ;

  exit;

注意:有些权限可能报错不存在不用管

3.配置需要采集的表

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

ALTER TABLE 【库】.【表】 ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

kafka 采集

1.配置连接器

{
    "name": "inventory-connector-oracle3",
    "config": {
        "connector.class" : "io.debezium.connector.oracle.OracleConnector",
        "tasks.max" : "1",
        "database.server.name" : "oracle-service",
        "database.user" : "debezium",
        "database.password" : "123456",
        "database.url": "jdbc:oracle:thin:@ip:1521:xe",
        "database.tablename.case.insensitive": "true",
        "database.dbname" : "DEBEZIUM",
        "table.include.list":"DEBEZIUM.test",
        "database.history.kafka.bootstrap.servers" : "kafka:9092",
        "database.history.kafka.topic": "schema-changes.inventory",
        "snapshot.mode":"initial"
    }
}

2. post提交上面的json代码

http://ip:8083/connectors

3.检查连接情况

httip://ip:8083/connectors/inventory-connector-oracle3/status

4.查看kafka数据

遇到问题:

1.无效的列索引

ojdbc版本不对:debezium中的jdbcconnection类中会通过metastore获取数据,对于ojdbc6的索引不足23个但是ojdbc8才有23个

column.autoIncremented("YES".equalsIgnoreCase(columnMetadata.getString(23)));
            String autogenerated = null;
            try {
                autogenerated = columnMetadata.getString(24);
            }
            catch (SQLException e) {
                // ignore, some drivers don't have this index - e.g. Postgres
            }

测试程序

public class Test {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:test/test@ip:1521:xe","debezium","123456");
        DatabaseMetaData dbmd = dbConn.getMetaData();
        ResultSet rs = dbmd.getColumns(null, "DEBEZIUM","test", null);
        if (rs.next()) {
            rs.getString(22);
            System.out.println(rs.getString(23));
        }
    }
}

测试程序中ojdbc6会报索引的异常,但是ojdbc8不会报该异常,ojdbc8的getColumns获取的参数更加完善

2."database.tablename.case.insensitive": "true",

## For Oracle 11g

To run the Debezium Oracle connector with Oracle 11g, there are several additional parameters required.
It's important to remember, these are only required for Oracle 11 and should not be used with any other version.

```json
"database.tablename.case.insensitive": "true",
```

Additionally, the connector ignores several built-in tables and schemas in Oracle 12+ but those tables differ in Oracle 11.
When using Debezium Oracle connector with Oracle 11, its important to specify the `table.include.list` and to avoid problems with those tables.
Remember, specify your values here in lowercase, as shown below:

```json
"table.include.list": "orcl\\\\.debezium\\\\.(.*)"
```

参考文档:https://debezium.io/documentation/reference/1.6/connectors/oracle.html#oracle-example-configuration

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值