本文主要參考文檔和博客如下:
https://dongkelun.com/2018/05/23/oggOracle2Kafka/
https://www.jianshu.com/p/b1e1fb623f15
原因是這樣的:當我使用debezium插件對oracle進行cdc日誌獲取的時候發現我的oracle版本過低爲11G,不支持
alter system set enable_goldengate_replication=true;
的屬性(雖然不知有何影響),然後看了看debezium對於oracle連接器的說法爲孵化階段,所以就滾去OGG將oracle數據庫ddl變更推到kafka了。
一、開發環境
源端:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Oracle GoldenGate Manager for Oracle
Version 12.2.0.2.3 OGGCORE_12.2.0.2.0_PLATFORMS_170727.1430
Windows x64 (optimized),
目標端:
OGG_BigData_Linux_x64_19.1.0.0.1.tar
kafka2.12-2.4.0
二、 源端配置
2.1 Oracle配置,OGG解壓安裝
- 解壓文件,安裝OGG
- 登錄Oracle,啓動oracle歸檔模式
sqlplus / as sysdba
archive log list --- 該命令爲查看歸檔日誌情況
conn / as sysdba (以DBA身份連接數據庫)
shutdown immediate (立即關閉數據庫)
startup mount (啓動實例並加載數據庫,但不打開)
alter database archivelog; (更改數據庫爲歸檔模式)
alter database open; (打開數據庫)
alter system archive log start; (啓用自動歸檔)
--查看輔助日誌情況
select force_logging, supplemental_log_data_min from v$database;
alter database force logging;
alter database add supplemental log data;
--這裏創建複製用戶,便於管理
SQL> create tablespace oggtbs datafile 'C:\app\Administrator\product\oggdata\oggtbs01.dbf' size 1000M autoextend on;
Tablespace created.
SQL> create user ogg identified by ogg default tablespace oggtbs;
User created.
-- 根據實際給予相關權限,這裏便於操作給予dba權限,實際需求中請給予正確的權限
SQL> grant dba to ogg;
Grant succeeded.
3. 啓動OGG,進入到OGG安裝目錄,啓動文件夾下的ggsci.exe程序
4.在ggsci.exe界面中執行以下命令
dblogin userid ogg password ogg --使用oracle複製用戶進行登錄
登錄成功顯示
Successfully logged into database.
下列該步驟可有可無。我試了下並沒有影響:
GGSCI > edit param ./globals
添加內容
oggschema ogg
2.2 配置mgr管理器
GGSCI > edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW; --記住以;結尾
上述說明:
PORT即mgr的默認監聽端口;
DYNAMICPORTLIST動態端口列表,當指定的mgr端口不可用時,會在這個端口列表中選擇一個,最大指定範圍爲256個;
AUTORESTART重啓參數設置表示重啓所有EXTRACT進程,最多5次,每次間隔3分鐘;
PURGEOLDEXTRACTS即TRAIL文件的定期清理
下一步,添加複製表
GGSCI > add trandata test_ogg.test_ogg --此處爲 庫名.表名 的形式編寫
Logging of supplemental redo data enabled for table TEST_OGG.TEST_OGG.
GGSCI > info trandata test_ogg.test_ogg
Logging of supplemental redo log data is enabled for table TEST_OGG.TEST_OGG.
Columns supplementally logged for table TEST_OGG.TEST_OGG: ID
2.3 配置extract進程
GGSCI > edit param extkafka --具體名稱自己取,便於管理
extract extkafka
dynamicresolution
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8") --此處的編碼問題也是個坑,可能會GBK問題
userid ogg,password ogg
exttrail /opt/ogg/dirdat/to --此處爲linux環境的話就填linux下的OGG位置,爲windows即填windows位置
table test_ogg.test_ogg;
說明:
第一行指定extract進程名稱;
dynamicresolution動態解析;
SETENV設置環境變量,這裏分別設置了Oracle數據庫以及字符集;
userid ggs,password ggs即OGG連接Oracle數據庫的帳號密碼,這裏使用創建的複製帳號;
exttrail定義trail文件的保存位置以及文件名,注意這裏文件名只能是2個字母(即會出現to0000000000這樣的文件),其餘部分OGG會補齊;
table即複製表的表名,支持*通配,必須以;結尾(這裏爲單表的形式進行測試)
添加extract進程:
GGSCI > add extract extkafka,tranlog,begin now
EXTRACT added.
添加trail文件的定義與extract進程綁定:
GGSCI (ambari.master.com) 17> add exttrail C:\app\Administrator\ogg122023\dirdat\to,extract extkafka
EXTTRAIL added.
--注意此處的位置依舊是linux環境和windows環境的位置不同,/和\也不同
2.4 配置pump進程
pump進程本質上來說也是一個extract,只不過他的作用僅僅是把trail文件傳遞到目標端,配置過程和extract進程類似,只是邏輯上稱之爲pump進程。
GGSCI (ambari.master.com) 18> edit param pukafka
extract pukafka
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.44.129 mgrport 7809 --目標端的地址和端口
rmttrail /opt/ogg/dirdat/to --目標端的trail文件存儲位置名稱
table test_ogg.test_ogg;
說明:第一行指定extract進程名稱;
passthru即禁止OGG與Oracle交互,我們這裏使用pump邏輯傳輸,故禁止即可;
dynamicresolution動態解析;
userid ogg,password ogg即OGG連接Oracle數據庫的帳號密碼;
rmthost和mgrhost即目標端(kafka)OGG的mgr服務的地址以及監聽端口;
rmttrail即目標端trail文件存儲位置以及名稱。
將本地trail文件和目標端的trail文件綁定到extract進程:
--注意第一條是源端路徑,第二條命令是目標端路徑,注意linux和windows地址寫法
GGSCI > add extract pukafka,exttrailsource C:\app\Administrator\ogg122023\dirdat\to
EXTRACT added.
GGSCI > add rmttrail /opt/ogg/dirdat/to,extract pukafka
RMTTRAIL added.
2.5 配置define文件
Oracle與MySQL,Hadoop集羣(HDFS,Hive,kafka等)等之間數據傳輸可以定義爲異構數據類型的傳輸,故需要定義表之間的關係映射,在OGG命令行執行:
GGSCI > edit param test_ogg
defsfile C:\app\Administrator\ogg122023\dirdef\test_ogg.test_ogg
userid ogg,password ogg
table test_ogg.test_ogg;
在OGG主目錄下執行命令,生成映射文件:
注意:linux和windows下的地址問題。
如果是linux下,則在ogg目錄下執行該語句
./defgen paramfile dirprm/test_ogg.prm
如果是windows環境下,則進入OGG目錄下,按住shift加右鍵打開powershell,執行下面命令
.\defgen.exe paramfile C:\app\Administrator\ogg122023\dirprm\test_oggg.prm
如下
將生成的test_ogg.test_ogg(自己命名)的文件移動到目標端(好像目標端還沒配置。。)的dirdef文件夾下。
此時,源端的配置基本完成。
三、目標端部署
我們假設已經裝好了kafka環境。
與上述源端配置相同,此處是linux下的目標端,所以將壓縮包解壓完畢。
此處解壓到/usr/local/tools/app/ogg目錄下
tar -xvf ggs_Adapters_Linux_x64.tar
同理,進行ggsci命令行:
ggsci
此處關於mgr配置基本與源端相似了
3.1 配置mgr管理器
mgr文件配置
GGSCI > edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW;
3.2 配置checkpoint
edit param ./GLOBALS
CHECKPOINTTABLE test_ogg.checkpoint
3.3 配置replicate進程
GGSCI > edit param rekafka
REPLICAT rekafka
sourcedefs /opt/ogg/dirdef/test_ogg.test_ogg
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAP test_ogg.test_ogg, TARGET test_ogg.test_ogg;
說明:REPLICATE rekafka定義rep進程名稱;
sourcedefs即在4.6中在源服務器上做的表映射文件;
TARGETDB LIBFILE即定義kafka一些適配性的庫文件以及配置文件,配置文件位於OGG主目錄下的dirprm/kafka.props;
REPORTCOUNT即複製任務的報告生成頻率;
GROUPTRANSOPS爲以事務傳輸時,事務合併的單位,減少IO操作;
MAP即源端與目標端的映射關係。
注意:該版本下的dirprm目錄下只有剛剛生成的mgr.mgr文件,並沒有kafka.props等配置文件,所以需要去
下面的
拿到配置文件並複製到到dirprm文件夾下。
此處拉取kafka.props和custom_kafka_producer.properties文件。
3.4 配置kafka.props和custom_kafka_producer.properties
1. kafka.props
gg.handlerlist=kafkahandler //handler類型
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties //kafka相關配置
gg.handler.kafkahandler.topicMappingTemplate=test_ogg //kafka的topic名稱,無需手動創建
gg.handler.kafkahandler.format=json //傳輸文件的格式,支持json,xml等
gg.handler.kafkahandler.mode=op //OGG for Big Data中傳輸模式,即op爲一次SQL傳輸一次,tx爲一次事務傳輸一次
gg.classpath=dirprm/:/opt/kafka_2.11-2.4.0/libs/*:/opt/ogg/:/opt/ogg/lib/*
注意:gg.classpath配置kafka和ogg的libs位置,不然啓動的時候讀取不到相關jar包,會報錯
2. custom_kafka_producer.properties
bootstrap.servers=192.168.44.129:9092 //kafkabroker的地址
acks=1
compression.type=gzip //壓縮類型
reconnect.backoff.ms=1000 //重連延時
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=102400
linger.ms=10000
3.5 添加trail文件到replicate進程
GGSCI > add replicat rekafka exttrail /usr/local/tools/app/ogg/dirdat/to,checkpointtable test_ogg.checkpoint
REPLICAT added.
四、進程啓動
如果上述操作都完成並沒有報錯ERROR情況,則接下來進行最終測試。
源端目標端都在ggsci命令行下輸入命令啓動進程。
4.1 源端啓動
他們說按照順序啓動
start mgr
start extkafka
start pukafka
啓動成功,則會看到三個窗口彈出,並無明顯錯誤信息、無窗口閃退情況:
4.2 目標端啓動
start mgr
start rekafka
在ggsci命令行中使用
GGSCI > info all
可以查看啓動信息
例如:
看到自己啓動的進程爲RUNNING狀態則爲啓動成功。
若有問題(窗口閃退,報錯啓動失敗),可以查看系統日誌:
1. windows下
ogg目錄下的ggserr.log日誌文件
也可以在ggsci下使用下列命令查看
view report extkafka --這個取決於你的名稱是什麼,比如是extkafka
2. linux下
與windows相同,但是對於kafka報錯可以去
五、 數據測試
連接oracle,使用剛剛創建的測試表進行插入等語句測試:
conn test_ogg/test_ogg
insert into test_ogg values(1,'test');
commit;
update test_ogg set name='zhangsan' where id=1;
commit;
delete test_ogg where id=1;
commit;
注意:這裏一定要commit,纔可以提交併監測到數據變化。
此時,發現源端和目標端的dirdat文件夾下生成了to0000的文件。
查看kafka的主題情況:
bin/kafka-topics.sh --list --zookeeper localhost:2181
主題創建成功。
消費該test_ogg主題,即監控的表:
能讀取到其變化,此時全部步驟完成。
六、 注意問題
6.1 源端和目標端的編碼問題
參考:https://blog.csdn.net/u010457406/article/details/75646547
SHUTDOWN IMMEDIATE; --同樣需要關閉數據庫
STARTUP MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USEAL32UTF8; --此處加上了INTENAL_USER
SHUTDOWN immediate;
startup;
6.2 kafka序列化配置問題
custom_kafka_producer.properties配置文件中,序列化與反序列化中選擇ByteArray。若是選擇String則會報錯,待解決。
ByteArraySerializer不影響消費(即亂碼問題沒有出現)
6.3 多表配置
如果想通配整個庫的話,只需要把上面的配置所有表名的改爲,如test_ogg.test_ogg改爲 test_ogg.,但是kafka的topic不能通配,所以需要把所有的表的數據放在一個topic即可,後面再用程序解析表名即可。
七、 總結
可以說查找了挺多的文章博客和官網文檔說明,一開始根本找不到之前版本的OGG插件包,然後梯子出去官網下載的根本沒有12版本的包,最後還是百度搜索進去才下載好的。
當我很開心看到了有大佬配置的文章,雖然是linux下的配置,但是還是挺舒服解決了這個配置問題。
所以這裏是windows下源端的配置,總結到這裏。
另外Oracle我想罵娘了,配置這麼複雜真的有人用嗎(哦,我用啊,那沒事了),何況我一開始想好好寫這個配置文章的,當我寫到後面發現這麼長,這麼繁瑣。當真不想寫下去了。前面老哥完整記錄下來真的辛苦了。
另外,關於這個配置,我沒有進行多表、全庫、正則匹配表的嘗試。或許之後工作需要會進行填坑。
配置是真的繁瑣!!!
文章或許有表名不同的情況,請自行修改。