场景:mysql 数据库转移到oracle中去,存在数据库类型的差别,还有主键id自增长的不同,如果要手动完成这个事情,工作量大,容易出错 我们借助 SQL Developer
迁移说明: 实现的功能是把mysql上的库迁移到oracle,准备好mysql登陆帐户,在oracle上新建一个用户,这个用户不是用来保存你迁移的数据,而做迁移工作用的,理解成迁移工作的配置 ,迁移后的数据会在oracel的其它用户里,比如你mysql下面有两个库A和B ,那迁移到oracle后,在oracle下会自动新建两个用户A和B(密码是小写的,和用户名相同),数据就在这两个用户下。
1. 准备工作:
- SQL Developer
- mysql的java驱动包
- JDK — SQL Developer需要java运行环境
注:如果你本地电脑上安装了oracle,则不用重新下载了,直接使用已安装的
2. 添加驱动:
- 下载好mysql驱动包并解压出来,打开SQL Developer , 工具–首选项–数据库–第三方jdbc驱动程序 , 点击”添加条目” 选择刚才解压开的jar包并确认。
QQ五笔截图未命名1.png
QQ五笔截图未命名2.png
QQ五笔截图未命名3.png
QQ五笔截图未命名4.png
3. 新建oracle用户:
- 这个新建的用户是用来保存迁移时要用到的配置文件,不是用来保存迁移后的数据 ,其实就是相当于临时用户,迁移完了后你删除此用户也可以。
-- 这里ora_tmp可以为任意名字,反正也只是拿来做迁移配置用的
create user pluxx identified by pluxx ;
-- grant connect,resource to pluxx ;
-- 这里权限要给所有,不然迁移过程可能会失败
grant ALL PRIVILEGES to pluxx ;
4. 使用SQL Developer 新建数据库连接:
- 新建一个oracle连接 (这个用户就是刚才新建的那个)
image.png 新建一个mysql连接
image.png
- 注意:下图中我新建了两个连接,bbd开头的是mysql连接,也是我要迁移的那个库,plu开头的是oracle连接,用于保存迁移配置
QQ五笔截图未命名5.png
5. 初始化oracle连接中的配置用户(plu开头):
选中oracle的连接,右键 移植资料档案库–删除移植资料档案库
QQ五笔截图未命名6.png
QQ五笔截图未命名7.png
6. 准备迁移
选中oracle连接 ,点击工具档 工具–移植–移植 。接下来的步骤看图操作
QQ五笔截图未命名8.png
QQ五笔截图未命名9.png
QQ五笔截图未命名10.png
QQ五笔截图未命名11.png
QQ五笔截图未命名12.png
QQ五笔截图未命名13.png
QQ五笔截图未命名14.png
QQ五笔截图未命名15.png
QQ五笔截图未命名16.png
QQ五笔截图未命名17.png
QQ五笔截图未命名18.png
QQ五笔截图未命名19.png
QQ五笔截图未命名20.png
QQ五笔截图未命名21.png
7. 验证迁移结果
select username,default_tablespace from dba_users ;
QQ五笔截图未命名22.png
8. 错误处理
- 执行第二步报错
执行脚本时出现 SQL 错误。 尝试在创建资料档案库之前删除资料档案库。
image.png
- 如果点
确定
,继续操作后面的步骤,到最后一步又会报错ORA-01400: 无法将NULL 插入 ("XXX"."MD_PROJECTS"."ID")
image.png - 原因是权限不够,解决方法是给oracle用户增加所有权限
grant ALL PRIVILEGES to 用户名 ;
可以看第3步操作
- 如果迁移后,
oracle
数据库这边表的comment
乱码,先按PL/SQL乱码解决方法设置好oracle
客户端和服务端的编码 ,
- 打开
sql developer
, 修改tools - preferences - Environment
下的encoding
(和数据库统一,如果是utf-8
就选择utf8
,选择utf-8
好像中文还是会出现一小部分乱码)
image.png - 设置搜索
import
, 把下图两个地方修改 (和数据库统一,这里用utf8
)
image.png
image.png
然后完成以上处理后再重新迁移一次,如果还是乱码,就重迁移一次,选择脱机处理吧 -
第8步
和第9步
选择脱机
,其它步骤不变,
image.png
image.png - 完成后会根据你设置的目录生成
sql
, 只是表结构
image.png
image.png - 文本编辑器检查一下
master.sql
里面的中文是不是乱码,如果不是,继续看,如果还是乱码,就跳过这部分内容吧 - 用
sql developer
打开这个master.sql
,然后点运行脚本的图标
image.png - 运行过程中会叫你选择一个连接,此时选择
oracle
的连接,这样就会新建用户并把表建在里面,mysql
的一个库对应oracle
的一个用户,建用户时会提示输入密码,你设置一个即可,直到运行完成。
以上就是迁移的全部流程
迁移后的数据会在oracle的新用户下,用户名对应mysql中的数据库名,密码和用户名一样(这个是小写的) ,如果要把数据从mysql迁移到oracle的指定用户名下,可以先按以上流程迁移数据,然后再把数据导入指定的用户名下。
-- 这里的用户名对应mysql中的库名 ,默认是导出数据和结构,只导出表结构加上 rows=n
exp 用户名/密码@orcl file=e:/ma.dmp log=e:/ma.log owner=用户名;
-- 导出 record结尾的表
exp 用户名/密码@orcl file=e:/ma.dmp log=e:/ma.log tables=(%record);
-- 把上面导出的数据重新导入指定用户下
imp 指定的用户名/密码@orcl file=e:/ma.dmp log=e:/ma_imp.log full=y ;
mysql 中每个有表最好保存一条以上的数据,最好不要有空表 ,如果msyql有空表,迁移到oracle后也是空表,这时使用exp导出dmp文件时不会导出空表,处理麻烦,万一你遇到,轻松解决oracle11g 空表不能 exp 导出 的问题。
最终效果: mysql用户userA下有两个库db1和db2 。迁移oracle后,变成用户db1和db2 , 这两个用户下分别保存着db1和db2的数据。
注意:
- 如果导出时出现如下错误 , 则要给用户加上权限
grant exp_full_database to 用户名
EXP-00032: Non-DBAs may not export other users
EXP-00000: Export terminated unsuccessfully
- 如果导入时也出现类似错误 , 则要给用户加上权限 `grant imp_full_database to 用户名
附:
-- 创建新用户
create user 用户名 identified by 密码;
-- 赋给用户基本权限
grant connect,resource to 用户名;
-- 赋给用户所有权限
grant all PRIVILEGES from 用户名;
-- 收回用户所有权限
revoke all PRIVILEGES from 用户名;
-- 删除用户,会删除用户的所有数据
drop user 用户名 cascade ;
- 常用的系统权限集合有以下三个:
CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理)- 常用的数据对象权限有以下五个:
ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名,
DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名
- CONNECT角色: –是授予最终用户的典型权利,最基本的
ALTER SESSION –修改会话
CREATE CLUSTER –建立聚簇
CREATE DATABASE LINK –建立数据库链接
CREATE SEQUENCE –建立序列
CREATE SESSION –建立会话
CREATE SYNONYM –建立同义词
CREATE VIEW –建立视图
- RESOURCE角色: –是授予开发人员的
CREATE CLUSTER –建立聚簇
CREATE PROCEDURE –建立过程
CREATE SEQUENCE –建立序列
CREATE TABLE –建表
CREATE TRIGGER –建立触发器
CREATE TYPE –建立类型