91嫩草国产线免费观看_欧美日韩中文字幕在线观看_精品精品国产高清a毛片_六月婷婷网 - 一级一级特黄女人精品毛片

MYSQL 轉(zhuǎn) ORACLE CLOB類型

首頁 > 身份戶籍2022-04-20 13:49:45

mysql語句改成oracle的

DROP TABLE IF EXISTS `user`;rnCREATE TABLE `user` (rn `id` int(10) unsigned NOT NULL auto_increment,rn `uid` varchar(20) NOT NULL default x27x27,rn `password` varchar(30) NOT NULL default x27x27,rn `realName` varchar(20) NOT NULL default x27x27,rn `gender` tinyint(1) unsigned NOT NULL default x270x27,rn `email` varchar(50) NOT NULL default x27x27,rn `tel` varchar(15) default NULL,rn `question` varchar(50) default NULL,rn `validateCode` varchar(20) NOT NULL default x27x27,rn `answer` varchar(50) NOT NULL default x27x27,rn `loginNum` int(10) unsigned NOT NULL default x270x27,rn PRIMARY KEY (`id`),rn UNIQUE KEY `Index_uid` USING BTREE (`uid`)rn) ENGINE=InnoDB DEFAULT CHARSET=gbk;rn 要求能運行,一些條件盡量不要少,謝謝
--先運行
DECLARE
v_sql VARCHAR2(100);
v_num NUMBER;

BEGIN
SELECT ROWNUM INTO v_num FROM USER_OBJECTS
WHERE object_name = 'TEST_USERS'
AND object_type = 'TABLE'
;
IF v_num > 0 THEN
v_sql:='DROP TABLE TEST_USERS';
EXECUTE IMMEDIATE v_sql ;
END IF;

END;

--第二次運行
CREATE TABLE TEST_USERS
(
ID NUMBER not null,
U_ID VARCHAR2(20) default '' not null,
PASSWORD VARCHAR2(30) default '' not null,
REALNAME VARCHAR2(20) default '' not null,
GENDER NUMBER default 0 not null,
EMAIL VARCHAR2(50) default '' not null,
TEL VARCHAR2(15),
QUESTION VARCHAR2(50) not null,
VALIDATECODE VARCHAR2(20) default '',
ANSWER VARCHAR2(50) default '',
LOGINNUM NUMBER default 0,
USERID VARCHAR2(32) not null,
USERNAME VARCHAR2(50),
TRUENAME VARCHAR2(50)
)

--最后運行
alter table TEST_USERS
add constraint primary_key_a primary key (ID);
alter table TEST_USERS
add constraint unique_key_b unique (U_ID);

有問題再聯(lián)系
有很多應(yīng)用項目, 剛起步的時候用MYSQL數(shù)據(jù)庫基本上能實現(xiàn)各種功能需求,隨著應(yīng)用用戶的增多,數(shù)據(jù)量的增加,MYSQL漸漸地出現(xiàn)不堪重負(fù)的情況:連接很慢甚至宕機, 于是就有把數(shù)據(jù)從MYSQL遷到ORACLE的需求,應(yīng)用程序也要相應(yīng)做一些修改。本人總結(jié)出以下幾點注意事項,希望對大家有所幫助。

1.自動增長的數(shù)據(jù)類型處理
MYSQL有自動增長的數(shù)據(jù)類型,插入記錄時不用操作此字段,會自動獲得數(shù)據(jù)值。ORACLE沒有自動增長的數(shù)據(jù)類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。

CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標(biāo)記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 NUMBER(6) , 最大值為999999
INSERT 語句插入這個字段值為: 序列號的名稱.NEXTVAL

2. 單引號的處理
MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現(xiàn)的一個單引號替換成兩個單引號。

3. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數(shù);PHP里還可以用SEEK定位到結(jié)果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結(jié)果集只有一個ROWNUM字段標(biāo)明它的位 置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
以下是經(jīng)過分析后較好的兩種ORACLE翻頁SQL語句( ID是唯一關(guān)鍵字的字段名 ):
語句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;

語句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;

4. 長字符串的處理

長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小于等于4000個單字節(jié), 如果要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的字段值和超出長 度字段值都應(yīng)該提出警告,返回上次操作。

5. 日期字段的處理

MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當(dāng)前數(shù)據(jù)庫的系統(tǒng)時間為SYSDATE, 精確到秒,或者用字符串轉(zhuǎn)換成日期型函數(shù)TO_DATE(‘2001-08-01','YYYY-MM-DD')年-月-日 24小時:分鐘:秒 的格式Y(jié)YYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型字段轉(zhuǎn)換成字符串函數(shù)TO_CHAR(‘2001-08-01','YYYY-MM-DD HH24:MI:SS')

日期字段的數(shù)學(xué)運算公式有很大的不同。MYSQL找到離當(dāng)前時間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當(dāng)前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;

