原創做者: 杜開生mysql
本文目錄:sql
1、OGG概述shell
(一)OGG邏輯架構數據庫
2、遷移方案vim
(一)環境信息安全
(二)表結構遷移網絡
(三)數據遷移session
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)配置
3、數據校驗
4、遷移問題處理
(一)MySQL限制
(二)全量與增量銜接
(三)OGG版本選擇
(四)無主鍵表處理
(五)OGG安全規則
(六)數據抽取方式
5、OGG參考資料
OGG全稱爲Oracle GoldenGate,是由Oracle官方提供的用於解決異構數據環境中數據複製的一個商業工具。相比於其它遷移工具OGG的優點在於能夠直接解析源端Oracle的redo log,所以可以實如今不須要對原表結構作太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述我的在遷移過程當中所碰到問題的解決方案。
(一)OGG邏輯架構
參照上圖簡單給你們介紹下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語句並在目標端回放
(一)環境信息
軟件名稱 | 源端 | 目標端 |
---|---|---|
OGG版本 | OGG 12.2.0.2.2 For Oracle | OGG 12.2.0.2.2 For MySQL |
數據庫版本 | Oracle 11.2.0.4 | MySQL 5.7.21 |
OGG_HOME | /home/oracle/ogg | /opt/ogg |
IP地址 | 17X.1X.84.124 | 17X.1X.84.121 |
數據庫 | cms | cms |
(二)表結構遷移
表結構遷移屬於難度不高但內容比較繁瑣的一步,咱們在遷移表結構時使用了一個叫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;
若是條件不知足則實行該部分,
#### 開啓歸檔(開啓歸檔須要重啓數據庫) 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_replication SQL> 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_HOME shell> ggsci #### 編輯/建立mgr配置文件 ggsci> edit params mgr PORT 7809 DYNAMICPORTLIST 8000-8050 -- AUTOSTART extract -- AUTORESTART extract,retries 4,waitminutes 4 STARTUPVALIDATIONDELAY 5 ACCESSRULE, PROG *, IPADDR 17X.1X.*, ALLOW ACCESSRULE, PROG SERVER, ALLOW PURGEOLDEXTRACTS /home/oracle/ogg/dirdat/*, USECHECKPOINTS,MINKEEPFILES 3 #### 啓動並查看mgr狀態 ggsci> start mgr ggsci> info all ggsci> view report mgr
(4)源端OGG 表級補全日誌(trandata)配置
表級補全日誌須要在最小補全日誌打開的狀況下才起做用,以前只在數據庫級開啓了最小補全日誌(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啓表級的補全日誌以得到必要的信息。
#### 切換至ogg軟件目錄並執行ggsci進入命令行終端 shell> cd $OGG_HOME shell> ggsci #### 使用ogg用戶登陸appdb實例(TNS配置)對cms全部表增長表級補全日誌 ggsci> dblogin userid ogg@appdb,password ogg ggsci> add trandata cms.*
(5)源端OGG 抽取進程(extract)配置
Extract進程運行在數據庫源端,負責從源端數據表或日誌中捕獲數據。Extract進程利用其內在的checkpoint機制,週期性地檢查並記錄其讀寫的位置,一般是寫入到本地的trail文件。這種機制是爲了保證若是Extract進程終止或者操做系統宕機,咱們重啓Extract進程後,GoldenGate可以恢復到之前的狀態,從上一個斷點處繼續往下運行,而不會有任何數據損失。
#### 切換至ogg軟件目錄並執行ggsci進入命令行終端 shell> cd $OGG_HOME shell> 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_cms extract e_cms setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_HOME = "/data/oracle/11.2/db_1") setenv (ORCLE_SID = "cms") userid ogg@appdb,password ogg discardfile /home/oracle/ogg/dirrpt/e_cms.dsc,append,megabytes 1024 exttrail /home/oracle/ogg/dirdat/ms statoptions reportfetch reportcount every 1 minutes,rate warnlongtrans 1H,checkinterval 5m table cms.*; #### 啓動源端抽取進程 ggsci> start e_cms ggsci> info all ggsci> 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_HOME shell> 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_cms extract 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 ogg RMTHOST 17X.1X.84.121,MGRPORT 7809 RMTTRAIL /opt/ogg/dirdat/ms discardfile /home/oracle/ogg/dirrpt/p_cms.dsc,append,megabytes 1024 table cms.*; #### 啓動源端抽取進程 #### 啓動前確保目標端mgr進程已開啓 ggsci> start p_cms ggsci> info all ggsci> view report p_cms
(7)源端OGG 異構mapping文件(defgen)生成
該文件記錄了源庫須要複製的表的表結構定義信息,在源庫生成該文件後須要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時須要讀寫該文件,同構的數據庫不須要進行該操做。
#### 建立mapping文件配置 shell> cd $OGG_HOME shell> vim ./dirprm/mapping_cms.prm defsfile ./dirdef/cms.def,purge userid ogg@appdb,password ogg table 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_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)目標端OGG 回放線程(replicat)配置
Replicat進程運行在目標端,是數據投遞的最後一站,負責讀取目標端Trail文件中的內容,並將解析其解析爲DML語句,而後應用到目標數據庫中。
#### 切換至ogg軟件目錄並執行ggsci進入命令行終端 shell> cd $OGG_HOME shell> ggsci #### 添加一個回放線程並與源端pump進程傳輸過來的trail文件關聯,並使用checkpoint表確保數據不丟失 ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint #### 增長/編輯回放進程配置文件 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進程只需配置完成,無需啓動,待全量抽取完成後再啓動。
至此源端環境配置完成
待全量數據抽取完畢後啓動目標端回放進程便可完成數據準實時同步。
3.全量同步配置
全量數據同步爲一次性操做,當OGG軟件部署完成及增量抽取進程配置並啓動後,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啓動一個單次運行的replicat回放進程將數據解析並回放至目標數據庫中。
(1)源端OGG 全量抽取進程(extract)配置
#### 切換至ogg軟件目錄並執行ggsci進入命令行終端 shell> cd $OGG_HOME shell> ggsci #### 增長/編輯全量抽取進程配置文件 #### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下 #### 注意:RMTFILE參數指定的文件只支持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 ogg@appdb,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)目標端OGG 全量回放進程(replicat)配置
#### 切換至ogg軟件目錄並執行ggsci進入命令行終端 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.*; #### 啓動並查看回放進程正常 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官方文檔,查看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全部參數的描述、語法及使用示例,很是的詳細,這也是前面未對參數進行展開講解的緣由。
文檔資料百度網盤下載連接: