Sign inSign up

woqutech/qdecoder

By woqutech

•Updated almost 5 years ago

oracle redo日志解析工具,可以将oracle数据变化实时写入kafka,支持准实时增量迁移、同步、订阅。现已改名为o2k

Image
0

1.8K

woqutech/qdecoder repository overview

⁠QDecoder使用手册

已改名为o2k⁠

⁠1. 简介

QDecoder是一款高性能、免费的oracle日志订阅同步软件,容器化一键安装,能够从oracle数据库读取在线日志文件和归档日志文件,解析出DDL和DML操作,输出binlog。

QDecoder支持按表过滤数据,只输出用户指定的表上的操作。

QDecoder支持多种输出目的地,可以把binlog输出到kafka, file或socket。用户根据需要,选取一种方式获取binlog。

QDecoder输出的binlog以ProtoBuf格式打包,消费者可以轻松解包使用。架构图如下:

qdecoder-arch

⁠2. 在docker环境运行QDecoder

⁠2.1 配置并启动QDecoder

docker run -it --name=qdecoder -p 9191:9191 -p 9092:9092 --pull  always registry.cn-hangzhou.aliyuncs.com/woqutech/qdecoder

以交互方式启动,按提示配置参数,运行QDecoder。

如果选择将binlog输出到file或socket,则QDecoder监听容器内的9191端口,输出binlog,故需要导出9191端口,供外部程序获取binlog。

如果选择将binlog输出到kafka,则直接从kafka读取binlog即可。

运行示例:

qdecoder-docker-demo

$ docker run -it --name=qdecoder -p 9191:9191 -p 9092:9092 --pull  always registry.cn-hangzhou.aliyuncs.com/woqutech/qdecoder
欢迎使用QDecoder!现在我将带你配置并启动QDecoder:
1.配置源端oracle数据库
1.1 必备条件:
  - 必须开启归档日志,且在线日志和归档日志都必须存储在ASM中。
  - 必须开启数据库级别的PK上的supplemental log,如 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
  - 如果要传输的表没有主键,则应该开启全列上的supplemental log, 如 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  - 为qdecoder准备一个oracle账号,该账号能够查询系统表格,如dba_tables等。
  - 以下sql将帮助您创建和修改相关配置,请以DBA帐号运行以下sql即可:

  alter database add supplemental log data (primary key) columns;
  create user qdecoder identified by qdecoder default tablespace USERS quota unlimited on USERS;
  grant connect,resource to qdecoder;
  grant select on v_$version                to qdecoder;
  grant select on v_$database_incarnation   to qdecoder;
  grant select on v_$database               to qdecoder;
  grant select on v_$parameter              to qdecoder;
  grant select on v_$archive_dest           to qdecoder;
  grant select on dba_objects               to qdecoder;
  grant select on dba_tab_columns           to qdecoder;
  grant select on dba_tab_cols              to qdecoder;
  grant select on dba_ind_columns           to qdecoder;
  grant select on dba_constraints           to qdecoder;
  grant select on dba_cons_columns          to qdecoder;
  grant select on dba_users                 to qdecoder;
  grant select on v_$logfile                to qdecoder;
  grant select on v_$log                    to qdecoder;
  grant select on v_$standby_log            to qdecoder;
  grant select on dba_tables                to qdecoder;
  grant select on gv_$instance              to qdecoder;
  grant select on v_$archived_log           to qdecoder;
  grant select on dba_lobs                  to qdecoder;
  grant select on nls_database_parameters   to qdecoder;
  grant select on gv_$thread                to qdecoder;
  grant select on v_$asm_diskgroup_stat     to qdecoder;
  grant select on v_$asm_alias              to qdecoder;
  grant select on dba_log_groups            to qdecoder;
  grant select on user_log_groups           to qdecoder;
  grant select on dba_log_group_columns     to qdecoder;
  grant select on user_log_group_columns    to qdecoder;
  grant select on dba_tab_partitions        to qdecoder;

  准备好上述条件后,请按[回车]键继续...

1.2 请输入数据库名,如 10.10.80.21:1521/rac,10.10.80.22:1521/rac
    如果是单节点,只需输入一个即可;如果是rac,需要输入所有节点:
