天天看點

oracle資料遷移到MySQL方案_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的修複往往是耗時最長也是最為重要的一環,各個功能都需要經過全面的測試以及驗證工作,進而避免生出上線後出現的各種問題