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的修复往往是耗时最长也是最为重要的一环,各个功能都需要经过全面的测试以及验证工作,从而避免生出上线后出现的各种问题