>10.10.80.21:1521/rac,10.10.80.22:1521/rac
1.3 请输入数据库用户名(默认为qdecoder):
>
1.4 请输入数据库密码(默认为qdecoder):
>
1.5 请输入ASM用户名(默认为sys):
>
1.6 请输入ASM密码(默认为oracle):
>

2. 配置传输参数
2.1 请输入要传输的表,如 user1.t1,user1.t2,user2.t2
>qbench.t1

3. 配置输出目的地
3.1 请选择将binlog输出到哪里(可以选kafka, file, socket, 默认是socket):
>socket

生成配置文件 /app/qdecoder/defaultapp/basic.conf ...
生成配置文件 /app/qdecoder/defaultapp/assembler/assembler.conf ...
生成配置文件 /app/qdecoder/defaultapp/parser/logthread1/parser.conf ...
生成配置文件 /app/qdecoder/defaultapp/parser/logthread2/parser.conf ...
生成配置文件 /app/qdecoder/defaultapp/filter.conf ...
启动 assembler ........
启动 parser1 parser2 ...........

启动成功,你可以"在另一个窗口"执行 docker exec -it qdecoder "/bin/bash" 进入容器,检查下列log来查看assembler和parser的运行状况:
  /app/qdecoder/assembler/assember.log
  /app/qdecoder/parser/logthread1/parser.log
  /app/qdecoder/parser/logthread2/parser.log

现在,你可以在oracle数据库对下列表做insert/update/delete操作:
  qbench.t1

然后"在另一个窗口"执行下述命令查看binlog:
docker exec -it qdecoder  /app/qdecoder/bin/binlogdumpS -a 127.0.0.1:9191 -w

按组合键 Ctrl+pq 可以离开当前容器
执行 docker logs qdecoder 查看容器的输出
执行 docker stop qdecoder 停止容器
执行 docker start qdecoder 使用已有的配置,再次启动qdecoder
执行 docker start -i qdecoder 提供交互界面,执行如下操作:
  - 使用已有的配置,再次启动qdecoder
  - 或者只重置位点并启动qdecoder
  - 或者重新配置并启动qdecoder

⁠2.2 停止QDecoder

docker stop qdecoder

⁠2.3 重启QDecoder

docker start qdecoder

此种方式将使用上一次的配置,启动QDecoder

docker start -i qdecoder

些种方式提供交互界面,允许重新配置QDecoder,或者重置解析位点为数据库的当前SCN,然后启动QDecoder。

运行示例:

$ docker start -i qdecoder
配置文件已经存在, 您确定要重新配置吗? 输入 Y 或 y 重新配置,直接回车不配置:

如果当前解析位点对应的归档已被删除,请重置位点. 输入 Y 或 y 重置,直接回车不重置:y
已重置解析位点,将从数据库的当前SCN开始解析

启动 assembler ........
启动 parser1 parser2 ...........

启动成功,你可以"在另一个窗口"执行 docker exec -it qdecoder "/bin/bash" 进入容器,检查下列log来查看assembler和parser的运行状况:
  /app/qdecoder/assembler/assember.log
  /app/qdecoder/parser/logthread1/parser.log
  /app/qdecoder/parser/logthread2/parser.log

现在,你可以在oracle数据库对下列表做insert/update/delete操作:
  qbench.t1

然后"在另一个窗口"执行下述命令查看binlog:
docker exec -it qdecoder  /app/qdecoder/bin/binlogdumpS -a 127.0.0.1:9191 -w

按组合键 Ctrl+pq 可以离开当前容器
执行 docker logs qdecoder 查看容器的输出
执行 docker stop qdecoder 停止容器
执行 docker start qdecoder 使用已有的配置,再次启动qdecoder
执行 docker start -i qdecoder 提供交互界面,执行如下操作:
  - 使用已有的配置,再次启动qdecoder
  - 或者只重置位点并启动qdecoder
  - 或者重新配置并启动qdecoder

⁠2.4 删除QDecoder容器

docker stop qdecoder
docker rm qdecoder

⁠2.5 使用binlogdump工具查看binlog

按照界面的提示,使用QDeoder提供的binlogdump/binlogdumpS/binlogudmpK工具,分别获取file/socket/kafka中的binlog。

