oracle redo日志解析工具,可以将oracle数据变化实时写入kafka,支持准实时增量迁移、同步、订阅。现已改名为o2k
1.8K
已改名为o2k
QDecoder是一款高性能、免费的oracle日志订阅同步软件,容器化一键安装,能够从oracle数据库读取在线日志文件和归档日志文件,解析出DDL和DML操作,输出binlog。
QDecoder支持按表过滤数据,只输出用户指定的表上的操作。
QDecoder支持多种输出目的地,可以把binlog输出到kafka, file或socket。用户根据需要,选取一种方式获取binlog。
QDecoder输出的binlog以ProtoBuf格式打包,消费者可以轻松解包使用。架构图如下:

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即可。
运行示例:

$ 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
docker stop 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
docker stop qdecoder
docker rm qdecoder
按照界面的提示,使用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
...
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"
}
按照QDecoder的ProtoBuf定义文件,撰写反序列化代码。 从socket或kafka读取binlog,然后反序列化为ProtoBuf的message。
QDecoder单节点日志解析量约为120MB/s,RAC双节点日志解析量为200MB/s

Content type
Image
Digest
Size
256.7 MB
Last updated
almost 5 years ago
docker pull woqutech/qdecoder