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; |
select 1; |
3 |
like的用法 |
NAME like 'a%' |
NAME like 'a%' |
4 |
日期格式化 |
獲取系統日期:SYSDATE() |
獲取系統日期:now() |
|
主鍵 |
一般通過Oracle序列生成: |
Auto_increment屬性實現自增獲得唯一值 |
5 |
分頁(常用寫法) |
SELECT T2.* |
SELECT * FROM TEST_TEST1 ORDER BY SID DESC LIMIT 0,4 |
6 |
字符串鏈接 |
SELECT sid || username|| PASSWORD FROM TEST |
SELECT CONCAT(SID , USERNAME, PASSWORD) FROM TEST |
7 |
分組函數 |
SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP; |
SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP; |
8 |
分析函數 |
row_number() over (partition by xx order by xx) |
Mysql不支持 |
9 |
並行 |
支持SQL級別並發處理 |
不支持 |
(3)數據庫對象類型對比:
序號 |
數據庫對象類型 |
ORACLE |
MYSQL |
遷移方案 |
1 |
PROCEDURE |
(1)建存儲過程用create procedure XXX 或 create or replace procedure XXX 兩種語法 |
(1) 建存儲過程只能用create procedure XXX一種語法 |
由於ORACLE跟MYSQL編寫存儲過程的語法差異,需重新修改存儲過程代碼 |
2 |
TRIGGER |
(1)包含DML觸發器、替代觸發器(視圖)、系統觸發器(DDL語句/系統事件) |
(1)只支持DML觸發器 |
由於語法差異以及觸發器功能實現的差異,需修改觸發器代碼 |
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游標 |
(1)只支持靜態游標 |
由於功能上的差距,需修改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的修復往往是耗時最長也是最為重要的一環,各個功能都需要經過全面的測試以及驗證工作,從而避免生出上線后出現的各種問題