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连接
此处连接的用户需要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