MySQL数据库移植到Oracle(迁移),批量重建序列

45 篇文章 1 订阅

 

Oracle SQL Developer 3.2

可以使用Oracle SQL Developer进行迁移,感觉这个工具比较专业。

他会把表结构创建好,并导入数据,数据类型自动转换,也可手动指定规则。

MySQL的自增长列,迁移到Oracle后,会建一个序列(sequence),并建一个触发器,模拟自增长。

(后期不想用触发器可以把他禁用或者删除)

(另外还可以选择表--复制到Oracle)

 

Oracle SQL Developer连接MySQL

http://happyqing.iteye.com/blog/2159705

 

移植时会按MySQL数据库的名字建个Oracle用户,移植到这个用户下,但这个用户所用的表空间是默认的,

我一般是先把MySQL数据库转储成需要的名字,在Oracle建好用户,指定好相应的表空间,再移植

 

创建一个MySQL连接

打开连接,选择一个数据库,右键--移植到Oracle


 

此处连接的用户需要Connect,Resource,Create View权限


 

名称输入一个名字

选个输出目录,里边会有日志和执行过的sql文件(移植后需要分析)









 

 

 

移植成功后,在Oracle SQL Developer里查看分析,看有什么问题,

还要分析生成的日志 

 

 

一个MySQL文件转储为SQL文件1M多,移植需要10分钟左右。

 

有一些中间表可能是移植时建的,删除

drop table MD_ADDITIONAL_PROPERTIES;
drop table MD_APPLICATIONFILES;
drop table MD_APPLICATIONS;
drop table MD_CATALOGS;
drop table MD_COLUMNS;
drop table MD_CONNECTIONS;
drop table MD_CONSTRAINTS;
drop table MD_CONSTRAINT_DETAILS;
drop table MD_DERIVATIVES;
drop table MD_FILE_ARTIFACTS;
drop table MD_GROUPS;
drop table MD_GROUP_MEMBERS;
drop table MD_GROUP_PRIVILEGES;
drop table MD_INDEXES;
drop table MD_INDEX_DETAILS;
drop table MD_MIGR_DEPENDENCY;
drop table MD_MIGR_PARAMETER;
drop table MD_MIGR_WEAKDEP;
drop table MD_NUMROW$SOURCE;
drop table MD_NUMROW$TARGET;
drop table MD_OTHER_OBJECTS;
drop table MD_PACKAGES;
drop table MD_PARTITIONS;
drop table MD_PRIVILEGES;
drop table MD_PROJECTS;
drop table MD_REGISTRY;
drop table MD_REPOVERSIONS;
drop table MD_SCHEMAS;
drop table MD_SEQUENCES;
drop table MD_STORED_PROGRAMS;
drop table MD_SYNONYMS;
drop table MD_TABLES;
drop table MD_TABLESPACES;
drop table MD_TRIGGERS;
drop table MD_USERS;
drop table MD_USER_DEFINED_DATA_TYPES;
drop table MD_USER_PRIVILEGES;
drop table MD_VIEWS;
drop table MIGRATION_RESERVED_WORDS;
drop table MIGRLOG;
drop table MIGR_DATATYPE_TRANSFORM_MAP;
drop table MIGR_DATATYPE_TRANSFORM_RULE;
drop table MIGR_GENERATION_ORDER;
drop table STAGE_MIGRLOG;

--清空回收站
--purge recyclebin;

drop SEQUENCE DBOBJECTID_SEQUENCE

 

问题

1.移植工具建的触发器,可能会影响效率,可以禁用或删除

2移植工具建的序列名是 表名+主键列名+SEQ

由于Oracle的命名规范是30个字符,我觉得以上命名方法太长了,好多都被截断了,

我想采用 表名+_S的命名方式。

3.我不想用触发器,让序列的起始值"等于"表中的ID的最大值

 

后续操作

1.禁用所有触发器

2.删掉所有序列

3.重建序列

 

批量重建序列

我采用查询出结果集,利用Excel拼接SQL的方式,我觉得这个比写个存储过程简单(明了)

 

一、查询表名,主键名,主键数据类型

查询出表名,主键名,就可以拼接查询表的主键列的最大值的SQL了

由于是从mysql导过来的,主键都是1个列,自增长的列都是数字型,varchar型的不用建序列

--查询表名,主键名,主键数据类型
select cu.*,
(select data_type from user_tab_columns c where c.TABLE_NAME=cu.TABLE_NAME and c.COLUMN_NAME = cu.COLUMN_NAME ) as data_type
 from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' 
 --and au.table_name = 'TABLE_NAME'
order by data_type;
--order by cu.table_name;

   用PL/SQL执行,结果集 全选 与标题一起复制到excel

 

相关:

--改触发器的名字
rename ADVISORY_ADVISORY_ID_SEQ to ADVISORY_SEQ

--查询用户的序列
select * from user_sequences order by sequence_name;

--查询用户的表
select * from user_tables order by table_name;

select * from user_cons_columns
select * from user_constraints
select * from user_tab_columns 

 

二、查询表的主键列的最大值

此处的COLUMN_NAME,TABLE_NAME来自于上一个查询结果

(最大值为什么要加1,是为了查询序列的下一个值正好是最大值的下一个值)

复制到UE,把制表符(不是空格)换成空

select nvl(max( TABLE1_ID),0)+1 as MAX_ID from TABLE1 union all
select nvl(max( TABLE2_ID),0)+1 as MAX_ID from TABLE2 ;

 

三、新建序列

此处的MAX_ID来自于上一个查询结果

复制到UE,把制表符(不是空格)换成空

create sequence TABLE1_S minvalue 1 nomaxvalue start with 1 increment by 1 cache 20;

create sequence TABLE2_S minvalue 1 nomaxvalue start with 27 increment by 1 cache 20;

 

参考:

MYSQL数据库迁移到ORACLE数据库

http://blog.csdn.net/wwwzys/article/details/8813503

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值