oracle資料庫遷移mysql
1. 怎麼使用powerdesinger 16.5將oracle的表和數據轉到mysql
1、工具的准備
1.1、安裝Oracle SQL Developer,我是用的是最新版本,下載後解壓到任意目錄即可(不含中文,空格)。
1.2、下載mysql的驅動jar文件,官網地址查出後忘了,此處免費提供下載;下載後解壓到任意目錄
1.3、打開Oracle SQL Developer,菜單欄中選擇 工具-->首選項-->資料庫-->第三方JDBC驅動程序中選擇mysql驅動解壓後的jar文件,然後點擊確定。
2、建立Oracle資料庫與用戶(用來承載mysql移植來的數據)-->此處操作後續補齊,網上資料很多,當然,此處也可以省略(如果你的項目中不需要額外的資料庫和用戶的話)
2.1、在資料庫建好之後,為了給用戶授予許可權,我們創建一個管理員的連接(當然,你也可以在命令行中連接oracle完成授權操作)
2.2、建立用戶並授予許可權,授予許可權(此處指你已經創建了自己的資料庫,或者使用oracle默認的資料庫)
另:此處提供簡略版創建用戶與表空間的結構,此處不做解釋,後期補充
--創建臨時表空間 aaaa意義:臨時表空間,臨時表空間文件
create temporary tablespace aaaa_temp
tempfile 'G:\software\Java_database\oracle\runtimebj\aaaa_temp.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--創建數據表空間 aaaa意義:表空間,表空間文件
create tablespaceaaaa
logging
datafile 'G:\software\Java_database\oracle\runtimebj\aaaa.dbf'
size 100m
autoextend on
next 32m maxsize 2048m
extent management local;
--創建用戶並指定表空間 aaaa順序意義:用戶名,密碼,表空間,臨時表空間
create user aaaa identified byaaaa
default tablespaceaaaa temporary tablespaceaaaa_temp;
--授予message用戶DBA角色的所有許可權 此處的aaaa只表示用戶名
GRANT DBA TOaaaa;
grant resource to aaaawith admin option; --需添加這句話否則連接的時候會報錯...
2.3再次創建連接,使用新創建的用戶連接
2.4、連接建立後,右鍵連接,移植資料檔案庫-->關聯移植資料檔案庫-->點擊確定
2.5、連接mysql(就是需要進行移植到的mysql資料庫),點擊選擇資料庫後確定
3、移植mysql中的表到資料庫
3.1、在剛剛建立的mysql中選擇需要進行移植的資料庫(也可以點擊加號,批量選擇需要移植的表,此處移植整個資料庫,所以我在資料庫上右鍵了),右鍵選擇捕獲方案
等待
3.2、在剛捕獲的模型中選擇需要的資料庫或者表等,點擊轉換為Oracle模型
3.3、設置數據映射,一般默認即可(但是我的項目中mysql使用了datetime和timestamp,如果默認會轉為oracle中的date,從而失去了時分秒,如果必須需要十分秒的話,此處映射可以將timestamp-->timestamp,但是datetime這里好像是無法轉換為timestamp,只能後面手動修改了...悲劇...),此後點擊應用,同樣進入進度條
3.4、右鍵點擊剛剛捕獲的方案,因為在生成的時候,他會根據方案名稱重新創建用戶,並將生成的表存放到該用戶下,所以建議重命名方案,將其修改為我們需要的用戶名稱(用戶名與密碼相同),用戶名稱也就是我們jdbc或者hibernate連接資料庫時將要使用的名稱。完成後點擊生成。
3.5、生成建立表的sql語句,點擊下列紅色框按鈕開始執行...等待
3.6、執行後,在創建連接,使用我們執行sql中的用戶名密碼(也就是方案名稱),連接後,你會發現,表已經生成了
表移植完畢
4、數據的移植
4.1、右鍵上次我們創建的轉換的模型,選擇移動數據
4.2、選擇源與目標(目標是我們剛剛建立表的那個連接)
4.3、進入移動數據進度條,等待後,數據移動完成。
2. 請問如何將oracle資料庫中的數據遷移到mysql資料庫中 謝謝
建議使用工具來做,直接手工命令相當的麻煩的。
1、
建議使用:Toad for Oracle 10、PLSQL Developer等Oracle工具操作。
把Oracle資料庫中的數據轉為文本或Excel或保存為sql插入語句,再插入Mysql中,這樣就不存在介面字元集差異問題。
2、
也可以使用管道方式直接導入,使用PowerBuilder工具導入。
直接dmp是不現實的!
3. oracle的資料庫可以導到mysql嗎
你好。
當然可以
這就是 數據遷移
從數據類型,數據,函數,存儲過程等等,進行改寫
上層代碼的改寫
反正去IOE挺麻煩的
4. 可以吧oracle資料庫轉換成mysql嘛
技術上可以實現,需要處理兩個資料庫之間的差異,比如表結構定義的語法和類型,如果是項目中使用,還需要修改連接的驅動類和url。
5. 如何將oracle資料庫轉換成mysql資料庫,現在公司有急用,方法可用的話再加分!
講解Oracle資料庫移植到MySQL
出處:IT專家網 日期:2010-06-24
一、前言
公司原來的項目是基於Oracle資料庫的,Oracle功能強大,但是部署和管理較復雜,更重要的是,購買Oracle的費用不是每個客戶都願意承擔的。因此,迫切需要把公司項目所用資料庫移植到一個簡單好用的資料庫上。當然,如您所料,我們選擇了廣受歡迎的MySQL。
作為一個開源資料庫,MySQL用無數案例證明了她的可用性,因此讓我們把重點放在如何將Oracle移植到MySQL上。已經有很多的文章和專題介紹了Oracle移植到MySQL的方法和步驟,也有相當多的工具可以輔助這種移植過程。但是,由於資料庫實現的差異,完美的移植工具是不存在的,移植過程中不斷碰到的問題證明了這一點,特別是您使用了Oracle的一些高級特性時。
從Oracle移植到MySQL主要有六個方面的內容需要移植,一是表Table,包括表結構和數據,二是觸發器Trigger,三是存儲過程Procere,函數function和包Package,四是任務Job,五是用戶等其他方面的移植,六是具體應用程序通過SQL語句訪問時的細節差異克服。
筆者用來移植測試的資料庫是:Oracle 9i ,MySQL 6.0,Windows 2000環境。
二、表的移植
這個部分的移植是最容易用工具實現的部分,因為很多MySQL的圖形管理工具都自帶這樣的移植工具,比如SQLYog,MySQL Administrator等。但是,這些工具的移植能力各有不同,對欄位類型轉換、字元集等問題都有自己的處理方式,使用時請注意。
筆者使用「SQLYog Migration Toolkit」工具按提示步驟移植後,表的主要結構和數據將成功移植,主要包括表的欄位類型(經過映射轉換,比如number會轉換為double,date轉換為timestamp等,請小心處理日期欄位的默認值等),表的主鍵,表的索引(Oracle的點陣圖索引會被轉成BTree索引,另外表和欄位的注釋會丟失)等信息。需要特別注意的是,Oracle的自增欄位的處理。
大家知道,Oracle通常使用序列sequence配合觸發器實現自增欄位,但是MySQL和SQL Server等一樣,不提供序列,而直接提供欄位自增屬性。所以,請把Oracle裡面的自增欄位實現直接改為MySQL的欄位屬性,而且,這個欄位必須是主鍵(key)並且不能有默認值。
還有一個問題,如果您的應用要直接使用Oracle的某個序列,那麼您只能在MySQL裡面模擬實現一個,具體方法就是利用MySQL的自增欄位實現的。
三、觸發器的移植
首先,MySQL在6.0以後才支持觸發器!
觸發器的移植沒有現成工具,因為兩者之間的語法差異較大,您只能通過手工對照著原來的邏輯一個一個添加。
這里要說明一下,MySQL的SQL過程語法和Oracle PL/SQL大致相同,但還是有些細微差別:
1. 變數聲明Declare部分,在Oracle中Declare語句位於Begin之前,在MySQl中,Declare位於Begin之後;
2. 注釋不同,在Oracle中,可用 「—「 注釋一行或「/* */」注釋一段,在MySQL中,需用 「/* */」或「#」來注釋
3. 對觸發前後變數值的引用方法不同;在Oracle中,用 :new.eid, :old.eid表示新舊值,
在MySQL中,用 New.eid,old.eid表示新舊值
4. 移植中發現的問題
1) Oracle的自治事務autonomous_transaction ,MySQL不支持,您必須用其他方式實現,MySQL不允許在觸發器過程中執行對觸發器所在表的操作(包括讀寫)
2) MySQL函數和trigger中不能執行動態SQL語句,也就是說,您不能在觸發器裡面組合出來一個SQL字元串,然後用exec來執行
3) Oracle的表級觸發器,MySQL還不支持,所以必須改成使用行級觸發器,注意這會導致有時SQL語句的執行效率很低
四、存儲過程,函數和程序包的移植
程序包是Oracle用來組織邏輯功能的一個Object,MySQL不支持,因此需要將包里的存儲過程、函數等全部放到該資料庫公有過程和函數裡面。
MySQL的過程和函數語法與Oracle類似,但還是有細微差別,除了數據類型需要轉換,還有:
1. 格式不同,例如:
Oracle為:
CREATE OR REPLACE procere procere1(TableName in varchar2) is
MySQL應該為:
CREATE procere procere1( in TableName varchar(200))
2. 賦值語句不同:
Oracle賦值語句為:
strSQL := 『update table set field1=1』;
MySQL應該為:
Set StrSQL = 『update table set field1=1』;(用:=也行)
3. 一些要用到游標的過程請注意
MySQL過程不支持嵌套游標,不支持帶參游標,不支持記錄類型%ROWTYPE,不支持數組等,原Oracle用到這些的必須改寫
五、Job的移植
Job是Oracle的定時任務實現的方法,MySQL6中用Event實現,具體語法請參考MySQL手冊。
在MySQL中使用event請注意,默認它是不運行的,您可以
1) 保證MySQL定時任務event scheler運行,需要MySql 5.1.6以上,並且在啟動後執行SET GLOBAL event_scheler = ON;(也可以在初始配置文件比如my.ini中加入event_scheler = ON的參數)
2) 啟用event功能後,每次執行會往MySQL的錯誤日誌文件寫一些信息(data目錄下的「主機名.err」文件),導致這個文件越來越大(除非經常做flush log操作)。所以,如果您的event執行很頻繁,可在my.ini中加參數console=TRUE,這樣執行event的信息就不會寫進來了
六、用戶的移植
Oracle的用戶管理和MySQL下有較大區別,請分別建立用戶,並賦予合適的許可權。
七、應用程序的移植
由於語法細節上的差異,導致很多SQL語句需要改寫。筆者記下了所有移植過程中碰到的SQL語句細節差異,這些也是一般項目可能會用到的地方,雖然肯定不全,但也列出來以供參考:
1)Oracle的to_char函數不能再使用,換用如CONCAT(14.3)的形式,為了提高應用程序兼容性,建議手工寫一個
2)Oracle的to_date函數不能再使用,建議手工寫一個添加到MySQL資料庫
3)Oracle的decode函數不能再使用,換用SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END 的形式
4)nvl這樣的一些專用函數,MySQL是沒有的,可以把
select nvl(to_char(num),'nothing') from t_equipment轉換成
select case num when num then num else 'nothing' end from t_equipment
5)instr之類的函數,函數名相同,但參數個數不同
6)Oracle的sysdate要寫成sysdate()的形式
7)包的形式已經取消,所以原來以包的方式調用的過程如xx_pack.xxx要寫成xxx()
8)帶進制字元轉數字
Oracle風格:TO_NUMBER(strTmp,'XX') TO_NUMBER(』9』)
MySQL風格:CONV(strTmp,16,10) CONV(』9』,10,10) 如果字元串前後有加減操作,會隱含轉換成數字
9) 不能再有直接調用序列的形式,如果一定需要,可以模擬實現一個
10)日期直接加減的含義不同了,比如Oracle中sysdate + 1 變成了sysdate() + interval 1 day(注意如果寫成sysdate() + 1 語法還是正確的,但含義是錯誤的)
查詢select sysdate() + 1 from al 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的數
而在Oracle中會得到第二天當前時刻。
11) MySQL單純的date類型只是日期不帶時間,DATETIME或TIMESTAMP帶有時間,用DATE_FORMAT函數可以控制顯示形式
12)select 'abc' || 'd' from al 兩個數據執行的結果不同(語法都能通過),MySQL要寫成select concat('abc' , 'd')的形式
13) Oracle高級功能,如帶有暗示索引的select語句,MySQL是不支持的(語法可以通過)
14)有些MySQL的保留字不能直接用在SQL語句里,要加表名或別名限制,如select RIGHT FROM XX要改成select a.RIGHT FROM XX a
15) Oracle的子查詢可以不起別名,但MySQL是必須的,比如下面的別名aa:
select field1 from (select sysdate() as field1 from al) as aa
16)很多系統表名都是不同的,比如,列出某個表的信息:
select * from tab where TName='T_TEST'改成
select table_name,table_type from information_schema.tables where table_schema = 'user' and table_name=' T_TEST '
17)MySQL下update時不能有本身的子查詢
update T_TEST set Flag = 0 where field1 in
(select distinct b.field1 from T_TEST b where b.flag=1)
18)Oracle下』』和null等價,而MySQL則不然
select 1 from al where '' is null在Oracle下可以取到記錄,在MySQL下不能
al表的使用,substr、trim等函數的主要使用方式和Oracle類似
八、小結和建議
看起來,Oracle移植到MySQL似乎挺麻煩,有沒有一鍵完成的簡單辦法?呵呵,我沒有找到,除非您只使用基本表,只使用基本SQL語句訪問它。當然,建議大家初始設計的時侯,就考慮到多資料庫的支持,權衡一下使用一些高級功能帶來的好處和對可移植性方面帶來的損害,這會大大減少後期移植時面對的問題;另外,在應用架構設計時,也建議使用較好的框架去屏蔽這些差異,比如J2EE的Hibernate框架等。
感謝偉大的Oracle,給我們提供了很多的高級功能,有很多是MySQL沒有的,因此,在移植時你不得不放棄一些非必須的功能,比如,全表cache、物化視圖、函數索引等;如果該功能是必須的,您可能要使用別的方式來實現,或者轉到應用程序層面來考慮。當然,這些功能MySQL今天沒有,不代表明天也沒有,我們可以拭目以待。
由於開源軟體的原因,MySQL的bug或者缺陷有時還會干擾你,請仔細測試和優化您的應用程序,調整MySQL的配置參數,確保它可以運行得和Oracle下一樣好。
(責任編輯:王倩)
6. 如何把oracle的表結構導入mysql
為了生產庫釋放部分資源,需要將API模塊遷移到mysql中,及需要導數據。
嘗試了oracle to mysql工具,遷移時報錯不說,這么大的數據量,用這種簡陋的工具不大可靠。
意外發現平時用的資料庫視圖工具Navicat Premium中有數據遷移工具,意外的好用。這個工具本身支持mysql,oracle,sqlLite,PostgreSql資料庫,因此而也提供了在不同資料庫之間遷移數據的功能。
遷移之前,先確保你建立了這兩個資料庫的connection。選擇Tools/DataTransfer。
7. 如何將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語句並在目標端回放
確認MySQL端表結構已經存在
MySQL資料庫OGG用戶創建
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> grant all on *.* to 'ogg'@'%';
#### 提前創建好ogg存放checkpoint表的資料庫
mysql> create database ogg;
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
#### 切換至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 [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.*;
#### 切換至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
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
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
根據實際存儲數據的長度,對超長的varchar列進行收縮;
對於無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;
- mysql>set global foreign_key_checks=off;
目標端不存在delete語句的記錄,忽略該問題並不記錄到discardfile
目標端丟失update記錄
- 更新的是主鍵值,update轉換成insert
- 更新的鍵值是非主鍵,忽略該問題並不記錄到discardfile
目標端重復insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行
報錯信息
- 2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.
報錯原因
解決辦法
- ## 表示該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').
報錯原因
解決方法
二、遷移方案
(一)環境信息
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資料庫配置
(2)目標端OGG 管理進程(MGR)配置
目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重復執行一次即可,該部分不在贅述
(3)目標端OGG 檢查點日誌表(checkpoint)配置
checkpoint表用來保障一個事務執行完成後,在MySQL資料庫從有一張表記錄當前的日誌回放點,與MySQL復制記錄binlog的GTID或position點類似。
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
(4)目標端OGG 回放線程(replicat)配置
Replicat進程運行在目標端,是數據投遞的最後一站,負責讀取目標端Trail文件中的內容,並將解析其解析為DML語句,然後應用到目標資料庫中。
注意:replicat進程只需配置完成,無需啟動,待全量抽取完成後再啟動。
至此源端環境配置完成
待全量數據抽取完畢後啟動目標端回放進程即可完成數據准實時同步。
3.全量同步配置
全量數據同步為一次性操作,當OGG軟體部署完成及增量抽取進程配置並啟動後,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啟動一個單次運行的replicat回放進程將數據解析並回放至目標資料庫中。
(1)源端OGG 全量抽取進程(extract)配置
(2)目標端OGG 全量回放進程(replicat)配置
三、數據校驗
數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:
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,因此針對這種情況有兩種解決方式:
2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字元集時,最多隻能對varchar(768)的列創建索引;
3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導入時由於各表的插入順序不唯一,可能子表先插入數據而主表還未插入,導致報錯子表依賴的記錄不存在,因此建議數據遷移階段禁用主外鍵約束,待遷移結束後再打開。
(二)全量與增量銜接
HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成後,開啟增量回放進程,應用全量期間的增量數據。使用該參數後增量回放DML語句時主要有以下場景及處理邏輯:
(三)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安全規則
錯誤信息含義源端報錯表示為該抽取進程需要和目標端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標端mgr進行溝通,遠程將目標的replicat進行啟動,由於安全性現在而被拒絕連接。
在Oracle OGG 11版本後,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用
在源端和目標端的mgr節點上分別增加訪問控制規則並重啟
(六)數據抽取方式
根據官方文檔說明,當前直接通過Oracle資料庫抽取數據寫到MySQL這種initial-load方式,不支持LOBs數據類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB欄位,無法進行傳輸,並且該方式不支持超過4k的欄位數據類型
將抽取進程中的RMTTASK改為RMTFILE參數
官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入
8. 怎麼把oracle數據移植到mysql
建議還是使用MySQL官方提供的一套工具,以前分開的幾個軟體工具,目前,已經集成在一個MySQL Workbench (GUI Tools)的一個工具集中。該工具集既有基於GPL使用協議的社區版本,也有基於Commercial License商業許可使用權的標准版本,整個工具中包含了資料庫建模與設計、MySQL程序開發集成環境、資料庫管理工具,還有就是Migration Toolkits工具,用於將其它資料庫源,包含Oralce、SQL Server、DB2、Sybase、PostgreSQL、Access、Excel等等遷移到MySQL的一個工具,按照這個工具要求的幾個步驟,就可以比較輕松的把相關資料庫源的資料庫結構和數據導入到MySQL資料庫系統中,如果涉及到資料庫端的一些程序,如存儲過程、觸發器等,可能還需要手動做一些遷移工作;針對每一種資料庫的遷移,MySQL也都給出了一份技術指導的白皮書,有興趣的朋友可以聯系我。