Oracle SQL Developer 3.2
可以使用Oracle SQL Developer进行迁移,感觉这个工具比较专业。
他会把表结构创建好,并导入数据,数据类型自动转换,也可手动指定规则。
MySQL的自增长列,迁移到Oracle后,会建一个序列(sequence),并建一个触发器,模拟自增长。
(后期不想用触发器可以把他禁用或者删除)
(另外还可以选择表--复制到Oracle)
Oracle SQL Developer连接MySQL
移植时会按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数据库