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

本文介绍了如何使用Oracle SQL Developer将MySQL数据库移植到Oracle,重点关注了自动增长列的处理,即在Oracle中创建序列和触发器来模拟MySQL的自增功能。迁移后,讨论了如何优化触发器的性能,以及批量重建序列的步骤,包括查询表信息,获取最大值,然后创建新的序列。
摘要由CSDN通过智能技术生成

Oracle SQL Developer 3.2

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

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

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

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

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

Oracle SQL Developer连接MySQL

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

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

创建一个MySQL连接

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

bba1f521debf3a5701cb3e427514913a.png

995b3c2d63ea9016c1bfe9986ceba0a4.png

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

d6f8b7d70bfe9d88170de237d0ae497a.png

名称输入一个名字

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

1ceec642f69bbb369aa1e925666f3097.png

90af80207b807ef59b489e981c647e95.png

ffeed1923eee6e01efe8d8f14176af6f.png

3469a596be64cac92c6cb34ff10bb282.png

bb73f9f97b8af3769a38c9688c8180ea.png

3355e8d52e59db2ac5440e27bb538045.png

4235725553d60c977aef4f37cb675225.png

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

还要分析生成的日志

626f3104707b6ea539947482eed84592.png

f947e79d065f85984c0193dcdb9f3df4.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来自于上一个查询结果

7bb6a751494faaed6aeff6b920688114.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来自于上一个查询结果

c9f8a9e15477d4aac049b5278bd3190e.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数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值