十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1.create
站在用戶的角度思考問題,與客戶深入溝通,找到綏陽網(wǎng)站設(shè)計(jì)與綏陽網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋綏陽地區(qū)。
directory
exp_dp
as
'/opt/yy'
yy是自己創(chuàng)建的文件夾
2.grant
read,wirte
on
exp_dp
to
icd(用戶名)
3.expdp
icd/icd@數(shù)據(jù)庫連接字符
schemas=icd
dumpfile=expdp1.dmp
logfile=export.log
directory=exp_dp
上面是導(dǎo)出操作,前兩個(gè)在數(shù)據(jù)庫命令窗口執(zhí)行,最后一個(gè)在操作系統(tǒng)下運(yùn)行
操作最簡單的是用數(shù)據(jù)泵工具(expdp/impdp),從A上全庫導(dǎo)出;
在B上創(chuàng)建一個(gè)數(shù)據(jù)庫,注意字符集要跟A一樣,如果你不想重新映射表空間,最好把用戶名和表空間都跟A上建一樣的。啟動(dòng)B數(shù)據(jù)庫之后,使用impdp工具全庫導(dǎo)入,OK
數(shù)據(jù)泵工具10G 以后版本都有,使用方法也很簡單,看一下就會(huì)。
前陣做了下數(shù)據(jù)庫遷移,從Sql Server2005遷移到Oracle
10g,這里說一下遷移的方法。
Sql
Server和Oracle區(qū)別比較大,包括語法,字段類型,數(shù)據(jù)庫機(jī)制,配置管理方法等等,區(qū)別是全方位的,做遷移需要注意很多問題,在遷移過程中也會(huì)遇到問題,需要細(xì)細(xì)處理之。這里說一下數(shù)據(jù)庫結(jié)構(gòu)的遷移,和遷移過程中注意的一些問題。(當(dāng)然具體的數(shù)據(jù)庫遷移過程中可能問題是不一樣的,具體問題具體分析了)
遷移的方法是從Sql Server已有數(shù)據(jù)庫中生成出Oracle的建庫腳本,然后在Oracle數(shù)據(jù)庫上執(zhí)行。用到的生成工具是Power
Designer。
1、打開PD(Power
Designer簡稱,以下均使用PD),新建一個(gè)PDM(物理數(shù)據(jù)模型),DBMS選擇Microsoft SQL
Server2005,Model name起名叫做mssdb。
2、通過逆向工程將現(xiàn)有Sql
Server數(shù)據(jù)庫生成PDM
(1)選擇Database-Reverse
Engineer Database,配置數(shù)據(jù)源,選擇要遷移的數(shù)據(jù)庫,輸入用戶名、密碼。
(2)選擇數(shù)據(jù)庫,選擇用戶dbo下的所有表、視圖、存儲(chǔ)過程、方法、觸發(fā)器、序列等(由于Sql Server與oracle,數(shù)據(jù)庫概念上的區(qū)別,這里不需選擇用戶、角色)。
點(diǎn)擊OK,生成PDM。已經(jīng)建立過PDM的情況,這一步可以省略。
3、生成Oracle物理數(shù)據(jù)模型
選擇Tools-Generate Physical Data Model
(1)DBMS選擇Oracle
10g,輸入名稱:oradb。
(2)在Configure Model
Options配置中, Model Settings的TableView界面中,勾選Ignore
identifying owner。Oracle中用戶的概念與Sql Server不同,這里忽略owner。
(3)Selection標(biāo)簽,選擇需要生成的所有表、視圖、外鍵、存儲(chǔ)過程、方法、觸發(fā)器、序列等。
點(diǎn)擊確定,即生成了oracle 的PDM。
注意,在生成PDM的過程中可能不會(huì)一帆風(fēng)順,有可能會(huì)報(bào)錯(cuò)(比如提示對象長度超限),這會(huì)導(dǎo)致生成失敗。這時(shí)需要根據(jù)具體錯(cuò)誤提示做相應(yīng)修改(可能需要多次調(diào)整,沒有辦法,誰讓兩者差別這么大的呢)。
4、生成Oracle腳本
與Sql
Server不同的是,在Oracle里表名、字段名全部為大寫,若要單獨(dú)處理為小寫,需加上雙引號(hào)。而PD生成的腳本默認(rèn)是有雙引號(hào)的,這里需要修改默認(rèn)配置,去掉雙引號(hào)。
然后選擇oradb,然后選擇Database-Generate
Database,進(jìn)入數(shù)據(jù)庫生成界面
在Format標(biāo)簽下,去掉勾選Owner prefix,它將省掉建表語句前“dbo.”所帶來的麻煩;
在Selection標(biāo)簽下,選擇要生成腳本的各對象;
在Preview標(biāo)簽下,可以預(yù)覽預(yù)生成的腳本(表較多時(shí),切換會(huì)比較慢)。
點(diǎn)擊確定,即得到生成的腳本。
5、檢查與調(diào)整
腳本是PD自動(dòng)生成的,因?yàn)楸肀容^多,在oracle上直接去執(zhí)行難免會(huì)有錯(cuò)誤。所以在執(zhí)行之前需要檢查下腳本的正確性。這里提幾點(diǎn)需要注意的地方。
(1)Oracle要求表名、字段名等長度最多是30位,而Sql Server沒有這個(gè)限制,所以可能會(huì)有在Sql
Server創(chuàng)建正常的表而在Oracle下會(huì)創(chuàng)建失敗。
(2)檢查一下主鍵、外鍵的名稱,它們有可能是隨機(jī)生成的名稱。可根據(jù)相應(yīng)規(guī)范進(jìn)行修改。
(3)檢查字段名是否用到了Oracle的關(guān)鍵字。比如Sql
Server命名“備注”字段可能會(huì)用“comment”、標(biāo)題用“title”,但comment、title在Oracle中是關(guān)鍵字,不可以做為字段名稱。
(4)存儲(chǔ)過程、方法是否符合Oracle語法。
(5)Sql
Server有自增字段,而Oracle沒有。要實(shí)現(xiàn)此功能,需要相應(yīng)創(chuàng)建序列、觸發(fā)器。
(6)Sql
Server中字段類型為text的情況,如果是存二進(jìn)制數(shù)據(jù)需要在Oracle中選用Blob字段類型。
(7)Sql
Server有外鍵的情況,主表記錄刪除,從表記錄也會(huì)跟著刪除;而Oracle默認(rèn)情況是當(dāng)從表有記錄時(shí),所對應(yīng)的主表記錄不允許刪除。所以這種情況下外鍵需要添加外鍵級聯(lián)刪除。
(8)生成的表、視圖等個(gè)數(shù)是否正確,缺失的情況可單獨(dú)生成腳本。
系統(tǒng)不一樣,出現(xiàn)問題的點(diǎn)可能也不一樣,具體問題具體分析。
6、建庫
在Oracle數(shù)據(jù)庫服務(wù)(當(dāng)然要先安裝好Oracle服務(wù)端、并建立數(shù)據(jù)庫)orcl實(shí)例下,使用用戶sys登陸并創(chuàng)建用戶orauser,并將resource、connect角色賦給orauser(這里,orauser使用默認(rèn)表空間、默認(rèn)臨時(shí)表空間)。
用剛創(chuàng)建的用戶orauser登陸orcl數(shù)據(jù)庫服務(wù),執(zhí)行前面已經(jīng)生成的腳本,若干分鐘后腳本執(zhí)行完畢,觀察一下執(zhí)行過程中有無錯(cuò)誤產(chǎn)生,也可以記錄執(zhí)行的日志以便日后查看;檢查看表、視圖等個(gè)數(shù)與Sql
Server數(shù)據(jù)庫中是否一致。如果都正確,那么,數(shù)據(jù)庫結(jié)構(gòu)從Sql
Server到Oracle的遷移到此結(jié)束。當(dāng)然,遷移的是否正確還需要在之后的使用中檢查,發(fā)現(xiàn)錯(cuò)誤及時(shí)修改即可。
OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用于解決異構(gòu)數(shù)據(jù)環(huán)境中數(shù)據(jù)復(fù)制的一個(gè)商業(yè)工具。相比于其它遷移工具OGG的優(yōu)勢在于可以直接解析源端Oracle的redo log,因此能夠?qū)崿F(xiàn)在不需要對原表結(jié)構(gòu)做太多調(diào)整的前提下完成數(shù)據(jù)增量部分的遷移。本篇文章將重點(diǎn)介紹如何使用OGG實(shí)現(xiàn)Oracle到MySQL數(shù)據(jù)的平滑遷移,以及講述個(gè)人在遷移過程中所碰到問題的解決方案。
(一)OGG邏輯架構(gòu)
參照上圖簡單給大家介紹下OGG邏輯架構(gòu),讓大家對OGG數(shù)據(jù)同步過程有個(gè)簡單了解,后面章節(jié)會(huì)詳細(xì)演示相關(guān)進(jìn)程的配置方式,在OGG使用過程中主要涉及以下進(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ù)庫源端,主要用于捕獲數(shù)據(jù)的變化,負(fù)責(zé)全量、增量數(shù)據(jù)的抽取
Trails文件:臨時(shí)存放在磁盤上的數(shù)據(jù)文件
Data Pump進(jìn)程:運(yùn)行在數(shù)據(jù)庫源端,屬于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文件,然后通過Data Pump進(jìn)程發(fā)送到目標(biāo)端,配置Data Pump進(jìn)程的主要好處是即使源端到目標(biāo)端發(fā)生網(wǎng)絡(luò)中斷,Extract進(jìn)程依然不會(huì)終止
Collector進(jìn)程:接收源端傳輸過來的數(shù)據(jù)變化,并寫入本地Trail文件中
Replicat進(jìn)程:讀取Trail文件中記錄的數(shù)據(jù)變化,創(chuàng)建對應(yīng)的DML語句并在目標(biāo)端回放
二、遷移方案
(一)環(huán)境信息
OGG版本 ? ?OGG 12.2.0.2.2 For Oracle ? ?OGG 12.2.0.2.2 For MySQL? ??
數(shù)據(jù)庫版本 ? ?Oracle 11.2.0.4 ? ?MySQL 5.7.21 ?
OGG_HOME ? ?/home/oracle/ogg ? ?/opt/ogg ?
(二)表結(jié)構(gòu)遷移
表結(jié)構(gòu)遷移屬于難度不高但內(nèi)容比較繁瑣的一步,我們在遷移表結(jié)構(gòu)時(shí)使用了一個(gè)叫sqlines的開源工具,對于sqlines工具在MySQL端創(chuàng)建失敗及不符合預(yù)期的表結(jié)構(gòu)再進(jìn)行特殊處理,以此來提高表結(jié)構(gòu)轉(zhuǎn)換的效率。
注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結(jié)構(gòu)遷移完成后到數(shù)據(jù)庫切換前盡量不要再修改表結(jié)構(gòu)。
(三)數(shù)據(jù)遷移
數(shù)據(jù)同步的操作均采用OGG工具進(jìn)行,考慮數(shù)據(jù)全量和增量的銜接,OGG需要先將增量同步的抽取進(jìn)程啟動(dòng),抓取數(shù)據(jù)庫的redo log,待全量抽取結(jié)束后開啟增量數(shù)據(jù)回放,應(yīng)用全量和增量這段期間產(chǎn)生的日志數(shù)據(jù),OGG可基于參數(shù)配置進(jìn)行重復(fù)數(shù)據(jù)處理,所以使用OGG時(shí)優(yōu)先將增量進(jìn)行配置并啟用。此外,為了避免本章節(jié)篇幅過長,OGG參數(shù)將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢?nèi)魏文悴焕斫獾膮?shù)。
1.源端OGG配置
(1)Oracle數(shù)據(jù)庫配置
針對Oracle數(shù)據(jù)庫,OGG需要數(shù)據(jù)庫開啟歸檔模式及增加輔助補(bǔ)充日志、強(qiáng)制記錄日志等來保障OGG可抓取到完整的日志信息
查看當(dāng)前環(huán)境是否滿足要求,輸出結(jié)果如下圖所示:
(2)Oracle數(shù)據(jù)庫OGG用戶創(chuàng)建
OGG需要有一個(gè)用戶有權(quán)限對數(shù)據(jù)庫的相關(guān)對象做操作,以下為涉及的權(quán)限,該示例將創(chuàng)建一個(gè)用戶名和密碼均為ogg的Oracle數(shù)據(jù)庫用戶并授予以下權(quán)限
(3)源端OGG 管理進(jìn)程(MGR)配置
(4)源端OGG 表級補(bǔ)全日志(trandata)配置
表級補(bǔ)全日志需要在最小補(bǔ)全日志打開的情況下才起作用,之前只在數(shù)據(jù)庫級開啟了最小補(bǔ)全日志(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補(bǔ)全日志以獲得必要的信息。
(5)源端OGG 抽取進(jìn)程(extract)配置
Extract進(jìn)程運(yùn)行在數(shù)據(jù)庫源端,負(fù)責(zé)從源端數(shù)據(jù)表或日志中捕獲數(shù)據(jù)。Extract進(jìn)程利用其內(nèi)在的checkpoint機(jī)制,周期性地檢查并記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機(jī)制是為了保證如果Extract進(jìn)程終止或者操作系統(tǒng)宕機(jī),我們重啟Extract進(jìn)程后,GoldenGate能夠恢復(fù)到以前的狀態(tài),從上一個(gè)斷點(diǎn)處繼續(xù)往下運(yùn)行,而不會(huì)有任何數(shù)據(jù)損失。
(6)源端OGG 傳輸進(jìn)程(pump)配置
pump進(jìn)程運(yùn)行在數(shù)據(jù)庫源端,其作用非常簡單。如果源端的Extract抽取進(jìn)程使用了本地trail文件,那么pump進(jìn)程就會(huì)把trail文件以數(shù)據(jù)塊的形式通過TCP/IP協(xié)議發(fā)送到目標(biāo)端,Pump進(jìn)程本質(zhì)上是Extract進(jìn)程的一種特殊形式,如果不使用trail文件,那么Extract進(jìn)程在抽取完數(shù)據(jù)后,直接投遞到目標(biāo)端。
補(bǔ)充:pump進(jìn)程啟動(dòng)時(shí)需要與目標(biāo)端的mgr進(jìn)程進(jìn)行連接,所以需要優(yōu)先將目標(biāo)端的mgr提前配置好,否則會(huì)報(bào)錯(cuò)連接被拒絕,無法傳輸抽取的日志文件到目標(biāo)端對應(yīng)目錄下
(7)源端OGG 異構(gòu)mapping文件(defgen)生成
該文件記錄了源庫需要復(fù)制的表的表結(jié)構(gòu)定義信息,在源庫生成該文件后需要拷貝到目標(biāo)庫的dirdef目錄,當(dāng)目標(biāo)庫的replica進(jìn)程將傳輸過來的數(shù)據(jù)apply到目標(biāo)庫時(shí)需要讀寫該文件,同構(gòu)的數(shù)據(jù)庫不需要進(jìn)行該操作。
2.目標(biāo)端OGG配置
(1)目標(biāo)端MySQL數(shù)據(jù)庫配置
確認(rèn)MySQL端表結(jié)構(gòu)已經(jīng)存在
MySQL數(shù)據(jù)庫OGG用戶創(chuàng)建
mysql create user 'ogg'@'%' identified by 'ogg';
mysql grant all on *.* to 'ogg'@'%';
#### 提前創(chuàng)建好ogg存放checkpoint表的數(shù)據(jù)庫
mysql create database ogg;
(2)目標(biāo)端OGG 管理進(jìn)程(MGR)配置
目標(biāo)端的MGR進(jìn)程和源端配置一樣,可直接將源端配置方式在目標(biāo)端重復(fù)執(zhí)行一次即可,該部分不在贅述
(3)目標(biāo)端OGG 檢查點(diǎn)日志表(checkpoint)配置
checkpoint表用來保障一個(gè)事務(wù)執(zhí)行完成后,在MySQL數(shù)據(jù)庫從有一張表記錄當(dāng)前的日志回放點(diǎn),與MySQL復(fù)制記錄binlog的GTID或position點(diǎn)類似。
#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進(jìn)入命令行終端
shell cd $OGG_HOME
shell ggsci
ggsci edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci dblogin sourcedb ogg@17X.1X.84.121:3306 userid ogg
ggsci add checkpointtable ogg.ggs_checkpoint
(4)目標(biāo)端OGG 回放線程(replicat)配置
Replicat進(jìn)程運(yùn)行在目標(biāo)端,是數(shù)據(jù)投遞的最后一站,負(fù)責(zé)讀取目標(biāo)端Trail文件中的內(nèi)容,并將解析其解析為DML語句,然后應(yīng)用到目標(biāo)數(shù)據(jù)庫中。
#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進(jìn)入命令行終端
shell cd $OGG_HOME
shell ggsci
#### 添加一個(gè)回放線程并與源端pump進(jìn)程傳輸過來的trail文件關(guān)聯(lián),并使用checkpoint表確保數(shù)據(jù)不丟失
ggsci add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
#### 增加/編輯回放進(jìn)程配置文件
ggsci edit params r_cms
replicat r_cms
targetdb cms@17X.1X.84.121:3306,userid ogg,password ogg
sourcedefs /opt/ogg/dirdef/cms.def
discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024
HANDLECOLLISIONS
MAP cms.*,target cms.*;
注意:replicat進(jìn)程只需配置完成,無需啟動(dòng),待全量抽取完成后再啟動(dòng)。
至此源端環(huán)境配置完成
待全量數(shù)據(jù)抽取完畢后啟動(dòng)目標(biāo)端回放進(jìn)程即可完成數(shù)據(jù)準(zhǔn)實(shí)時(shí)同步。
3.全量同步配置
全量數(shù)據(jù)同步為一次性操作,當(dāng)OGG軟件部署完成及增量抽取進(jìn)程配置并啟動(dòng)后,可配置1個(gè)特殊的extract進(jìn)程從表中抽取數(shù)據(jù),將抽取的數(shù)據(jù)保存到目標(biāo)端生成文件,目標(biāo)端同時(shí)啟動(dòng)一個(gè)單次運(yùn)行的replicat回放進(jìn)程將數(shù)據(jù)解析并回放至目標(biāo)數(shù)據(jù)庫中。
(1)源端OGG 全量抽取進(jìn)程(extract)配置
#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進(jìn)入命令行終端
shell cd $OGG_HOME
shell ggsci
#### 增加/編輯全量抽取進(jìn)程配置文件
#### 其中RMTFILE指定抽取的數(shù)據(jù)直接傳送到遠(yuǎn)端對應(yīng)目錄下
#### 注意:RMTFILE參數(shù)指定的文件只支持2位字符,如果超過replicat則無法識(shí)別
ggsci edit params ei_cms
SOURCEISTABLE
SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
SETENV (ORACLE_SID=cms)
SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)
USERID ogg@appdb,PASSWORD ogg
RMTHOST 17X.1X.84.121,MGRPORT 7809
RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge
TABLE cms.*;
#### 啟動(dòng)并查看抽取進(jìn)程正常
shell nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt
## 查看日志是否正常進(jìn)行全量抽取
shell tail -f ./dirrpt/ei_cms.rpt
(2)目標(biāo)端OGG 全量回放進(jìn)程(replicat)配置
#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進(jìn)入命令行終端
shell cd $OGG_HOME
shell ggsci
ggsci edit params ri_cms
SPECIALRUN
END RUNTIME
TARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD ogg
EXTFILE /opt/ogg/dirdat/ms
DISCARDFILE ./dirrpt/ri_cms.dsc,purge
MAP cms.*,TARGET cms.*;
#### 啟動(dòng)并查看回放進(jìn)程正常
shell nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt
#### 查看日志是否正常進(jìn)行全量回放
shell tail -f ./dirrpt/ri_cms.rpt
三、數(shù)據(jù)校驗(yàn)
數(shù)據(jù)校驗(yàn)是數(shù)據(jù)遷移過程中必不可少的環(huán)節(jié),本章節(jié)提供給幾個(gè)數(shù)據(jù)校驗(yàn)的思路共大家參數(shù),校驗(yàn)方式可以由以下幾個(gè)角度去實(shí)現(xiàn):
1.通過OGG日志查看全量、增量過程中discards記錄是否為0來判斷是否丟失數(shù)據(jù);
2.通過對源端、目標(biāo)端的表執(zhí)行count判斷數(shù)據(jù)量是否一致;
3.編寫類似于pt-table-checksum校驗(yàn)原理的程序,實(shí)現(xiàn)行級別一致性校驗(yàn),這種方式優(yōu)缺點(diǎn)特別明顯,優(yōu)點(diǎn)是能夠完全準(zhǔn)確對數(shù)據(jù)內(nèi)容進(jìn)行校驗(yàn),缺點(diǎn)是需要遍歷每一行數(shù)據(jù),校驗(yàn)成本較高;
4.相對折中的數(shù)據(jù)校驗(yàn)方式是通過業(yè)務(wù)角度,提前編寫好數(shù)十個(gè)返回結(jié)果較快的SQL,從業(yè)務(wù)角度抽樣校驗(yàn)。
四、遷移問題處理
本章節(jié)將講述遷移過程中碰到的一些問題及相應(yīng)的解決方式。
(一)MySQL限制
在Oracle到MySQL的表結(jié)構(gòu)遷移過程中主要碰到以下兩個(gè)限制:
1. Oracle端的表結(jié)構(gòu)因?yàn)樽畛踉O(shè)計(jì)不嚴(yán)謹(jǐn),存在大量的列使用varchar(4000)數(shù)據(jù)類型,導(dǎo)致遷移到MySQL后超出行限制,表結(jié)構(gòu)無法創(chuàng)建。由于MySQL本身數(shù)據(jù)結(jié)構(gòu)的限制,一個(gè)16K的數(shù)據(jù)頁最少要存儲(chǔ)兩行數(shù)據(jù),因此單行數(shù)據(jù)不能超過65,535 bytes,因此針對這種情況有兩種解決方式:
根據(jù)實(shí)際存儲(chǔ)數(shù)據(jù)的長度,對超長的varchar列進(jìn)行收縮;
對于無法收縮的列轉(zhuǎn)換數(shù)據(jù)類型為text,但這在使用過程中可能導(dǎo)致一些性能問題;
2. 與第一點(diǎn)類似,在Innodb存儲(chǔ)引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個(gè)限制是3072 bytes,即使用utf8mb4字符集時(shí),最多只能對varchar(768)的列創(chuàng)建索引;
3. 使用ogg全量初始化同步時(shí),若存在外鍵約束,批量導(dǎo)入時(shí)由于各表的插入順序不唯一,可能子表先插入數(shù)據(jù)而主表還未插入,導(dǎo)致報(bào)錯(cuò)子表依賴的記錄不存在,因此建議數(shù)據(jù)遷移階段禁用主外鍵約束,待遷移結(jié)束后再打開。
mysqlset global foreign_key_checks=off;
(二)全量與增量銜接
HANDLECOLLISIONS參數(shù)是實(shí)現(xiàn)OGG全量數(shù)據(jù)與增量數(shù)據(jù)銜接的關(guān)鍵,其實(shí)現(xiàn)原理是在全量抽取前先開啟增量抽取進(jìn)程,抓去全量應(yīng)用期間產(chǎn)生的redo log,當(dāng)全量應(yīng)用完成后,開啟增量回放進(jìn)程,應(yīng)用全量期間的增量數(shù)據(jù)。使用該參數(shù)后增量回放DML語句時(shí)主要有以下場景及處理邏輯:
目標(biāo)端不存在delete語句的記錄,忽略該問題并不記錄到discardfile
目標(biāo)端丟失update記錄
- 更新的是主鍵值,update轉(zhuǎn)換成insert
- 更新的鍵值是非主鍵,忽略該問題并不記錄到discardfile
目標(biāo)端重復(fù)insert已存在的主鍵值,這將被replicat進(jìn)程轉(zhuǎn)換為UPDATE現(xiàn)有主鍵值的行
(三)OGG版本選擇
在OGG版本選擇上我們也根據(jù)用戶的場景多次更換了OGG版本,最初因?yàn)榭蛻舻腛racle 數(shù)據(jù)庫版本為11.2.0.4,因此我們在選擇OGG版本時(shí)優(yōu)先選擇使用了11版本,但是使用過程中發(fā)現(xiàn),每次數(shù)據(jù)抽取生成的trail文件達(dá)到2G左右時(shí),OGG報(bào)錯(cuò)連接中斷,查看RMTFILE參數(shù)詳細(xì)說明了解到trail文件默認(rèn)限制為2G,后來我們替換OGG版本為12.3,使用MAXFILES參數(shù)控制生成多個(gè)指定大小的trail文件,回放時(shí)Replicat進(jìn)程也能自動(dòng)輪轉(zhuǎn)讀取Trail文件,最終解決該問題。但是如果不幸Oracle環(huán)境使用了Linux 5版本的系統(tǒng),那么你的OGG需要再降一個(gè)小版本,最高只能使用OGG 12.2。
(四)無主鍵表處理
在遷移過程中還碰到一個(gè)比較難搞的問題就是當(dāng)前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因?yàn)楹苋菀讓?dǎo)致性能問題和主從延遲。同時(shí)在OGG遷移過程中表沒有主鍵也會(huì)產(chǎn)生一些隱患,比如對于沒有主鍵的表,OGG默認(rèn)是將這個(gè)一行數(shù)據(jù)中所有的列拼湊起來作為唯一鍵,但實(shí)際還是可能存在重復(fù)數(shù)據(jù)導(dǎo)致數(shù)據(jù)同步異常,Oracle官方對此也提供了一個(gè)解決方案,通過對無主鍵表添加GUID列來作為行唯一標(biāo)示,具體操作方式可以搜索MOS文檔ID 1271578.1進(jìn)行查看。
(五)OGG安全規(guī)則
報(bào)錯(cuò)信息
2019-03-08 06:15:22 ?ERROR ? OGG-01201 ?Error reported by MGR : Access denied.
錯(cuò)誤信息含義源端報(bào)錯(cuò)表示為該抽取進(jìn)程需要和目標(biāo)端的mgr進(jìn)程通訊,但是被拒絕,具體操作為:源端的extract進(jìn)程需要與目標(biāo)端mgr進(jìn)行溝通,遠(yuǎn)程將目標(biāo)的replicat進(jìn)行啟動(dòng),由于安全性現(xiàn)在而被拒絕連接。
報(bào)錯(cuò)原因
在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要遠(yuǎn)程啟動(dòng)目標(biāo)端的replicat進(jìn)程,需要在mgr節(jié)點(diǎn)增加訪問控制參數(shù)允許遠(yuǎn)程調(diào)用
解決辦法
在源端和目標(biāo)端的mgr節(jié)點(diǎn)上分別增加訪問控制規(guī)則并重啟
## 表示該mgr節(jié)點(diǎn)允許(ALLOW)10.186網(wǎng)段(IPADDR)的所有類型程序(PROG *)進(jìn)行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW
(六)數(shù)據(jù)抽取方式
報(bào)錯(cuò)信息
2019-03-15 14:49:04 ?ERROR ? OGG-01192 ?Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').
報(bào)錯(cuò)原因
根據(jù)官方文檔說明,當(dāng)前直接通過Oracle數(shù)據(jù)庫抽取數(shù)據(jù)寫到MySQL這種initial-load方式,不支持LOBs數(shù)據(jù)類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB字段,無法進(jìn)行傳輸,并且該方式不支持超過4k的字段數(shù)據(jù)類型
解決方法
將抽取進(jìn)程中的RMTTASK改為RMTFILE參數(shù) 官方建議將數(shù)據(jù)先抽取成文件,再基于文件數(shù)據(jù)解析進(jìn)行初始化導(dǎo)入
把老數(shù)據(jù)庫的數(shù)據(jù)用數(shù)據(jù)導(dǎo)出工具(exp.exe)導(dǎo)出為一個(gè)dump文件,把這個(gè)dump拷貝到新數(shù)據(jù)庫上,用導(dǎo)入工具(imp.exe)把這個(gè)dump文件導(dǎo)入到新數(shù)據(jù)庫中就可以了。