1.下載navicat Premium
2.選中工具
3.點開工具>數據傳輸(源為傳送數據庫連接名字,數據庫名字,目標為接收數據連接名字,數據庫名字)
4.填好點擊下一步后,點擊開始,顯示finally success,表明名倒入成功
5.視圖導入
Oracle視圖和MySQL視圖不同,前者多用視圖嵌套子查詢,而其剛好時MySQL不支持的,需要將視圖子查詢改為視圖嵌套視圖,,如:
create view v_student as select * from (select * from t_student) t;
ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause
解決方法,view的嵌套:
create view v_tea_stu as select * from t_student;
Query OK, 0 rows affected (0.02 sec)
create view v_student as select * from v_tea_stu;
Query OK, 0 rows affected (0.00 sec)
6、Trigger、存儲過程、package
1)Oracle創建觸發器時允許or,MySQL不允許。所以遷移時如果有需要寫兩個。
2)兩種數據庫定義變量的位置不同,而且MySQL里不支持%type。這個在Oracle中用得比較頻繁。
3)elseif的邏輯分支語法不同,並且MySQL里沒有for循環。
4)在MySQL中不可以返回cursor,並且聲明時就要賦對象。
5)Oracle用包來把存儲過程分門別類,且在package里可以定義公共的變量/類型,既方便了編程,又減少了服務器的編譯開銷。可MySQL里根本沒有這個概念。所以MySQL的函數也不可以重載。
6)預定義函數。MySQL里沒有to_char() to_date()之類的函數,也並不是所有的Oracle都是好的,就像substring()和load_file()這樣的函數,MySQL有,Oracle卻沒有。
7)MySQL里可以使用set和=號給變量賦值,但不可以使用:=。 而且在MySQL里沒 || 來拼接字符串。
8)MySQL的注釋必須要求-- 和內容之間有一個空格。
9)MySQL存儲過程中只能使用leave退出當前存儲過程,不可以使用return。
10)MySQL異常對象不同,MySQL同樣的可以定義和處理異常,但對象名字不一樣。
7、分頁語句
MySQL中使用的是limit關鍵字,但在Oracle中使用的是rownum關鍵字。所以每有的和分頁相關的語句都要進行調整。
8、JOIN
如果你的SQL里有大量的(+),這絕對是一個很頭疼的問題。需要改寫。
9、group by語句
Oracle里在查詢字段出現的列一定要出現在group by后面,而MySQL里卻不用。只是這樣出來的結果可能並不是預期的結果。造成MySQL這種奇怪的特性的歸因於sql_mode的設置,一會會詳細說一下sql_mode。不過從Oracle遷移到MySQL的過程中,group by語句不會有跑不通的情況,反過來遷移可能就需要很長的時間來調整了。
10、bitmap位圖索引
在Oracle里可以利用bitmap來實現布隆過濾,進行一些查詢的優化,同時這一特性也為Oracle一些數據倉庫相關的操作提供了很好的支持,但在MySQL里沒有這種索引,所以以前在Oracle里利於bitmap進行優化的SQL可能在MySQL會有很大的性能問題。
目前也沒有什么較好的解決方案,可以嘗試着建btree的索引看是否能解決問題。要求MySQL提供bitmap索引在MySQL的bug庫里被人當作一個中級的問題提交了上去,不過至今還是沒有解決。
11、分區表(Partitioned table)
需要特殊處理,與Oracle的做法不同,MySQL會將分區鍵視作主鍵和唯一鍵的一部分。為確保不對應用邏輯和查詢產生影響,必須用恰當的分區鍵重新定義目標架構。
12、角色
MySQL8.0以前也沒有role的對象。在遷移過程中如果遇到的角色則是需要拼SQL來重新賦權。不過MySQL更好的一點是MySQL的用戶與主機有關。
13、表情和特殊字符
在Oracle里我們一般都選擇AL32UTF8的字符集,已經可以支付生僻字和emoji的表情了,因為在遷移的時候有的表包含了大量的表情字符,在MySQL里設置了為utf8卻不行,導過去之后所有的都是問號,后來改成了utf8mb4才解決問題,所以推薦默認就把所有的DB都裝成utf8mb4吧。
14.數據檢驗
可以通過count(*)查詢總條數,也可以通果etl工具校驗