2011年记
需求:公司要求把windows上的mysql数据迁移迁移到AIX中的oracle
准备阶段:
一、备份mysql库到本地例"gs0704"
二、再备份一个用于修改字段类型的库“gs0314”
修改GS0314,用于mysql to oracle的操作
1。删除表内的所有外键
2。检查修改所有表名和字段的长度(ORACLE要求不超过32个字符)
3。修改mysql
例:
表名过长、字段关键字、字段名过长、字段类型text转为varchar(长度根据实际情况定义,如超过4000字节,text不变). bit类型改为bigint
gs_authorizationapply AUDITREMARK为text
gs_bankaccount 名下的account列 定义的长度不够 40以上
gs_combination 列number为关键字。改为number_
gs_confirmInvoiceApplyItem 列number为关键字。改为number_
gs_companyprofessionaevaluation 表名过长 现变为:gs_companyprofessionaevaluatio
gs_customer intro最长有8019个字,只能用text类型 ,"ADDRESS" 的值太大400
GS_CALLCATEGORY"."CONTENT" 的值太大100
# pub_group 中_id,_name去掉'_'
PUB_ORGAN2USER * share 字段在oracle中是关键字。不能使用,现改为share_
# PUB_VIEW_HISTORY * _time改为time,_name 改为name
pub_jobgrade 字段 为关键字 改为level_
pub_permission _order 在表列名改为order_
修改所有的视图
注:oracle 中if 写法:case when (b.status = 1) then 1 else 0 end)
用工具Convert Mysql to Oracle 4.0 得到字段名与长度等问题
4。备份外键脚本
例:gs0314_tables_0712fk.sql
update GS_ADJUSTSTOCKINAPPLY set APPLYUSERID = rtrim(APPLYUSERID );
update GS_ADJUSTSTOCKINAPPLY set AUDITUSERID = rtrim(AUDITUSERID );
update GS_ADJUSTSTOCKINAPPLY set STOCKFORMID = rtrim(STOCKFORMID );
update GS_ADJUSTSTOCKINAPPLY set GIFTID = rtrim(GIFTID );
update GS_ADJUSTSTOCKINAPPLY set ORGANID = rtrim(ORGANID );
update GS_ADJUSTSTOCKINAPPLY set WAREHOUSEID = rtrim(WAREHOUSEID );
commit;
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_4 FOREIGN KEY (APPLYUSERID) REFERENCES PUB_USER (ID);
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_1 FOREIGN KEY (AUDITUSERID) REFERENCES PUB_USER (ID);
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_2 FOREIGN KEY (STOCKFORMID) REFERENCES GS_STOCKFORM (ID);
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_3 FOREIGN KEY (GIFTID) REFERENCES GS_GIFT (ID);
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_5 FOREIGN KEY (ORGANID) REFERENCES PUB_ORGAN (ID);
ALTER TABLE GS_ADJUSTSTOCKINAPPLY ADD CONSTRAINT GS_ADJUSTSTOCKINAPPLY_IBFK_6 FOREIGN KEY (WAREHOUSEID) REFERENCES GS_WAREHOUSE (ID);
(mysql to oracle 可能会出现外键列的值后面多出空格,先清除空格再创建外键)
5。备份索引脚本
例:gs0704_tables_index.sql
CREATE INDEX FKE99298B5C66958A0 ON GS_ADJUSTSTOCKINAPPLY (WAREHOUSEID);
CREATE INDEX FKE99298B58CFCDD5C ON GS_ADJUSTSTOCKINAPPLY (GIFTID );
CREATE INDEX FKE99298B5B23D8FBB ON GS_ADJUSTSTOCKINAPPLY (APPLYUSERID);
CREATE INDEX FKE99298B5C14D53A1 ON GS_ADJUSTSTOCKINAPPLY (ORGANID );
CREATE INDEX FKE99298B54454E268 ON GS_ADJUSTSTOCKINAPPLY (AUDITUSERID);
CREATE INDEX FKE99298B5595C3F2E ON GS_ADJUSTSTOCKINAPPLY (STOCKFORMID);
DROP INDEX IDX_CODEGS_ADJUSTSTOCKINAPPLY;
CREATE UNIQUE INDEX IDX_CODEGS_ADJUSTSTOCKINAPPLY ON GS_ADJUSTSTOCKINAPPLY (CODE);
COMMIT;
6。备份mysql数据增量处理脚本
例:mysql数据增量处理脚本.sql
select 'this table is gs_adjuststockinapply';
#
# data for the `gs_adjuststockinapply` table (limit 0,500)
#
truncate table gs0314.gs_adjuststockinapply;
insert into gs0314.gs_adjuststockinapply select * from gs0704.gs_adjuststockinapply;
commit;
清除所有数据再重新导入
或 根据修改标识再更新数据
create table tmp as select b.id as id from gs0704.gs_assert2user a
left join gs0314.gs_assert2user b on a.id= b.id
where a.id is null or a.effectiveDate > b.effectiveDate;
delete from gs0314.gs_assert2user where id in(select * from tmp);
drop table tmp;
insert into gs0314.gs_assert2user
select a.* from gs0704.gs_assert2user a
left join gs0314.gs_assert2user b on a.id = b.id
where b.id is null or a.effectiveDate > b.effectiveDate;
commit;
7。备份库(0314)与测试库(0704)记录数比对脚本
例:备份库与测试库记录数比对脚本.sql
truncate table gs0314.tempnum;
insert into gs0314.tempnum select (select count(*) as 0314num from gs0314.gs_adjuststockinapply ), ( select count(*) as 0704num from gs0704.gs_adjuststockinapply ),'gs_adjuststockinapply ';
insert into gs0314.tempnum select (select count(*) as 0314num from gs0314.gs_assert2user ), ( select count(*) as 0704num from gs0704.gs_assert2user ),'gs_assert2user ';
写入所有的表,创建对比表“tempnum”.对比完成无误后删除。
8。备份序列
例:oracle序列脚本.sql
-- Create sequence
create sequence GS_BUDGETAMOUNT_0
minvalue 1
maxvalue 9999999999999999999999999999
start with 2259
increment by 1
nocache
order;
在mysql to oracle 后 检查mysql中的自增长 列 与oracle中序列的配
三、创建ORALCE 表空间 与用户
例:
创建表空间-
CREATE TABLESPACE gs0704 DATAFILE '/oradata/data/gs/gs0704.dbf' size 50m autoextend on next 50m maxsize 20480m extent management local;
创建用户-
create user gs identified by gstemp123 default tablespace gs0704;
分配权限-
grant dba to gs0704; --授权为管理员角色
grant connect,resource to gs0704;
开始对比迁移
四、同步数据库
锁定正式库。用mysql工具 把mysql正式库 同步到 本机备份库
记录表和列 修改的地方。再本地to oracle的修改库上进行修改。
同时修改对应的脚本,比如外键、索引、增量等脚本。
五、本地mysql备份库与to oracle修改库 进行数据增量同步
执行 mysql数据增量处理脚本.sql 脚本
如报错,说明列或表 不对应。如 (四、同步数据库)
六、核查数据是否成功同步
执行 备份库与测试库记录数比对脚本.sql
查看tempnum表,确认记录数是否一致。
七、利用工具进行mysql to oracle的迁移
现在用的工具为:Convert Mysql to Oracle 4.0 (具体过程 网上有教程)
完成后,查看提示信息。如有错误进行对应的修改。
mysql to oracle 到目前为止,mysql方面完成。
八、对比mysql 与 oracle记录数
oracle 查看所有表的记录数 :
select t.table_name,t.num_rows from user_tables t order by t.table_name
如有表不对应,最后对此表进行 重置同步数据。
九、修改oacle中的BLOB数据问题
mysql to oracle 工具,遇到text类型 会 转为 BLOB类型,如果要转为CLOB类型 方法如下:
例:oracle BLOB to CLOB脚本.sql
十、检查修改oracle中的外键
执行:gs0314_tables_0712fk.sql 脚本
如报:外键已存在,不用管,说明oracle已创建。注意其它的错误。
十一、检查修改oracle的索引
执行:gs0704_tables_index.sql 脚本
如报:索引已存在,不用管,说明oracle已创建。注意其它的错误。
十二、检查对比序列(mysql中的自增长)
查看:oracle序列脚本.sql
确认所有的自增长列都有对应的序列
十三、加入视图
手工修改mysql的视图(部份语法不同),加入到oracle库中。
OK,完成。。更改业务系统JDBC连接。
注:修改PO映射时的 类型,例:CLOB等