mysql goldengate_oracle GoldenGate实现Oracle到MySQL数据平滑迁移
(一)OGG邏輯架構(gòu)
參照上圖簡(jiǎn)單給大家介紹下OGG邏輯架構(gòu),讓大家對(duì)OGG數(shù)據(jù)同步過(guò)程有個(gè)簡(jiǎn)單了解,后面章節(jié)會(huì)詳細(xì)演示相關(guān)進(jìn)程的配置方式,在OGG使用過(guò)程中主要涉及以下進(jìn)程及文件:Manager進(jìn)程:需要源端跟目標(biāo)端同時(shí)運(yùn)行,主要作用是監(jiān)控管理其它進(jìn)程,報(bào)告錯(cuò)誤,分配及清理數(shù)據(jù)存儲(chǔ)空間,發(fā)布閾值報(bào)告等
Extract進(jìn)程:運(yùn)行在數(shù)據(jù)庫(kù)源端,主要用于捕獲數(shù)據(jù)的變化,負(fù)責(zé)全量、增量數(shù)據(jù)的抽取
Trails文件:臨時(shí)存放在磁盤(pán)上的數(shù)據(jù)文件
Data Pump進(jìn)程:運(yùn)行在數(shù)據(jù)庫(kù)源端,屬于Extract進(jìn)程的一個(gè)輔助進(jìn)程,如果不配置Data Pump,Extract進(jìn)程會(huì)將抽取的數(shù)據(jù)直接發(fā)送到目標(biāo)端的Trail文件,如果配置了Data Pump,Extract進(jìn)程會(huì)將數(shù)據(jù)抽取到本地Trail文件,然后通過(guò)Data Pump進(jìn)程發(fā)送到目標(biāo)端,配置Data Pump進(jìn)程的主要好處是即使源端到目標(biāo)端發(fā)生網(wǎng)絡(luò)中斷,Extract進(jìn)程依然不會(huì)終止
Collector進(jìn)程:接收源端傳輸過(guò)來(lái)的數(shù)據(jù)變化,并寫(xiě)入本地Trail文件中
Replicat進(jìn)程:讀取Trail文件中記錄的數(shù)據(jù)變化,創(chuàng)建對(duì)應(yīng)的DML語(yǔ)句并在目標(biāo)端回放
二、遷移方案
(一)表結(jié)構(gòu)遷移表結(jié)構(gòu)遷移屬于難度不高但內(nèi)容比較繁瑣的一步,我們?cè)谶w移表結(jié)構(gòu)時(shí)使用了一個(gè)叫sqlines的開(kāi)源工具,對(duì)于sqlines工具在MySQL端創(chuàng)建失敗及不符合預(yù)期的表結(jié)構(gòu)再進(jìn)行特殊處理,以此來(lái)提高表結(jié)構(gòu)轉(zhuǎn)換的效率。
注意:OGG在Oracle遷移MySQL的場(chǎng)景下不支持DDL語(yǔ)句同步,因此表結(jié)構(gòu)遷移完成后到數(shù)據(jù)庫(kù)切換前盡量不要再修改表結(jié)構(gòu)。
(二)數(shù)據(jù)遷移數(shù)據(jù)同步的操作均采用OGG工具進(jìn)行,考慮數(shù)據(jù)全量和增量的銜接,OGG需要先將增量同步的抽取進(jìn)程啟動(dòng),抓取數(shù)據(jù)庫(kù)的redo log,待全量抽取結(jié)束后開(kāi)啟增量數(shù)據(jù)回放,應(yīng)用全量和增量這段期間產(chǎn)生的日志數(shù)據(jù),OGG可基于參數(shù)配置進(jìn)行重復(fù)數(shù)據(jù)處理,所以使用OGG時(shí)優(yōu)先將增量進(jìn)行配置并啟用。此外,為了避免本章節(jié)篇幅過(guò)長(zhǎng),OGG參數(shù)將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢(xún)?nèi)魏文悴焕斫獾膮?shù)。三、數(shù)據(jù)校驗(yàn)
數(shù)據(jù)校驗(yàn)是數(shù)據(jù)遷移過(guò)程中必不可少的環(huán)節(jié),本章節(jié)提供給幾個(gè)數(shù)據(jù)校驗(yàn)的思路共大家參數(shù),校驗(yàn)方式可以由以下幾個(gè)角度去實(shí)現(xiàn):
1.通過(guò)OGG日志查看全量、增量過(guò)程中discards記錄是否為0來(lái)判斷是否丟失數(shù)據(jù);
2.通過(guò)對(duì)源端、目標(biāo)端的表執(zhí)行count判斷數(shù)據(jù)量是否一致;
3.編寫(xiě)類(lèi)似于pt-table-checksum校驗(yàn)原理的程序,實(shí)現(xiàn)行級(jí)別一致性校驗(yàn),這種方式優(yōu)缺點(diǎn)特別明顯,優(yōu)點(diǎn)是能夠完全準(zhǔn)確對(duì)數(shù)據(jù)內(nèi)容進(jìn)行校驗(yàn),缺點(diǎn)是需要遍歷每一行數(shù)據(jù),校驗(yàn)成本較高;
4.相對(duì)折中的數(shù)據(jù)校驗(yàn)方式是通過(guò)業(yè)務(wù)角度,提前編寫(xiě)好數(shù)十個(gè)返回結(jié)果較快的SQL,從業(yè)務(wù)角度抽樣校驗(yàn)。
四、遷移問(wèn)題處理本章節(jié)將講述遷移過(guò)程中碰到的一些問(wèn)題及相應(yīng)的解決方式。
(一)MySQL限制
在Oracle到MySQL的表結(jié)構(gòu)遷移過(guò)程中主要碰到以下兩個(gè)限制:
1. Oracle端的表結(jié)構(gòu)因?yàn)樽畛踉O(shè)計(jì)不嚴(yán)謹(jǐn),存在大量的列使用varchar(4000)數(shù)據(jù)類(lèi)型,導(dǎo)致遷移到MySQL后超出行限制,表結(jié)構(gòu)無(wú)法創(chuàng)建。由于MySQL本身數(shù)據(jù)結(jié)構(gòu)的限制,一個(gè)16K的數(shù)據(jù)頁(yè)最少要存儲(chǔ)兩行數(shù)據(jù),因此單行數(shù)據(jù)不能超過(guò)65,535 bytes,因此針對(duì)這種情況有兩種解決方式:根據(jù)實(shí)際存儲(chǔ)數(shù)據(jù)的長(zhǎng)度,對(duì)超長(zhǎng)的varchar列進(jìn)行收縮;
對(duì)于無(wú)法收縮的列轉(zhuǎn)換數(shù)據(jù)類(lèi)型為text,但這在使用過(guò)程中可能導(dǎo)致一些性能問(wèn)題;
2. 與第一點(diǎn)類(lèi)似,在Innodb存儲(chǔ)引擎中,索引前綴長(zhǎng)度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開(kāi)啟innodblargeprefix的場(chǎng)景下,這個(gè)限制是3072 bytes,即使用utf8mb4字符集時(shí),最多只能對(duì)varchar(768)的列創(chuàng)建索引;
3. 使用ogg全量初始化同步時(shí),若存在外鍵約束,批量導(dǎo)入時(shí)由于各表的插入順序不唯一,可能子表先插入數(shù)據(jù)而主表還未插入,導(dǎo)致報(bào)錯(cuò)子表依賴(lài)的記錄不存在,因此建議數(shù)據(jù)遷移階段禁用主外鍵約束,待遷移結(jié)束后再打開(kāi)。mysql>set global foreign_key_checks=off;
(二)全量與增量銜接HANDLECOLLISIONS參數(shù)是實(shí)現(xiàn)OGG全量數(shù)據(jù)與增量數(shù)據(jù)銜接的關(guān)鍵,其實(shí)現(xiàn)原理是在全量抽取前先開(kāi)啟增量抽取進(jìn)程,抓去全量應(yīng)用期間產(chǎn)生的redo log,當(dāng)全量應(yīng)用完成后,開(kāi)啟增量回放進(jìn)程,應(yīng)用全量期間的增量數(shù)據(jù)。使用該參數(shù)后增量回放DML語(yǔ)句時(shí)主要有以下場(chǎng)景及處理邏輯:目標(biāo)端不存在delete語(yǔ)句的記錄,忽略該問(wèn)題并不記錄到discardfile
目標(biāo)端丟失update記錄
– 更新的是主鍵值,update轉(zhuǎn)換成insert
– 更新的鍵值是非主鍵,忽略該問(wèn)題并不記錄到discardfile
目標(biāo)端重復(fù)insert已存在的主鍵值,這將被replicat進(jìn)程轉(zhuǎn)換為UPDATE現(xiàn)有主鍵值的行
總結(jié)
以上是生活随笔為你收集整理的mysql goldengate_oracle GoldenGate实现Oracle到MySQL数据平滑迁移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网易成立新海外远程工作室 Spliced
- 下一篇: html5的作用是什么