oracle數據庫表導入mysql,excel數據導入oracle表中

本文目錄一覽:

oracle導數據到mysql(腳本方式)

spool /home/oracle/XXX.sql 後面是你要的導出路徑和導出文件名,最好是 txt 結尾的,不是的話等導完需要改名。

之後是 select 語句,字段和表名根據實際更改,日期要用 to_char 進行轉換。

/data01/zhu/XXX.txt 是你 oracle 導出文件的位置,只支持 txt文件 , fields terminated by ‘,’ 意思是你字段間的分隔符。一般沒有中文用 character set utf8 ,有中文用 character set gb2312 ,不然可能會報錯。

PS:180萬條數據導進去的時間大概是2分鐘。但是700萬數據目前超過四小時還沒導完,建議分割來提高效率。

如何把oracle中表的數據導入mysql

ORACLE裡面把數據導出為文本文件,再在MYSQL裡面導入文本文件,通過文本作為中介可以避免複雜的漢字編碼問題導致的亂馬,還可以解決不同架構的服務器之間的數據交換。

怎麼把oracle數據移植到mysql?

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  

(二)表結構遷移

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

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

(三)數據遷移

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

1.源端OGG配置

(1)Oracle數據庫配置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mysqlset 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參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入

怎麼把oracle裡面的表結構直接導入到mysql數據庫中?

添加oracle驅動,在mysql裡面新建oracle的

鏈接對象

,配好鏈接對象後就能從mysql直接訪問oracle的數據,也就能導入oracle的數據。

如何將Oracle數據導入MySQL

可以導成文本格式的數據,比如使用特殊的符號分隔:||,然後MySQL可以使用LOAD DATA 命令 或者mysqlimport工具導入,即可….關鍵四點:

1.表結構定義要對應;

2.數據分隔符號一定不在數據中出現,否則格式就亂了;

3.數據導出的字符集編碼與需要存儲的字符集編碼要對應起來;

4.導入的時候設置對應的字符集;

備註:上述辦法是通過人工完成的,還有一些收費工具可用的,你可以google下,還有一種辦法就是編寫程序的模式,把數據讀出來再入MySQL.若是停機維護,推薦已經列出的方法。

oracle數據庫中的表如何能夠導入到mysql中?

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  

(二)表結構遷移

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

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

(三)數據遷移

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

1.源端OGG配置

(1)Oracle數據庫配置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mysqlset 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參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EGVQ的頭像EGVQ
上一篇 2024-10-31 15:30
下一篇 2024-10-31 15:30

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29

發表回復

登錄後才能評論