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