o2k目前已经更新为web版DBMotion:https://squids.cn/product/dbmotion
1.9K
o2k目前已经升级为DBMotion,web界面型操作,持续迭代,服务支持更及时。
o2k是一款高性能、免费的oracle日志订阅同步软件,容器化一键安装,能够从oracle数据库读取在线日志文件和归档日志文件,解析出DDL和DML操作,输出binlog。
o2k支持按表过滤数据,只输出用户指定的表上的操作。
o2k支持多种输出目的地,可以把binlog输出到kafka, file或socket。用户根据需要,选取一种方式获取binlog。
o2k输出的binlog以ProtoBuf格式打包,消费者可以轻松解包使用。架构图如下:

docker环境安装可以参考Docker官方安装文档。Centos的安装文档见:https://docs.docker.com/engine/install/centos/ docker版本建议安装最新版本,当前最新版本为24.0。建议最低安装20.10版本
docker run -it --name=o2k -p 9191:9191 -p 9092:9092 --pull always registry.cn-hangzhou.aliyuncs.com/woqutech/o2k
以交互方式启动,按提示配置参数,运行o2k。
如果选择将binlog输出到file或socket,则o2k监听容器内的9191端口,输出binlog,故需要导出9191端口,供外部程序获取binlog。
如果选择将binlog输出到kafka,则直接从kafka读取binlog即可。
运行示例:

$ docker run -it --name=o2k -p 9191:9191 -p 9092:9092 --pull always registry.cn-hangzhou.aliyuncs.com/woqutech/o2k
欢迎使用o2k!现在我将带你配置并启动o2k:
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;
- 为o2k准备一个oracle账号,该账号能够查询系统表格,如dba_tables等。
- 以下sql将帮助您创建和修改相关配置,请以DBA帐号运行以下sql即可:
alter database add supplemental log data (primary key) columns;
create user o2k identified by o2k default tablespace USERS quota unlimited on USERS;
grant connect,resource to o2k;
grant select on v_$version to o2k;
grant select on v_$database_incarnation to o2k;
grant select on v_$database to o2k;
grant select on v_$parameter to o2k;
grant select on v_$archive_dest to o2k;
grant select on dba_objects to o2k;
grant select on dba_tab_columns to o2k;
grant select on dba_tab_cols to o2k;
grant select on dba_ind_columns to o2k;
grant select on dba_constraints to o2k;
grant select on dba_cons_columns to o2k;
grant select on dba_users to o2k;
grant select on v_$logfile to o2k;
grant select on v_$log to o2k;
grant select on v_$standby_log to o2k;
grant select on dba_tables to o2k;
grant select on gv_$instance to o2k;
grant select on v_$archived_log to o2k;
grant select on dba_lobs to o2k;
grant select on nls_database_parameters to o2k;
grant select on gv_$thread to o2k;
grant select on v_$asm_diskgroup_stat to o2k;
grant select on v_$asm_alias to o2k;
grant select on dba_log_groups to o2k;
grant select on user_log_groups to o2k;
grant select on dba_log_group_columns to o2k;
grant select on user_log_group_columns to o2k;
grant select on dba_tab_partitions to o2k;
准备好上述条件后,请按[回车]键继续...
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 请输入数据库用户名(默认为o2k):
>
1.4 请输入数据库密码(默认为o2k):
>
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/o2k/defaultapp/basic.conf ...
生成配置文件 /app/o2k/defaultapp/assembler/assembler.conf ...
生成配置文件 /app/o2k/defaultapp/parser/logthread1/parser.conf ...
生成配置文件 /app/o2k/defaultapp/parser/logthread2/parser.conf ...
生成配置文件 /app/o2k/defaultapp/filter.conf ...
启动 assembler ........
启动 parser1 parser2 ...........
启动成功,你可以"在另一个窗口"执行 docker exec -it o2k "/bin/bash" 进入容器,检查下列log来查看assembler和parser的运行状况:
/app/o2k/assembler/assember.log
/app/o2k/parser/logthread1/parser.log
/app/o2k/parser/logthread2/parser.log
现在,你可以在oracle数据库对下列表做insert/update/delete操作:
qbench.t1
然后"在另一个窗口"执行下述命令查看binlog:
docker exec -it o2k /app/o2k/bin/binlogdumpS -a 127.0.0.1:9191 -w
按组合键 Ctrl+pq 可以离开当前容器
执行 docker logs o2k 查看容器的输出
执行 docker stop o2k 停止容器
执行 docker start o2k 使用已有的配置,再次启动o2k
执行 docker start -i o2k 提供交互界面,执行如下操作:
- 使用已有的配置,再次启动o2k
- 或者只重置位点并启动o2k
- 或者重新配置并启动o2k
docker stop o2k
docker start o2k
此种方式将使用上一次的配置,启动o2k
docker start -i o2k
些种方式提供交互界面,允许重新配置o2k,或者重置解析位点为数据库的当前SCN,然后启动o2k。
运行示例:
$ docker start -i o2k
配置文件已经存在, 您确定要重新配置吗? 输入 Y 或 y 重新配置,直接回车不配置:
如果当前解析位点对应的归档已被删除,请重置位点. 输入 Y 或 y 重置,直接回车不重置:y
已重置解析位点,将从数据库的当前SCN开始解析
启动 assembler ........
启动 parser1 parser2 ...........
启动成功,你可以"在另一个窗口"执行 docker exec -it o2k "/bin/bash" 进入容器,检查下列log来查看assembler和parser的运行状况:
/app/o2k/assembler/assember.log
/app/o2k/parser/logthread1/parser.log
/app/o2k/parser/logthread2/parser.log
现在,你可以在oracle数据库对下列表做insert/update/delete操作:
qbench.t1
然后"在另一个窗口"执行下述命令查看binlog:
docker exec -it o2k /app/o2k/bin/binlogdumpS -a 127.0.0.1:9191 -w
按组合键 Ctrl+pq 可以离开当前容器
执行 docker logs o2k 查看容器的输出
执行 docker stop o2k 停止容器
执行 docker start o2k 使用已有的配置,再次启动o2k
执行 docker start -i o2k 提供交互界面,执行如下操作:
- 使用已有的配置,再次启动o2k
- 或者只重置位点并启动o2k
- 或者重新配置并启动o2k
docker stop o2k
docker rm o2k
按照界面的提示,使用QDeoder提供的binlogdump/binlogdumpS/binlogudmpK工具,分别获取file/socket/kafka中的binlog。
% docker exec -it o2k /app/o2k/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"
}
按照o2k的ProtoBuf定义文件,撰写反序列化代码。 从socket或kafka读取binlog,然后反序列化为ProtoBuf的message。
o2k单节点日志解析量约为120MB/s,RAC双节点日志解析量为200MB/s

Content type
Image
Digest
sha256:3452651a6…
Size
257.1 MB
Last updated
over 3 years ago
docker pull woqutech/o2k