% docker exec -it qdecoder  /app/qdecoder/bin/binlogdumpS -a 127.0.0.1:9191 -w
INFO  :2021-12-24 04:34:43 : file=binlogdumpS.cpp,line=207,func=main : start dump binlog from 127.0.0.1:9191, start scn: 0
...

⁠2.6 解析示例

insert操作的binlog解析后示例:

header {
  serverenCode: "UTF-8"
  executeTime: 1640226123000
  sourceType: ORACLE
  schemaName: "qbench"
  tableName: "t1"
  eventType: INSERT
  gtid: "6408134649"
}
entryType: ROWDATA
-- storevalue:
eventType: INSERT
rowDatas {
  afterColumns {
    sqlType: 3
    name: "c1"
    isKey: true
    updated: true
    isNull: false
    value: "100"
    mysqlType: "2"
  }
  afterColumns {
    index: 1
    sqlType: 1
    name: "c2"
    updated: true
    isNull: true
    value: "hello"
    mysqlType: "96"
  }
}
props {
  key: "rowid"
  value: "AABglKAAFAAOAIeAAH"
}

⁠2.7 用户程序获取binlog

按照QDecoder的ProtoBuf定义文件,撰写反序列化代码。 从socket或kafka读取binlog,然后反序列化为ProtoBuf的message。

⁠2.8 性能

QDecoder单节点日志解析量约为120MB/s,RAC双节点日志解析量为200MB/s qdecoder-docker-demo

⁠FAQ

⁠QDecoder社区版是否需要付费

  • QDecoder社区版永久免费使用。
  • QDecoder提供订阅服务。在生产环境下使用QDecoder为oracle提供日志解析/订阅服务等的话,建议购买官方的订阅服务
  • QDecoder提供定制化服务。合作厂商可购买定制化服务来跟自己的软件进行适配,提供oracle日志解析能力;也可以购买定制化服务来根据您的需要增加相关功能。

⁠输出格式说明

⁠支持Oracle哪些特性

  • 支持Oracle10g,11g,12c~19c
  • Docker版本仅支持日志存储在ASM中;在线或者归档日志如果存储在本地文件系统的话,需要单独在Oracle源端上部署parser组件。
  • 支持除ROWID等绝大多数Oracle常见字段解析
  • 支持指定表的DML和DDL的数据增量同步
  • 支持Linux类小端系统(Little-endian)和AIX小机大端系统(Big-endian)
  • 支持Oracle单机和RAC集群
  • 支持Oracle连接池连接源库
  • 支持持续时间超过2天以上的事务解析
  • 支持数据直接流入kafka,支持socket方式推送日志变更
  • QDecoder支持行链接、行迁移;insert append;支持压缩表;支持部分回滚;支持多块undo等Oracle高级特性解析

⁠使用限制

  • QDecoder保证最终数据一致性,并且不保证数据不重复,在以下场景下,解析的数据可能有重复或者丢失:
    • QDecoder所在的Docker被删除并重新初始化(默认从当前最新的LSN开始解析)。该场景下解析的数据将从最新的LSN开始。
    • QDecoder位点信息丢失(存储在Docker文件中或者kafka中)。由于位点信息丢失,解析的数据将从最新的LSN开始。
    • QDecoder内部线程重启(parser或者assembler进程重启)。由于位点信息是定时保存的,部分数据可能重复。
  • QDecoder对于无主键表会通过回源反查的办法将全列数据反查出来。
  • QDecoder没有保存DDL元数据信息,数据字典信息是通过回源反查的方式来获取,如果延迟比较大,DDL和DML的信息可能无法匹配。
  • 对于主键更新的表,QDecoder会将后镜像的所有列数据补充完整。也就是说表tab1有id,name列,对于update tab1 set id=3 where id=2,对应的后镜像会包含有id和name两个字段的值。
  • QDecoder默认不解析blob字段,如果需要解析blob字段,请设置参数:max_lob_size=32768 //解析32K以下的blob,超过32k不输出
  • QDecoder解析的日志block大小必须是512字节的。
  • QDecoder对于ROWID等特殊类型的字段暂时没有解析。

Tag summary

Content type

Image

Digest

Size

256.7 MB

Last updated

almost 5 years ago

docker pull woqutech/qdecoder