在使用OGG開始增量資料的實時複製之前,一般需要對當前的存量資料進行初始化,如果是同構資料庫,則可以使用資料庫自帶的工具完成,比如Oracle DB中的rman, expdp/impdp等。
其實ogg自己也可以實現初始化,而且支援異構平臺的初始化,即使用OGG同步不同DB之間的存量資料。主要有兩種配置方式,一種是抽取存量資料為OGG的佇列檔案,然後在目標節點上再讀取此佇列檔案後載入到目標庫上;一種是抽取程式讀取存量資料後直接呼叫目標端的replicat程式,資料不落地,直接寫入目標DB。另外,從抽取效能方面,OGG可以基於欄位的取值,配置多個抽取程式,從而實現並行抽取以提升初始化的效能,一般以ID主鍵欄位或列舉值為拆分原則。
以下分別介紹初始化的兩種配置方式。
第一種,存量資料需要落地
此方法與傳統的抽取增量資料的方法類似,只是引數上配置略有不同。
以下示例假設的mysql的user.tb1表有100W條記錄,配置兩個抽取程式,分別以主鍵ID欄位進行劃分,資料在本地不落地,直接傳輸到目標oracle主機上。
extract exta userid ggadmin, password Oracle1 rmthost oelmysql, mgrport 15600, tcpbufsize 288750, tcpflushbytes 288750 rmtfile ./dirdat/ea, maxfiles 999999, megabytes 1500, append reportcount every 60 seconds, rate table user.tb1, filter (id < 500000); extract extb |
GGSCI>add extract exta, SourceisTable
GGSCI>add extract extb, SourceisTable
分別啟動兩個程式,此時在目標端將會生成兩個佇列:ea, eb
GGSCI>start exta
GGSCI>start extb
在目標端的OGG上配置
replicat repa userid gguser, password Oracle1 discardfile ./dirrpt/lmysql.dsc, purge reportcount every 60 seconds, rate map user1.tb1, target scott.tb1; replicat repb |
GGSCI>add replicat repa, exttrail ./dirdat/ea
GGSCI>add replicat repb, exttrail ./dirdat/eb
GGSCI>start repa
GGSCI>start repb
如果源表資料量很大,也可以針對每個源端的抽取配置多個replicat程式,進一步實現並行投遞。
從以上可以看到,需要落地的存量資料初始化方式與傳統增量複製的配置基本一致,除了源端抽取程式新增略有不同之外。
第二種方法,資料不落地
仍然以前面的場景為準
extract exta userid ggadmin, password Oracle1 rmthost oelmysql, mgrport 7809 RMTTASK REPLICAT, GROUP rinita reportcount every 60 seconds, rate table user.tb1, filter (id < 500000); extract extb |
GGSCI>add extract exta, SourceisTable
GGSCI>add extract extb, SourceisTable
現在還不能啟動抽取程式
在目標端的OGG上配置
replicat rinita replicat rinitb |
GGSCI>add replicat repa, specialRun
GGSCI>add replicat repb, specialRun
此時,啟動源端的抽取程式
GGSCI>start ext*
然後在源端檢視程式狀態
GGSCI>info ext*
再到目標端目標端檢視程式狀態
GGSCI>info rinit*
會發現目標端程式已經被抽取程式自動拉起,不需要人工啟動。
如果源表的資料量很小,有可能在檢視目標端程式時,資料已經初始化完成。
- 以上兩種方式,在源庫可以停機的情況下,可以很方便的進行異構平臺的資料初始化,同時,也可以使用增量複製過程中的多個命令,如view param, stats, view report等。
- 如果在空間不足,且資料量不是太大的情況下,可以考慮第二種方式進行初始化。
- 第二種方式一旦初始化過程中網路中斷或程式aborted,則需要從頭開始初始化(先清除目標表的記錄);第一種方式如果抽取未完成,網路中斷或程式當機,也需要從頭開始初始化。
- 不過不管哪種方式,都需要手工建立目標表。
- 目標端也支援大資料平臺的初始化,比如從oracle/mysql/db2投遞資料到hdfs/hive/hbase等,不需要使用sqoop等軟體。