MYSQL中插入當(dāng)前時間的幾個函數(shù)是:NOW()函數(shù)以`'YYYY-MM-DD HH:MM:SS'返回當(dāng)前的日期時間,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以 直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回當(dāng)前的時間,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())

而oracle中當(dāng)前時間是sysdate

6. 空字符的處理

MYSQL的非空字段也有空的內(nèi)容,ORACLE里定義了非空字段就不容許有空的內(nèi)容。按MYSQL的NOT NULL來定義ORACLE表結(jié)構(gòu), 導(dǎo)數(shù)據(jù)的時候會產(chǎn)生錯誤。因此導(dǎo)數(shù)據(jù)時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。

7. 字符串的模糊比較

MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快,用字符串比較函數(shù) instr(字段名,'字符串')>0 會得到更精確的查找結(jié)果。

8. 程序和函數(shù)里,操作數(shù)據(jù)庫的工作完成后請注意結(jié)果集和指針的釋放。
把字段和表名的``去掉就行了

oracle的blob數(shù)據(jù)怎么遷移到mysql

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用于解決異構(gòu)數(shù)據(jù)環(huán)境中數(shù)據(jù)復(fù)制的一個商業(yè)工具。相比于其它遷移工具OGG的優(yōu)勢在于可以直接解析源端Oracle的redo log,因此能夠?qū)崿F(xiàn)在不需要對原表結(jié)構(gòu)做太多調(diào)整的前提下完成數(shù)據(jù)增量部分的遷移。本篇文章將重點介紹如何使用OGG實現(xiàn)Oracle到MySQL數(shù)據(jù)的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。


(一)OGG邏輯架構(gòu)

參照上圖簡單給大家介紹下OGG邏輯架構(gòu),讓大家對OGG數(shù)據(jù)同步過程有個簡單了解,后面章節(jié)會詳細(xì)演示相關(guān)進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

Manager進程:需要源端跟目標(biāo)端同時運行,主要作用是監(jiān)控管理其它進程,報告錯誤,分配及清理數(shù)據(jù)存儲空間,發(fā)布閾值報告等

Extract進程:運行在數(shù)據(jù)庫源端,主要用于捕獲數(shù)據(jù)的變化,負(fù)責(zé)全量、增量數(shù)據(jù)的抽取

Trails文件:臨時存放在磁盤上的數(shù)據(jù)文件

Data Pump進程:運行在數(shù)據(jù)庫源端,屬于Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數(shù)據(jù)直接發(fā)送到目標(biāo)端的Trail文件,如果配置了Data Pump,Extract進程會將數(shù)據(jù)抽取到本地Trail文件,然后通過Data Pump進程發(fā)送到目標(biāo)端,配置Data Pump進程的主要好處是即使源端到目標(biāo)端發(fā)生網(wǎng)絡(luò)中斷,Extract進程依然不會終止

Collector進程:接收源端傳輸過來的數(shù)據(jù)變化,并寫入本地Trail文件中

Replicat進程:讀取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)時使用了一個叫sqlines的開源工具,對于sqlines工具在MySQL端創(chuàng)建失敗及不符合預(yù)期的表結(jié)構(gòu)再進行特殊處理,以此來提高表結(jié)構(gòu)轉(zhuǎn)換的效率。

注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結(jié)構(gòu)遷移完成后到數(shù)據(jù)庫切換前盡量不要再修改表結(jié)構(gòu)。

(三)數(shù)據(jù)遷移

數(shù)據(jù)同步的操作均采用OGG工具進行,考慮數(shù)據(jù)全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取數(shù)據(jù)庫的redo log,待全量抽取結(jié)束后開啟增量數(shù)據(jù)回放,應(yīng)用全量和增量這段期間產(chǎn)生的日志數(shù)據(jù),OGG可基于參數(shù)配置進行重復(fù)數(shù)據(jù)處理,所以使用OGG時優(yōu)先將增量進行配置并啟用。此外,為了避免本章節(jié)篇幅過長,OGG參數(shù)將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢?nèi)魏文悴焕斫獾膮?shù)。

1.源端OGG配置

(1)Oracle數(shù)據(jù)庫配置

針對Oracle數(shù)據(jù)庫,OGG需要數(shù)據(jù)庫開啟歸檔模式及增加輔助補充日志、強制記錄日志等來保障OGG可抓取到完整的日志信息

查看當(dāng)前環(huán)境是否滿足要求,輸出結(jié)果如下圖所示:

(2)Oracle數(shù)據(jù)庫OGG用戶創(chuàng)建

OGG需要有一個用戶有權(quán)限對數(shù)據(jù)庫的相關(guān)對象做操作,以下為涉及的權(quán)限,該示例將創(chuàng)建一個用戶名和密碼均為ogg的Oracle數(shù)據(jù)庫用戶并授予以下權(quán)限

(3)源端OGG 管理進程(MGR)配置

(4)源端OGG 表級補全日志(trandata)配置

表級補全日志需要在最小補全日志打開的情況下才起作用,之前只在數(shù)據(jù)庫級開啟了最小補全日志(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日志以獲得必要的信息。

(5)源端OGG 抽取進程(extract)配置

Extract進程運行在數(shù)據(jù)庫源端,負(fù)責(zé)從源端數(shù)據(jù)表或日志中捕獲數(shù)據(jù)。Extract進程利用其內(nèi)在的checkpoint機制,周期性地檢查并記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統(tǒng)宕機,我們重啟Extract進程后,GoldenGate能夠恢復(fù)到以前的狀態(tài),從上一個斷點處繼續(xù)往下運行,而不會有任何數(shù)據(jù)損失。

(6)源端OGG 傳輸進程(pump)配置

pump進程運行在數(shù)據(jù)庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那么pump進程就會把trail文件以數(shù)據(jù)塊的形式通過TCP/IP協(xié)議發(fā)送到目標(biāo)端,Pump進程本質(zhì)上是Extract進程的一種特殊形式,如果不使用trail文件,那么Extract進程在抽取完數(shù)據(jù)后,直接投遞到目標(biāo)端。

補充:pump進程啟動時需要與目標(biāo)端的mgr進程進行連接,所以需要優(yōu)先將目標(biāo)端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日志文件到目標(biāo)端對應(yīng)目錄下

(7)源端OGG 異構(gòu)mapping文件(defgen)生成

該文件記錄了源庫需要復(fù)制的表的表結(jié)構(gòu)定義信息,在源庫生成該文件后需要拷貝到目標(biāo)庫的dirdef目錄,當(dāng)目標(biāo)庫的replica進程將傳輸過來的數(shù)據(jù)apply到目標(biāo)庫時需要讀寫該文件,同構(gòu)的數(shù)據(jù)庫不需要進行該操作。

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 管理進程(MGR)配置

目標(biāo)端的MGR進程和源端配置一樣,可直接將源端配置方式在目標(biāo)端重復(fù)執(zhí)行一次即可,該部分不在贅述

(3)目標(biāo)端OGG 檢查點日志表(checkpoint)配置

checkpoint表用來保障一個事務(wù)執(zhí)行完成后,在MySQL數(shù)據(jù)庫從有一張表記錄當(dāng)前的日志回放點,與MySQL復(fù)制記錄binlog的GTID或position點類似。

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit param ./GLOBALS

checkpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb [email protected]:3306 userid ogg

ggsci> add checkpointtable ogg.ggs_checkpoint

(4)目標(biāo)端OGG 回放線程(replicat)配置

Replicat進程運行在目標(biāo)端,是數(shù)據(jù)投遞的最后一站,負(fù)責(zé)讀取目標(biāo)端Trail文件中的內(nèi)容,并將解析其解析為DML語句,然后應(yīng)用到目標(biāo)數(shù)據(jù)庫中。

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 添加一個回放線程并與源端pump進程傳輸過來的trail文件關(guān)聯(lián),并使用checkpoint表確保數(shù)據(jù)不丟失

ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

#### 增加/編輯回放進程配置文件

ggsci> edit params r_cms

replicat r_cms

targetdb [email protected]: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進程只需配置完成,無需啟動,待全量抽取完成后再啟動。

至此源端環(huán)境配置完成 

待全量數(shù)據(jù)抽取完畢后啟動目標(biāo)端回放進程即可完成數(shù)據(jù)準(zhǔn)實時同步。

3.全量同步配置

全量數(shù)據(jù)同步為一次性操作,當(dāng)OGG軟件部署完成及增量抽取進程配置并啟動后,可配置1個特殊的extract進程從表中抽取數(shù)據(jù),將抽取的數(shù)據(jù)保存到目標(biāo)端生成文件,目標(biāo)端同時啟動一個單次運行的replicat回放進程將數(shù)據(jù)解析并回放至目標(biāo)數(shù)據(jù)庫中。

(1)源端OGG 全量抽取進程(extract)配置

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 增加/編輯全量抽取進程配置文件

#### 其中RMTFILE指定抽取的數(shù)據(jù)直接傳送到遠(yuǎn)端對應(yīng)目錄下

#### 注意:RMTFILE參數(shù)指定的文件只支持2位字符,如果超過replicat則無法識別

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 [email protected],PASSWORD ogg

RMTHOST 17X.1X.84.121,MGRPORT 7809

RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

TABLE cms.*;

#### 啟動并查看抽取進程正常

shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

## 查看日志是否正常進行全量抽取

shell> tail -f ./dirrpt/ei_cms.rpt

(2)目標(biāo)端OGG 全量回放進程(replicat)配置

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit params ri_cms

SPECIALRUN

END RUNTIME

TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg

EXTFILE /opt/ogg/dirdat/ms

DISCARDFILE ./dirrpt/ri_cms.dsc,purge

MAP cms.*,TARGET cms.*;

#### 啟動并查看回放進程正常

shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

#### 查看日志是否正常進行全量回放

shell> tail -f ./dirrpt/ri_cms.rpt

三、數(shù)據(jù)校驗

數(shù)據(jù)校驗是數(shù)據(jù)遷移過程中必不可少的環(huán)節(jié),本章節(jié)提供給幾個數(shù)據(jù)校驗的思路共大家參數(shù),校驗方式可以由以下幾個角度去實現(xiàn):

1.通過OGG日志查看全量、增量過程中discards記錄是否為0來判斷是否丟失數(shù)據(jù);

2.通過對源端、目標(biāo)端的表執(zhí)行count判斷數(shù)據(jù)量是否一致;

3.編寫類似于pt-table-checksum校驗原理的程序,實現(xiàn)行級別一致性校驗,這種方式優(yōu)缺點特別明顯,優(yōu)點是能夠完全準(zhǔn)確對數(shù)據(jù)內(nèi)容進行校驗,缺點是需要遍歷每一行數(shù)據(jù),校驗成本較高;

4.相對折中的數(shù)據(jù)校驗方式是通過業(yè)務(wù)角度,提前編寫好數(shù)十個返回結(jié)果較快的SQL,從業(yè)務(wù)角度抽樣校驗。

四、遷移問題處理

本章節(jié)將講述遷移過程中碰到的一些問題及相應(yīng)的解決方式。

(一)MySQL限制

在Oracle到MySQL的表結(jié)構(gòu)遷移過程中主要碰到以下兩個限制:

1. Oracle端的表結(jié)構(gòu)因為最初設(shè)計不嚴(yán)謹(jǐn),存在大量的列使用varchar(4000)數(shù)據(jù)類型,導(dǎo)致遷移到MySQL后超出行限制,表結(jié)構(gòu)無法創(chuàng)建。由于MySQL本身數(shù)據(jù)結(jié)構(gòu)的限制,一個16K的數(shù)據(jù)頁最少要存儲兩行數(shù)據(jù),因此單行數(shù)據(jù)不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

根據(jù)實際存儲數(shù)據(jù)的長度,對超長的varchar列進行收縮;

對于無法收縮的列轉(zhuǎn)換數(shù)據(jù)類型為text,但這在使用過程中可能導(dǎo)致一些性能問題;

2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字符集時,最多只能對varchar(768)的列創(chuàng)建索引;

3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導(dǎo)入時由于各表的插入順序不唯一,可能子表先插入數(shù)據(jù)而主表還未插入,導(dǎo)致報錯子表依賴的記錄不存在,因此建議數(shù)據(jù)遷移階段禁用主外鍵約束,待遷移結(jié)束后再打開。

mysql>set global foreign_key_checks=off;


(二)全量與增量銜接

HANDLECOLLISIONS參數(shù)是實現(xiàn)OGG全量數(shù)據(jù)與增量數(shù)據(jù)銜接的關(guān)鍵,其實現(xiàn)原理是在全量抽取前先開啟增量抽取進程,抓去全量應(yīng)用期間產(chǎn)生的redo log,當(dāng)全量應(yīng)用完成后,開啟增量回放進程,應(yīng)用全量期間的增量數(shù)據(jù)。使用該參數(shù)后增量回放DML語句時主要有以下場景及處理邏輯:

目標(biāo)端不存在delete語句的記錄,忽略該問題并不記錄到discardfile

目標(biāo)端丟失update記錄

- 更新的是主鍵值,update轉(zhuǎn)換成insert

- 更新的鍵值是非主鍵,忽略該問題并不記錄到discardfile

目標(biāo)端重復(fù)insert已存在的主鍵值,這將被replicat進程轉(zhuǎn)換為UPDATE現(xiàn)有主鍵值的行

(三)OGG版本選擇

在OGG版本選擇上我們也根據(jù)用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 數(shù)據(jù)庫版本為11.2.0.4,因此我們在選擇OGG版本時優(yōu)先選擇使用了11版本,但是使用過程中發(fā)現(xiàn),每次數(shù)據(jù)抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數(shù)詳細(xì)說明了解到trail文件默認(rèn)限制為2G,后來我們替換OGG版本為12.3,使用MAXFILES參數(shù)控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉(zhuǎn)讀取Trail文件,最終解決該問題。但是如果不幸Oracle環(huán)境使用了Linux 5版本的系統(tǒng),那么你的OGG需要再降一個小版本,最高只能使用OGG 12.2。

(四)無主鍵表處理

在遷移過程中還碰到一個比較難搞的問題就是當(dāng)前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導(dǎo)致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產(chǎn)生一些隱患,比如對于沒有主鍵的表,OGG默認(rèn)是將這個一行數(shù)據(jù)中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復(fù)數(shù)據(jù)導(dǎo)致數(shù)據(jù)同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標(biāo)示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。

(五)OGG安全規(guī)則

報錯信息

2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.


錯誤信息含義源端報錯表示為該抽取進程需要和目標(biāo)端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標(biāo)端mgr進行溝通,遠(yuǎn)程將目標(biāo)的replicat進行啟動,由于安全性現(xiàn)在而被拒絕連接。

報錯原因

在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要遠(yuǎn)程啟動目標(biāo)端的replicat進程,需要在mgr節(jié)點增加訪問控制參數(shù)允許遠(yuǎn)程調(diào)用

解決辦法

在源端和目標(biāo)端的mgr節(jié)點上分別增加訪問控制規(guī)則并重啟

## 表示該mgr節(jié)點允許(ALLOW)10.186網(wǎng)段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


(六)數(shù)據(jù)抽取方式

報錯信息

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').


報錯原因

根據(jù)官方文檔說明,當(dāng)前直接通過Oracle數(shù)據(jù)庫抽取數(shù)據(jù)寫到MySQL這種initial-load方式,不支持LOBs數(shù)據(jù)類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB字段,無法進行傳輸,并且該方式不支持超過4k的字段數(shù)據(jù)類型

解決方法

將抽取進程中的RMTTASK改為RMTFILE參數(shù) 官方建議將數(shù)據(jù)先抽取成文件,再基于文件數(shù)據(jù)解析進行初始化導(dǎo)入

可以在SQLServer下運行:
SELECT *
FROM msdb.dbo.MSdatatype_mappings
SELECT *
FROM msdb.dbo.sysdatatypemappings
第一個SQL語句是看SQL轉(zhuǎn)Oracle的類型對應(yīng)
第二個表則更詳細(xì)得顯示了各個數(shù)據(jù)庫系統(tǒng)的類型對應(yīng)。

oracle clob類型相當(dāng)于mysql中的什么類型?

Oracle

CLOB  

Oracle 9i 及以前,最大4G字符數(shù)據(jù)  Oracle10g 最大4G*數(shù)據(jù)庫塊大小的字符數(shù)據(jù)  

MySQL

LONGTEXT

最大長度為4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允許的)長度取決

于客戶端/服務(wù)器協(xié)議中配置最大包大小和可用的內(nèi)存。

LONGBLOB

最大長度為4,294,967,295或4GB(232–1)字節(jié)的BLOB列。LONGBLOB列的最大有效(允許的)長度取

決于客戶端/服務(wù)器協(xié)議中配置最大包大小和可用的內(nèi)存。

Oracle

CLOB
Oracle 9i 及以前,最大4G字符數(shù)據(jù) Oracle10g 最大4G*數(shù)據(jù)庫塊大小的字符數(shù)據(jù)

MySQL

LONGTEXT
最大長度為4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允許的)長度取決于客戶端/服務(wù)器協(xié)議中配置最大包大小和可用的內(nèi)存。

LONGBLOB
最大長度為4,294,967,295或4GB(232–1)字節(jié)的BLOB列。LONGBLOB列的最大有效(允許的)長度取決于客戶端/服務(wù)器協(xié)議中配置最大包大小和可用的內(nèi)存。

數(shù)據(jù)從MySQL遷移到Oracle 需要注意什么

1.自動增長的數(shù)據(jù)類型處理
MYSQL有自動增長的數(shù)據(jù)類型,插入記錄時不用操作此字段,會自動獲得數(shù)據(jù)值。ORACLE沒有自動增長的數(shù)據(jù)類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標(biāo)記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 NUMBER(6) , 最大值為999999
INSERT 語句插入這個字段值為: 序列號的名稱.NEXTVAL
2. 單引號的處理
MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現(xiàn)的一個單引號替換成兩個單引號。
3. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數(shù);PHP里還可以用SEEK定位到結(jié)果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結(jié)果集只有一個ROWNUM字段標(biāo)明它的位 置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
以下是經(jīng)過分析后較好的兩種ORACLE翻頁SQL語句( ID是唯一關(guān)鍵字的字段名 ):語句一:SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;語句二:SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;
4. 長字符串的處理
長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小于等于4000個單字節(jié), 如果要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的字段值和超出長 度字段值都應(yīng)該提出警告,返回上次操作。
5. 日期字段的處理
MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當(dāng)前數(shù)據(jù)庫的系統(tǒng)時間為SYSDATE, 精確到秒,或者用字符串轉(zhuǎn)換成日期型函數(shù)TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小時:分鐘:秒 的格式Y(jié)YYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型字段轉(zhuǎn)換成字符串函數(shù)TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)
日期字段的數(shù)學(xué)運算公式有很大的不同。MYSQL找到離當(dāng)前時間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當(dāng)前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;
6. 空字符的處理
MYSQL的非空字段也有空的內(nèi)容,ORACLE里定義了非空字段就不容許有空的內(nèi)容。按MYSQL的NOT NULL來定義ORACLE表結(jié)構(gòu), 導(dǎo)數(shù)據(jù)的時候會產(chǎn)生錯誤。因此導(dǎo)數(shù)據(jù)時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。
7. 字符串的模糊比較
MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快,用字符串比較函數(shù) instr(字段名,'字符串')>0 會得到更精確的查找結(jié)果。
8. 程序和函數(shù)里,操作數(shù)據(jù)庫的工作完成后請注意結(jié)果集和指針的釋放。

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用于解決異構(gòu)數(shù)據(jù)環(huán)境中數(shù)據(jù)復(fù)制的一個商業(yè)工具。相比于其它遷移工具OGG的優(yōu)勢在于可以直接解析源端Oracle的redo log,因此能夠?qū)崿F(xiàn)在不需要對原表結(jié)構(gòu)做太多調(diào)整的前提下完成數(shù)據(jù)增量部分的遷移。本篇文章將重點介紹如何使用OGG實現(xiàn)Oracle到MySQL數(shù)據(jù)的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。


(一)OGG邏輯架構(gòu)

參照上圖簡單給大家介紹下OGG邏輯架構(gòu),讓大家對OGG數(shù)據(jù)同步過程有個簡單了解,后面章節(jié)會詳細(xì)演示相關(guān)進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

Manager進程:需要源端跟目標(biāo)端同時運行,主要作用是監(jiān)控管理其它進程,報告錯誤,分配及清理數(shù)據(jù)存儲空間,發(fā)布閾值報告等

Extract進程:運行在數(shù)據(jù)庫源端,主要用于捕獲數(shù)據(jù)的變化,負(fù)責(zé)全量、增量數(shù)據(jù)的抽取

Trails文件:臨時存放在磁盤上的數(shù)據(jù)文件

Data Pump進程:運行在數(shù)據(jù)庫源端,屬于Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數(shù)據(jù)直接發(fā)送到目標(biāo)端的Trail文件,如果配置了Data Pump,Extract進程會將數(shù)據(jù)抽取到本地Trail文件,然后通過Data Pump進程發(fā)送到目標(biāo)端,配置Data Pump進程的主要好處是即使源端到目標(biāo)端發(fā)生網(wǎng)絡(luò)中斷,Extract進程依然不會終止

Collector進程:接收源端傳輸過來的數(shù)據(jù)變化,并寫入本地Trail文件中

Replicat進程:讀取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)時使用了一個叫sqlines的開源工具,對于sqlines工具在MySQL端創(chuàng)建失敗及不符合預(yù)期的表結(jié)構(gòu)再進行特殊處理,以此來提高表結(jié)構(gòu)轉(zhuǎn)換的效率。

注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結(jié)構(gòu)遷移完成后到數(shù)據(jù)庫切換前盡量不要再修改表結(jié)構(gòu)。

(三)數(shù)據(jù)遷移

數(shù)據(jù)同步的操作均采用OGG工具進行,考慮數(shù)據(jù)全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取數(shù)據(jù)庫的redo log,待全量抽取結(jié)束后開啟增量數(shù)據(jù)回放,應(yīng)用全量和增量這段期間產(chǎn)生的日志數(shù)據(jù),OGG可基于參數(shù)配置進行重復(fù)數(shù)據(jù)處理,所以使用OGG時優(yōu)先將增量進行配置并啟用。此外,為了避免本章節(jié)篇幅過長,OGG參數(shù)將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢?nèi)魏文悴焕斫獾膮?shù)。

1.源端OGG配置

(1)Oracle數(shù)據(jù)庫配置

針對Oracle數(shù)據(jù)庫,OGG需要數(shù)據(jù)庫開啟歸檔模式及增加輔助補充日志、強制記錄日志等來保障OGG可抓取到完整的日志信息

查看當(dāng)前環(huán)境是否滿足要求,輸出結(jié)果如下圖所示:

(2)Oracle數(shù)據(jù)庫OGG用戶創(chuàng)建

OGG需要有一個用戶有權(quán)限對數(shù)據(jù)庫的相關(guān)對象做操作,以下為涉及的權(quán)限,該示例將創(chuàng)建一個用戶名和密碼均為ogg的Oracle數(shù)據(jù)庫用戶并授予以下權(quán)限

(3)源端OGG 管理進程(MGR)配置

(4)源端OGG 表級補全日志(trandata)配置

表級補全日志需要在最小補全日志打開的情況下才起作用,之前只在數(shù)據(jù)庫級開啟了最小補全日志(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日志以獲得必要的信息。

(5)源端OGG 抽取進程(extract)配置

Extract進程運行在數(shù)據(jù)庫源端,負(fù)責(zé)從源端數(shù)據(jù)表或日志中捕獲數(shù)據(jù)。Extract進程利用其內(nèi)在的checkpoint機制,周期性地檢查并記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統(tǒng)宕機,我們重啟Extract進程后,GoldenGate能夠恢復(fù)到以前的狀態(tài),從上一個斷點處繼續(xù)往下運行,而不會有任何數(shù)據(jù)損失。

(6)源端OGG 傳輸進程(pump)配置

pump進程運行在數(shù)據(jù)庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那么pump進程就會把trail文件以數(shù)據(jù)塊的形式通過TCP/IP協(xié)議發(fā)送到目標(biāo)端,Pump進程本質(zhì)上是Extract進程的一種特殊形式,如果不使用trail文件,那么Extract進程在抽取完數(shù)據(jù)后,直接投遞到目標(biāo)端。

補充:pump進程啟動時需要與目標(biāo)端的mgr進程進行連接,所以需要優(yōu)先將目標(biāo)端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日志文件到目標(biāo)端對應(yīng)目錄下

(7)源端OGG 異構(gòu)mapping文件(defgen)生成

該文件記錄了源庫需要復(fù)制的表的表結(jié)構(gòu)定義信息,在源庫生成該文件后需要拷貝到目標(biāo)庫的dirdef目錄,當(dāng)目標(biāo)庫的replica進程將傳輸過來的數(shù)據(jù)apply到目標(biāo)庫時需要讀寫該文件,同構(gòu)的數(shù)據(jù)庫不需要進行該操作。

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 管理進程(MGR)配置

目標(biāo)端的MGR進程和源端配置一樣,可直接將源端配置方式在目標(biāo)端重復(fù)執(zhí)行一次即可,該部分不在贅述

(3)目標(biāo)端OGG 檢查點日志表(checkpoint)配置

checkpoint表用來保障一個事務(wù)執(zhí)行完成后,在MySQL數(shù)據(jù)庫從有一張表記錄當(dāng)前的日志回放點,與MySQL復(fù)制記錄binlog的GTID或position點類似。

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit param ./GLOBALS

checkpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb [email protected]:3306 userid ogg

ggsci> add checkpointtable ogg.ggs_checkpoint

(4)目標(biāo)端OGG 回放線程(replicat)配置

Replicat進程運行在目標(biāo)端,是數(shù)據(jù)投遞的最后一站,負(fù)責(zé)讀取目標(biāo)端Trail文件中的內(nèi)容,并將解析其解析為DML語句,然后應(yīng)用到目標(biāo)數(shù)據(jù)庫中。

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 添加一個回放線程并與源端pump進程傳輸過來的trail文件關(guān)聯(lián),并使用checkpoint表確保數(shù)據(jù)不丟失

ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

#### 增加/編輯回放進程配置文件

ggsci> edit params r_cms

replicat r_cms

targetdb [email protected]: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進程只需配置完成,無需啟動,待全量抽取完成后再啟動。

至此源端環(huán)境配置完成 

待全量數(shù)據(jù)抽取完畢后啟動目標(biāo)端回放進程即可完成數(shù)據(jù)準(zhǔn)實時同步。

3.全量同步配置

全量數(shù)據(jù)同步為一次性操作,當(dāng)OGG軟件部署完成及增量抽取進程配置并啟動后,可配置1個特殊的extract進程從表中抽取數(shù)據(jù),將抽取的數(shù)據(jù)保存到目標(biāo)端生成文件,目標(biāo)端同時啟動一個單次運行的replicat回放進程將數(shù)據(jù)解析并回放至目標(biāo)數(shù)據(jù)庫中。

(1)源端OGG 全量抽取進程(extract)配置

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 增加/編輯全量抽取進程配置文件

#### 其中RMTFILE指定抽取的數(shù)據(jù)直接傳送到遠(yuǎn)端對應(yīng)目錄下

#### 注意:RMTFILE參數(shù)指定的文件只支持2位字符,如果超過replicat則無法識別

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 [email protected],PASSWORD ogg

RMTHOST 17X.1X.84.121,MGRPORT 7809

RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

TABLE cms.*;

#### 啟動并查看抽取進程正常

shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

## 查看日志是否正常進行全量抽取

shell> tail -f ./dirrpt/ei_cms.rpt

(2)目標(biāo)端OGG 全量回放進程(replicat)配置

#### 切換至ogg軟件目錄并執(zhí)行g(shù)gsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit params ri_cms

SPECIALRUN

END RUNTIME

TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg

EXTFILE /opt/ogg/dirdat/ms

DISCARDFILE ./dirrpt/ri_cms.dsc,purge

MAP cms.*,TARGET cms.*;

#### 啟動并查看回放進程正常

shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

#### 查看日志是否正常進行全量回放

shell> tail -f ./dirrpt/ri_cms.rpt

三、數(shù)據(jù)校驗

數(shù)據(jù)校驗是數(shù)據(jù)遷移過程中必不可少的環(huán)節(jié),本章節(jié)提供給幾個數(shù)據(jù)校驗的思路共大家參數(shù),校驗方式可以由以下幾個角度去實現(xiàn):

1.通過OGG日志查看全量、增量過程中discards記錄是否為0來判斷是否丟失數(shù)據(jù);

2.通過對源端、目標(biāo)端的表執(zhí)行count判斷數(shù)據(jù)量是否一致;

3.編寫類似于pt-table-checksum校驗原理的程序,實現(xiàn)行級別一致性校驗,這種方式優(yōu)缺點特別明顯,優(yōu)點是能夠完全準(zhǔn)確對數(shù)據(jù)內(nèi)容進行校驗,缺點是需要遍歷每一行數(shù)據(jù),校驗成本較高;

4.相對折中的數(shù)據(jù)校驗方式是通過業(yè)務(wù)角度,提前編寫好數(shù)十個返回結(jié)果較快的SQL,從業(yè)務(wù)角度抽樣校驗。

四、遷移問題處理

本章節(jié)將講述遷移過程中碰到的一些問題及相應(yīng)的解決方式。

(一)MySQL限制

在Oracle到MySQL的表結(jié)構(gòu)遷移過程中主要碰到以下兩個限制:

1. Oracle端的表結(jié)構(gòu)因為最初設(shè)計不嚴(yán)謹(jǐn),存在大量的列使用varchar(4000)數(shù)據(jù)類型,導(dǎo)致遷移到MySQL后超出行限制,表結(jié)構(gòu)無法創(chuàng)建。由于MySQL本身數(shù)據(jù)結(jié)構(gòu)的限制,一個16K的數(shù)據(jù)頁最少要存儲兩行數(shù)據(jù),因此單行數(shù)據(jù)不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

根據(jù)實際存儲數(shù)據(jù)的長度,對超長的varchar列進行收縮;

對于無法收縮的列轉(zhuǎn)換數(shù)據(jù)類型為text,但這在使用過程中可能導(dǎo)致一些性能問題;

2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字符集時,最多只能對varchar(768)的列創(chuàng)建索引;

3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導(dǎo)入時由于各表的插入順序不唯一,可能子表先插入數(shù)據(jù)而主表還未插入,導(dǎo)致報錯子表依賴的記錄不存在,因此建議數(shù)據(jù)遷移階段禁用主外鍵約束,待遷移結(jié)束后再打開。

mysql>set global foreign_key_checks=off;


(二)全量與增量銜接

HANDLECOLLISIONS參數(shù)是實現(xiàn)OGG全量數(shù)據(jù)與增量數(shù)據(jù)銜接的關(guān)鍵,其實現(xiàn)原理是在全量抽取前先開啟增量抽取進程,抓去全量應(yīng)用期間產(chǎn)生的redo log,當(dāng)全量應(yīng)用完成后,開啟增量回放進程,應(yīng)用全量期間的增量數(shù)據(jù)。使用該參數(shù)后增量回放DML語句時主要有以下場景及處理邏輯:

目標(biāo)端不存在delete語句的記錄,忽略該問題并不記錄到discardfile

目標(biāo)端丟失update記錄

- 更新的是主鍵值,update轉(zhuǎn)換成insert

- 更新的鍵值是非主鍵,忽略該問題并不記錄到discardfile

目標(biāo)端重復(fù)insert已存在的主鍵值,這將被replicat進程轉(zhuǎn)換為UPDATE現(xiàn)有主鍵值的行

(三)OGG版本選擇

在OGG版本選擇上我們也根據(jù)用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 數(shù)據(jù)庫版本為11.2.0.4,因此我們在選擇OGG版本時優(yōu)先選擇使用了11版本,但是使用過程中發(fā)現(xiàn),每次數(shù)據(jù)抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數(shù)詳細(xì)說明了解到trail文件默認(rèn)限制為2G,后來我們替換OGG版本為12.3,使用MAXFILES參數(shù)控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉(zhuǎn)讀取Trail文件,最終解決該問題。但是如果不幸Oracle環(huán)境使用了Linux 5版本的系統(tǒng),那么你的OGG需要再降一個小版本,最高只能使用OGG 12.2。

(四)無主鍵表處理

在遷移過程中還碰到一個比較難搞的問題就是當(dāng)前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導(dǎo)致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產(chǎn)生一些隱患,比如對于沒有主鍵的表,OGG默認(rèn)是將這個一行數(shù)據(jù)中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復(fù)數(shù)據(jù)導(dǎo)致數(shù)據(jù)同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標(biāo)示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。

(五)OGG安全規(guī)則

報錯信息

2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.


錯誤信息含義源端報錯表示為該抽取進程需要和目標(biāo)端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標(biāo)端mgr進行溝通,遠(yuǎn)程將目標(biāo)的replicat進行啟動,由于安全性現(xiàn)在而被拒絕連接。

報錯原因

在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要遠(yuǎn)程啟動目標(biāo)端的replicat進程,需要在mgr節(jié)點增加訪問控制參數(shù)允許遠(yuǎn)程調(diào)用

解決辦法

在源端和目標(biāo)端的mgr節(jié)點上分別增加訪問控制規(guī)則并重啟

## 表示該mgr節(jié)點允許(ALLOW)10.186網(wǎng)段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


(六)數(shù)據(jù)抽取方式

報錯信息

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').


報錯原因

根據(jù)官方文檔說明,當(dāng)前直接通過Oracle數(shù)據(jù)庫抽取數(shù)據(jù)寫到MySQL這種initial-load方式,不支持LOBs數(shù)據(jù)類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB字段,無法進行傳輸,并且該方式不支持超過4k的字段數(shù)據(jù)類型

解決方法

將抽取進程中的RMTTASK改為RMTFILE參數(shù) 官方建議將數(shù)據(jù)先抽取成文件,再基于文件數(shù)據(jù)解析進行初始化導(dǎo)入

答:以下是MySQL遷到Oracle需要掌握的注意事項,希望對你有所幫助。 1.自動增長的數(shù)據(jù)類型處理 MYSQL有自動增長的數(shù)據(jù)類型,插入記錄時不用操作此字段,會自動獲得數(shù)據(jù)值。ORACLE沒有自動增長的數(shù)據(jù)類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。

相關(guān)推薦:

電子合同糾紛解決(簽電子合同糾紛怎么解決)

現(xiàn)戶籍所在地怎么填寫(戶籍所在地怎么填寫)

超生新生兒如何上戶(超生如何給孩子上戶口)

行政處罰會留案底嗎(行政處罰決定書會留案底嗎)

公民如何保護生命健康權(quán)(法律如何保護我們的健康)

熱門標(biāo)簽