设为首页 收藏本站
查看: 2628|回复: 0

[经验分享] MySQL数据库移植到Oracle(迁移),批量重建序列

[复制链接]

尚未签到

发表于 2016-8-6 07:38:12 | 显示全部楼层 |阅读模式
  
  Oracle SQL Developer 3.2
  可以使用Oracle SQL Developer进行迁移,感觉这个工具比较专业。
  他会把表结构创建好,并导入数据,数据类型自动转换,也可手动指定规则。
  MySQL的自增长列,迁移到Oracle后,会建一个序列(sequence),并建一个触发器,模拟自增长。
  (后期不想用触发器可以把他禁用或者删除)
  (另外还可以选择表--复制到Oracle)
  
  Oracle SQL Developer连接MySQL
  http://happyqing.iyunv.com/blog/2159705
  
  移植时会按MySQL数据库的名字建个Oracle用户,移植到这个用户下,但这个用户所用的表空间是默认的,
  我一般是先把MySQL数据库转储成需要的名字,在Oracle建好用户,指定好相应的表空间,再移植
  
  创建一个MySQL连接
  打开连接,选择一个数据库,右键--移植到Oracle
DSC0000.png

DSC0001.png
  
  此处连接的用户需要Connect,Resource,Create View权限
DSC0002.png
 
  名称输入一个名字
  选个输出目录,里边会有日志和执行过的sql文件(移植后需要分析)
DSC0003.png

DSC0004.png

DSC0005.png

DSC0006.png

DSC0007.png
 
DSC0008.png
 
DSC0009.png
 
  移植成功后,在Oracle SQL Developer里查看分析,看有什么问题,
  还要分析生成的日志 
DSC00010.png
 
DSC00011.png
 
  一个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来自于上一个查询结果
DSC00012.png

  (最大值为什么要加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来自于上一个查询结果
   DSC00013.png
  复制到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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253520-1-1.html 上篇帖子: oracle 启动关闭以及监听启动关闭命令 下篇帖子: Oracle_与mysql官方jdbc的一些区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表