ORACLE數據庫遷移至MYSQL方案(2015年)


 ORACLE和MYSQL作為兩款使用最廣泛的關系型數據庫軟件,在各項功能上以及編程語法上還是存在很大的差異的,因此要實現將系統從ORACLE遷移至MYSQL數據庫上,數據的遷移僅僅是一方面,最大的挑戰在於代碼層面的改動,整個遷移的大致工作如下:

 

1、ORACLE與MYSQL功能上的區別:

 

(1)字段類型的對比:

序號

ORACLE

MYSQL

1

VARCHAR2

VARCHAR

2

DATE

DATETIME

3

TIMESTAMP

DATETIME

4

NUMBER

DECIMAL

5

INTEGER

DECIMAL(22,0)

6

CLOB

TEXT

7

BLOB

LONGBLOB

 

 

(2)常用功能語法上的對比:

序號

對比項

ORACLE

MYSQL

1

空字符的判斷

NAME IS NULL

NAME=' '

2

from

select 1 from dual;
from后邊接表名

select 1;
from不是必須的,且無需接表名

3

like的用法

NAME like 'a%'
大小寫敏感,只查詢以小寫字母a開頭的字符串

NAME like 'a%'
大小寫不敏感,查詢以小寫字母a或大寫字母A開頭的字符串

4

日期格式化

獲取系統日期:SYSDATE()
格式化日期:TO_CHAR、TO_DATE函數

獲取系統日期:now()
格式化日期:str_to_date、date_format函數

 

主鍵

一般通過Oracle序列生成:
SEQ_TEST.NEXTVAL
SEQ_TEST.CURRVAL

Auto_increment屬性實現自增獲得唯一值

5

分頁(常用寫法)

SELECT T2.*
FROM (SELECT T1.*, ROWNUM RN FROM (SELECT * FROM TEST ORDER BY SID DESC) T1
WHERE ROWNUM < 5) T2
 WHERE RN >= 1

SELECT * FROM TEST_TEST1 ORDER BY SID DESC LIMIT 0,4

6

字符串鏈接

SELECT sid || username|| PASSWORD FROM TEST
SELECT concat(concat(sid , username), password) FROM TEST

SELECT CONCAT(SID , USERNAME, PASSWORD) FROM TEST

7

分組函數

SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP;
以上SQL不能正常執行,select后面的列必須是分組的列或者是用了聚合函數的列

SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP;

隨便分組都可以

8

分析函數

row_number() over (partition by xx order by xx)
rank() over (partition by xx order by xx)
dense_rank() over (partition by xx order by xx)
count(1) over()

Mysql不支持

9

並行

支持SQL級別並發處理

不支持

 

 

 

(3)數據庫對象類型對比:

序號

數據庫對象類型

ORACLE

MYSQL

遷移方案

1

PROCEDURE

(1)建存儲過程用create procedure XXX 或 create or replace procedure  XXX 兩種語法
(2)存儲過程參數不能指定精度或長度,如P_NAME VARCHAR2
(3)參數后必須要有IS或AS
(4)存儲過程沒有參數時()必須省略
(5)變量定義在is和begin之間

(1) 建存儲過程只能用create procedure XXX一種語法
(2) 存儲過程參數必須指定精度或長度,如P_NAME VARCHAR(100)
(3) 參數后不能有IS或AS
(4) 存儲過程沒有參數時必須保留()
(5) 變量定義在begin和end之間

由於ORACLE跟MYSQL編寫存儲過程的語法差異,需重新修改存儲過程代碼

2

TRIGGER

(1)包含DML觸發器、替代觸發器(視圖)、系統觸發器(DDL語句/系統事件)
(2)支持語句級觸發器和行級觸發器
(3)一個觸發器允許定義多個事件

(1)只支持DML觸發器
(2)只支持行級觸發器
(3)一個觸發器只允許定義一個事件

由於語法差異以及觸發器功能實現的差異,需修改觸發器代碼

3

FUNCTION

支持

支持

設計到語法差距以及內置函數的差別需重新改寫代碼

4

PACKAGE

支持

不支持

需將PACKAGE使用存儲過程替換

5

VIEW

支持

支持

如涉及到使用MYSQL不支持的內置函數需轉換

6

Materialized view

支持

不支持

采用視圖替換或者修改代碼直接方案基表方式

7

JOB

支持比較完善

支持比較簡單

按需修改

8

DBLINK

支持

可使用FEDERATED引擎實現dblink訪問功能,需修改程序代碼

9

SEQUENCE

支持

可使用MYSQL自增列實現序列功能,需修改表結構添加自增列

10

SYNONYMS

支持

需修改程序代碼直接訪問物理表

11

CURSOR

(1)靜態游標(隱式游標,顯示游標)、ref游標
(2)支持loop循環、while循環、for循環
(3)支持記錄變量
(4)支持bulk collection語法批量操作

(1)只支持靜態游標
(2)支持loop循環、repeat循環、while循環
(3)不支持記錄變量
(4)只能單條操作

由於功能上的差距,需修改CURSOR代碼

 

2、程序代碼上的改動:

(1)前台代碼改動:

   由於前台代碼均采用標准的SQL編寫,需要改動的內容相對較少,主要考慮MYSQL內置函數的差異上需要改動,需梳理前台代碼。

(2)后台代碼改動:

   由於涉及不同數據庫在功能上以及編程語法上的差距,因此后台代碼的改動將非常大,包括數據類型的差異、對象類型的差異、編程語法上的差異等等,整個后台的代碼幾乎相當於重新編寫,工作量非常巨大,經過調查,針對我們目前的數據庫,有如下部分數據對象需要修改:

 

附表格:

OWNER

OBJECT_TYPE

數量

整改措施

QHIEX_PROD

PACKAGE

4

需將PACKAGE使用存儲過程替換

QHIEX_PROD

PROCEDURE

1

由於ORACLE跟MYSQL編寫存儲過程的語法差異,需重新修改存儲過程代碼

QHIEX_PROD

SEQUENCE

155

可使用MYSQL自增列實現序列功能,需修改表結構添加自增列

QHIEX

SEQUENCE

98

可使用MYSQL自增列實現序列功能,需修改表結構添加自增列

 

3、ORACLE數據遷移至MYSQL

(1)字段類型的調整:

   數據遷移主要需要注意的地方在於字段類型支持的差異上,比如ORACLE常用的VARCHAR2類型以及CLOB類型在MYSQL中都不存在,因此我們需要稍微調整下字段類型,針對我們數據庫目前的現狀,有如下字段類型需要修改:

 

附表:

DATA_TYPE

COUNT(*)

整改措施

VARCHAR2

3194

使用MYSQL VARCHAR類型替代

NUMBER

1522

使用MYSQL DECIMAL類型替代

DATE

776

使用MYSQL DATETIME類型替代

CHAR

544

無需整改

CLOB

89

使用MYSQL TEXT類型替代

NVARCHAR2

34

使用MYSQL VARCHAR類型替代

TIMESTAMP(6)

16

使用MYSQL DATETIME類型替代

BLOB

12

使用MYSQL LONGBLOB類型替代

FLOAT

6

無需整改

LONG RAW

4

使用MYSQL LONGTEXT類型替代

LONG

2

使用MYSQL LONGTEXT類型替代

 

(2)數據遷移:

   目前MYSQL官方發布了一個將數據由SQL Server或Oracle中移植到MySQL中的工具包MySQLMigration Toolkit,該工具支持LOB字段數據的遷移,由於個創數據庫目前的數據量相對較少,數據量目前統計將近17G左右,可以在停機的狀態下使用該工具進行數據遷移,經過統計,目前個創數據庫的表清單數量以及數據量分布如下:

 

附表:

OWNER

數量

數據量

QHIEX_PROD

357

6.7G

QHIEX

162

10G

 

 

4、系統測試(包括數據遷移的測試)

   程序經過大量的修改后,測試以及BUG的修復往往是耗時最長也是最為重要的一環,各個功能都需要經過全面的測試以及驗證工作,從而避免生出上線后出現的各種問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM