注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。
这里记录运行databus自带的person的example的过程。
databus-master/sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.jar
其实做好如上操作即可开始编译了,databus wiki是这么介绍了,不过看有人编译会指定utf-8编码,其实不需要,因为这里不涉及中文。
task wrapper(type: Wrapper) {
gradleVersion = '1.8'
}
改为如下,否则编译的时候会报错:Cannot add task ‘wrapper’ as a task with that name already exists
wrapper {
gradleVersion = '1.8'
}
我本次编译使用版本是gradle5.1(试了最新的5.4.1编译太慢直接放弃了)
LocateRegistry.createRegistry(_containerStaticConfig.getJmx().getRmiRegistryPort());
最后完整结果:
protected void initializeContainerJmx()
{
if (_containerStaticConfig.getJmx().isRmiEnabled())
{
try
{
JMXServiceURL jmxServiceUrl =
new JMXServiceURL("service:jmx:rmi://" +
_containerStaticConfig.getJmx().getJmxServiceHost() + ":" +
_containerStaticConfig.getJmx().getJmxServicePort() +"/jndi/rmi://" +
_containerStaticConfig.getJmx().getRmiRegistryHost() + ":" +
_containerStaticConfig.getJmx().getRmiRegistryPort() + "/jmxrmi" +
_containerStaticConfig.getJmx().getJmxServicePort());
LocateRegistry.createRegistry(_containerStaticConfig.getJmx().getRmiRegistryPort())
_jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceUrl, null,
getMbeanServer());
}
catch (Exception e)
{
LOG.warn("Unable to instantiate JMX server", e);
}
}
}
注意首行导包:import java.rmi.registry.LocateRegistry;
sqlplus sys/oracle\@${DBNAME} as sysdba << __EOF__
这里我改为sys/oracle ,这是我的Oracle数据源的sysdba用户名密码。
{
"name" : "person",
"id" : 1,
"uri" : "jdbc:oracle:thin:person/person@localhost:1521:XE",
"slowSourceQueryThreshold" : 2000,
"sources" :
[
{"id" : 101,
"name" : "com.linkedin.events.example.person.Person",
"uri": "person.person",
"partitionFunction" : "constant:1"
}
]
}
以上都操作好了即可编译了:
gradle -Dopen_source=true assemble
java是向下兼容的,我用的jdk8,编译的时候只是会警告有些方法过期而已,是可以成功编译的。
编译好了会在build文件夹下生成很多编译后的文件。
sh ./db/oracle/bin/createUser.sh person person xe tbs_person /u01/app/oracle/oradata/XE/person/
cd ./db/oracle/fwk
sh /home/databus-master/db/oracle/bin/createSchema.sh person/person@xe /home/databus-master/databus2-example/database/person/
cd /home/databus-master/build/databus2-cmdline-tools-pkg/distributions
tar -zxvf databus2-cmdline-tools-pkg-2.0.0.tar.gz
cd bin
sh dbus2-avro-schema-gen.sh -namespace com.linkedin.events.example.person -recordName Person -viewName "sy\$person" -avroOutDir /home/databus-master/myperson-avro/avroOut -avroOutVersion 1 -javaOutDir /home/databus-master/myperson-avro/javaOut -userName person -password person -database jdbc:oracle:thin:@localhost:1521:xe
tar -zxvf build/databus2-example-relay-pkg/distributions/databus2-example-relay-pkg-2.0.0.tar.gz
sh start-example-relay.sh person
tar -zxvf build/databus2-example-client-pkg/distributions/databus2-example-client-pkg-2.0.0.tar.gz
sh start-example-client.sh person
INSERT INTO person(id,first_name, last_name,birth_date) VALUES(1,'Trump', 'Donald',sysdate);
update person p set p.BIRTH_DATE = sysdate -100 where p.ID = 1;
到此为止,我们能够捕获Oracle数据库变更的行信息。但需要针对每个表新加字段txn,对每个表建立触发器。但捕获到了的数据不像ogg一样可以直接同步到目标库,目前来看这部分需要写代码单独处理。
网络上关于databus的文章资料比较少,我整理了一下有价值的资料地址,我的实验也参考了下面的文章: