oracle轉mysql數據移植「oracle遷移到mysql方案」

本文目錄:

一、OGG概述

(一)OGG邏輯架構

二、遷移方案

(一)環境信息

(二)表結構遷移

(三)數據遷移

1.源端OGG配置

(1)Oracle數據庫配置

(2)Oracle數據庫OGG用戶創建

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

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

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

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

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

2.目標端OGG配置

(1)目標端MySQL數據庫配置

(2)目標端OGG 管理進程(MGR)配置

(3)目標端OGG 檢查點日誌表(checkpoint)配置

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

3.全量同步配置

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

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

三、數據校驗

四、遷移問題處理

(一)MySQL限制

(二)全量與增量銜接

(三)OGG版本選擇

(四)無主鍵表處理

(五)OGG安全規則

(六)數據抽取方式

五、OGG參考資料

一、OGG概述

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用於解決異構數據環境中數據複製的一個商業工具。相比於其它遷移工具OGG的優勢在於可以直接解析源端Oracle的redo log,因此能夠實現在不需要對原表結構做太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。

(一)OGG邏輯架構

詳解MySQL|一招實現從Oracle到MySQL的平滑數據遷移-愛可生

參照上圖簡單給大家介紹下OGG邏輯架構,讓大家對OGG數據同步過程有個簡單了解,後面章節會詳細演示相關進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

  • Manager進程:需要源端跟目標端同時運行,主要作用是監控管理其它進程,報告錯誤,分配及清理數據存儲空間,發布閾值報告等
  • Extract進程:運行在數據庫源端,主要用於捕獲數據的變化,負責全量、增量數據的抽取
  • Trails文件:臨時存放在磁盤上的數據文件
  • Data Pump進程:運行在數據庫源端,屬於Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數據直接發送到目標端的Trail文件,如果配置了Data Pump,Extract進程會將數據抽取到本地Trail文件,然後通過Data Pump進程發送到目標端,配置Data Pump進程的主要好處是即使源端到目標端發生網絡中斷,Extract進程依然不會終止
  • Collector進程:接收源端傳輸過來的數據變化,並寫入本地Trail文件中
  • Replicat進程:讀取Trail文件中記錄的數據變化,創建對應的DML語句並在目標端回放

二、遷移方案

(一)環境信息

詳解MySQL|一招實現從Oracle到MySQL的平滑數據遷移-愛可生

(二)表結構遷移

表結構遷移屬於難度不高但內容比較繁瑣的一步,我們在遷移表結構時使用了一個叫sqlines的開源工具,對於sqlines工具在MySQL端創建失敗及不符合預期的表結構再進行特殊處理,以此來提高表結構轉換的效率。

注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結構遷移完成後到數據庫切換前盡量不要再修改表結構。

(三)數據遷移

數據同步的操作均採用OGG工具進行,考慮數據全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取數據庫的redo log,待全量抽取結束後開啟增量數據回放,應用全量和增量這段期間產生的日誌數據,OGG可基於參數配置進行重複數據處理,所以使用OGG時優先將增量進行配置並啟用。此外,為了避免本章節篇幅過長,OGG參數將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢任何你不理解的參數。

1.源端OGG配置

(1)Oracle數據庫配置

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

查看當前環境是否滿足要求,輸出結果如下圖所示:

SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
詳解MySQL|一招實現從Oracle到MySQL的平滑數據遷移-愛可生

如果條件不滿足則實行該部分,

#### 開啟歸檔(開啟歸檔需要重啟數據庫)SQL> shutdown immediate;SQL> startup mount;SQL> alter database archivelog;SQL> alter database open;SQL> archive log list;
#### 開啟附加日誌和強制日誌SQL> alter database add supplemental log data;SQL> alter database force logging;SQL> alter system switch logfile;
#### 啟用OGG支持SQL> show parameter enable_goldengate_replicationSQL> alter system set enable_goldengate_replication=true;
#### 再次查看當前環境是否滿足要求SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

(2)Oracle數據庫OGG用戶創建

OGG需要有一個用戶有權限對數據庫的相關對象做操作,以下為涉及的權限,該示例將創建一個用戶名和密碼均為ogg的Oracle數據庫用戶並授予以下權限

#### 查看當前數據庫已存在的表空間,可使用已有表空間或新建單獨的表空間SQL> SELECT TABLESPACE_NAME, CONTENTS FROM DBA_TABLESPACES;
#### 查看當前表空間文件數據目錄SQL> SELECT NAME FROM V$DATAFILE;
#### 創建一個新的OGG用戶的表空間SQL> CREATE TABLESPACE OGG_DATA DATAFILE '/u01/app/oracle/oradata/cms/ogg_data01.dbf' SIZE 2G;
#### 創建ogg用戶且指定對應表空間並授權SQL> CREATE USER ogg IDENTIFIED BY ogg DEFAULT TABLESPACE OGG_DATA;SQL> grant connect,resource,unlimited tablespace to ogg;SQL> grant create session,alter session to ogg;SQL> grant execute on utl_file to ogg;SQL> grant select any dictionary, select any table to ogg;SQL> grant alter any table to ogg;SQL> grant flashback any table to ogg;SQL> grant select any transaction to ogg;SQL> grant sysdba to ogg;SQL> grant execute on dbms_streams_adm to ogg;SQL> grant execute on dbms_flashback to ogg;SQL> exec dbms_goldengate_auth.grant_admin_privilege('OGG');

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 編輯/創建mgr配置文件ggsci> edit params mgr
PORT 7809DYNAMICPORTLIST 8000-8050-- AUTOSTART extract-- AUTORESTART extract,retries 4,waitminutes 4STARTUPVALIDATIONDELAY 5ACCESSRULE, PROG *, IPADDR 17X.1X.*, ALLOWACCESSRULE, PROG SERVER, ALLOWPURGEOLDEXTRACTS /home/oracle/ogg/dirdat/*, USECHECKPOINTS,MINKEEPFILES 3
#### 啟動並查看mgr狀態ggsci> start mgrggsci> info allggsci> view report mgr

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

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 使用ogg用戶登錄appdb實例(TNS配置)對cms所有表增加表級補全日誌ggsci> dblogin userid ogg@appdb,password oggggsci> add trandata cms.*

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

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 創建一個新的增量抽取進程,從redo日誌中抽取數據ggsci> add extract e_cms,tranlog,begin now
#### 創建一個抽取進程抽取的數據保存路徑並與新建的抽取進程進行關聯ggsci> add exttrail /home/oracle/ogg/dirdat/ms,extract e_cms,megabytes 1024
#### 創建抽取進程配置文件ggsci> edit params e_cmsextract e_cmssetenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")setenv (ORACLE_HOME = "/data/oracle/11.2/db_1")setenv (ORCLE_SID = "cms")userid ogg@appdb,password oggdiscardfile /home/oracle/ogg/dirrpt/e_cms.dsc,append,megabytes 1024exttrail /home/oracle/ogg/dirdat/msstatoptions reportfetchreportcount every 1 minutes,ratewarnlongtrans 1H,checkinterval 5mtable cms.*;
#### 啟動源端抽取進程ggsci> start e_cmsggsci> info allggsci> view report e_cms

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

pump進程運行在數據庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那麼pump進程就會把trail文件以數據塊的形式通過TCP/IP協議發送到目標端,Pump進程本質上是Extract進程的一種特殊形式,如果不使用trail文件,那麼Extract進程在抽取完數據後,直接投遞到目標端。

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 增加一個傳輸進程與抽取進程抽取的文件進行關聯shell> add extract p_cms,exttrailsource /home/oracle/ogg/dirdat/ms
#### 增加配置將抽取進程抽取的文件數據傳輸到遠程對應目錄下#### 注意rmttrail參數指定的是目標端的存放目錄,需要目標端存在該目錄路徑shell> add rmttrail /opt/ogg/dirdat/ms,extract p_cms 

#### 創建傳輸進程配置文件shell>edit params p_cmsextract p_cms setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")setenv (ORACLE_HOME = "/data/oracle/11.2/db_1")setenv (ORCLE_SID = "cms")userid ogg@appdb,password oggRMTHOST 17X.1X.84.121,MGRPORT 7809RMTTRAIL /opt/ogg/dirdat/msdiscardfile /home/oracle/ogg/dirrpt/p_cms.dsc,append,megabytes 1024table cms.*;
#### 啟動源端抽取進程#### 啟動前確保目標端mgr進程已開啟ggsci> start p_cmsggsci> info allggsci> view report p_cms

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

該文件記錄了源庫需要複製的表的表結構定義信息,在源庫生成該文件後需要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時需要讀寫該文件,同構的數據庫不需要進行該操作。

#### 創建mapping文件配置shell> cd $OGG_HOMEshell> vim ./dirprm/mapping_cms.prm defsfile ./dirdef/cms.def,purgeuserid ogg@appdb,password oggtable cms.*;
#### 基於配置生成cms庫的mapping文件#### 默認生成的文件保存在$OGG_HOME目錄的dirdef目錄下shell> ./defgen paramfile ./dirprm/mapping_cms.prm
#### 將該文件拷貝至目標端對應的目錄shell> scp ./dirdef/cms.def root@17X.1X.84.121:/opt/ogg/dirdef

至此源端環境配置完成

2.目標端OGG配置

(1)目標端MySQL數據庫配置

  • 確認MySQL端表結構已經存在
  • MySQL數據庫OGG用戶創建
mysql> create user 'ogg'@'%' identified by 'ogg';mysql> grant all on *.* to 'ogg'@'%';
#### 提前創建好ogg存放checkpoint表的數據庫mysql> create database ogg;

(2)目標端OGG 管理進程(MGR)配置

目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重複執行一次即可,該部分不在贅述

(3)目標端OGG 檢查點日誌表(checkpoint)配置

checkpoint表用來保障一個事務執行完成後,在MySQL數據庫從有一張表記錄當前的日誌回放點,與MySQL複製記錄binlog的GTID或position點類似。

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
ggsci> edit param ./GLOBALScheckpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb ogg@17X.1X.84.121:3306 userid oggggsci> add checkpointtable ogg.ggs_checkpoint

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

Replicat進程運行在目標端,是數據投遞的最後一站,負責讀取目標端Trail文件中的內容,並將解析其解析為DML語句,然後應用到目標數據庫中。

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 添加一個回放線程並與源端pump進程傳輸過來的trail文件關聯,並使用checkpoint表確保數據不丟失ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
#### 增加/編輯回放進程配置文件ggsci> edit params r_cmsreplicat r_cmstargetdb cms@17X.1X.84.121:3306,userid ogg,password oggsourcedefs /opt/ogg/dirdef/cms.defdiscardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024HANDLECOLLISIONSMAP cms.*,target cms.*;

注意:replicat進程只需配置完成,無需啟動,待全量抽取完成後再啟動。

至此源端環境配置完成

待全量數據抽取完畢後啟動目標端回放進程即可完成數據准實時同步。

3.全量同步配置

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

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
#### 增加/編輯全量抽取進程配置文件#### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下#### 注意:RMTFILE參數指定的文件只支持2位字符,如果超過replicat則無法識別ggsci> edit params ei_cmsSOURCEISTABLESETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")SETENV (ORACLE_SID=cms)SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)USERID ogg@appdb,PASSWORD oggRMTHOST 17X.1X.84.121,MGRPORT 7809RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purgeTABLE cms.*;
#### 啟動並查看抽取進程正常shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &
## 查看日誌是否正常進行全量抽取shell> tail -f ./dirrpt/ei_cms.rpt

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

#### 切換至ogg軟件目錄並執行ggsci進入命令行終端shell> cd $OGG_HOMEshell> ggsci
ggsci> edit params ri_cmsSPECIALRUNEND RUNTIMETARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD oggEXTFILE /opt/ogg/dirdat/msDISCARDFILE ./dirrpt/ri_cms.dsc,purgeMAP cms.*,TARGET cms.*;
#### 啟動並查看回放進程正常shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &
#### 查看日誌是否正常進行全量回放shell> tail -f ./dirrpt/ri_cms.rpt

三、數據校驗

數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:

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

2.通過對源端、目標端的表執行count判斷數據量是否一致;

3.編寫類似於pt-table-checksum校驗原理的程序,實現行級別一致性校驗,這種方式優缺點特別明顯,優點是能夠完全準確對數據內容進行校驗,缺點是需要遍歷每一行數據,校驗成本較高;

4.相對摺中的數據校驗方式是通過業務角度,提前編寫好數十個返回結果較快的SQL,從業務角度抽樣校驗。

四、遷移問題處理

本章節將講述遷移過程中碰到的一些問題及相應的解決方式。

(一)MySQL限制

在Oracle到MySQL的表結構遷移過程中主要碰到以下兩個限制:

1. Oracle端的表結構因為最初設計不嚴謹,存在大量的列使用varchar(4000)數據類型,導致遷移到MySQL後超出行限制,表結構無法創建。由於MySQL本身數據結構的限制,一個16K的數據頁最少要存儲兩行數據,因此單行數據不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

  • 根據實際存儲數據的長度,對超長的varchar列進行收縮;
  • 對於無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;

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

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

mysql>set global foreign_key_checks=off;

(二)全量與增量銜接

HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成後,開啟增量回放進程,應用全量期間的增量數據。使用該參數後增量回放DML語句時主要有以下場景及處理邏輯:

  • 目標端不存在delete語句的記錄,忽略該問題並不記錄到discardfile
  • 目標端丟失update記錄- 更新的是主鍵值,update轉換成insert- 更新的鍵值是非主鍵,忽略該問題並不記錄到discardfile
  • 目標端重複insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行

(三)OGG版本選擇

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

(四)無主鍵表處理

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

(五)OGG安全規則

  • 報錯信息
2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.

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

  • 報錯原因

在Oracle OGG 11版本後,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用

  • 解決辦法

在源端和目標端的mgr節點上分別增加訪問控制規則並重啟

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

(六)數據抽取方式

  • 報錯信息
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').
  • 報錯原因

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

  • 解決方法

將抽取進程中的RMTTASK改為RMTFILE參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入

五、OGG參考資料

閱讀OGG官方文檔,查看support.oracle.com上Oracle官方給予的問題解決方案是學習OGG非常有效的方式,作者這裡也打包了一些文檔供大家下載查看,其中個人感覺比較重要並且查看比較多的文檔包括: How to Replicate Data Between Oracle and MySQL Database? (文檔 ID 1605674.1).pdf 這個文檔的作用相當於OGG快速開始,能夠幫助用戶快速的配置並跑通OGG全量、增量數據同步的流程,非常適合初學者上手 Administering Oracle GoldenGate for Windows and UNIX.pdf Administering文檔內容較多,其中詳細介紹了各種OGG的使用配置場景,大家可以根據自己需要選擇重點章節瀏覽 Reference for Oracle GoldenGate for Windows and UNIX.pdf Reference文檔算是我查看最多的一個文檔,其中包含了OGG所有參數的描述、語法及使用示例,非常的詳細,這也是前面未對參數進行展開講解的原因。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/274952.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:18
下一篇 2024-12-17 14:18

相關推薦

發表回復

登錄後才能評論