数据库迁移教程之SQLServer到Oracle

前置知识

SQL Server

SQL Server数据库是微软官方出品的一款数据库,官方指定的数据库连接工具为Microsoft SQL Server Management Studio xx(简称SSMS,xx为版本代码,如11、12、13等),界面如下图。
SSMS index

Oracle

Oracle数据库为甲骨文公司出品的数据库,官方指定的数据库连接工具为sql developer,界面如下图。
sql developer index

可选方案

方案一:由SSMS提供的导出工具

工具入口

登录SQL Server数据库后,右键想要导出的数据库。
SSMS export

导出流程

选择要导出的数据源配置:
SSMS export datasource config 1

选择要导入的数据源配置:
SSMS export datasource config 2

SSMS export error

接下来的流程我没有在电脑上成功执行,报错如上图
经过多种方法尝试后我放弃了这个方案,如果读者没有在这里报错的话可以继续执行后续流程

后续流程来自于该文章:【SQLServer】sqlserver数据库导入oracle,仅供参考。
SSMS export config 1

SSMS export config 2

SSMS export config 3

SSMS export config 4

SSMS export config 5

SSMS export config 6

SSMS export config 7

方案二:由sql developer提供的工具

参考文章:通过Oracle sql developer从sqlserver迁移数据到oracle

前置工作

1.设置驱动

向sql server中新增第三方连接驱动,用于连接SQL Server数据库。
sql developer config

2.连接SQL Server数据库

如果驱动被成功识别,在新建连接的时候应该会有SQLServer的选项。
(没有的话可尝试重启软件)
sql developer connection

3.连接Oracle数据库

情况1:
如果Oracle数据库版本低于12c,按照正常方式连接Oracle数据库即可。

情况2:
当Oracle数据库版本大于12c的时候,需要注意的是迁移到的库应当在pdb库中,不应该在cdb库。所以新建Oracle数据库连接时应当连接pdb库中的账户。
如果你不知道cdb与pdb的区别,可以查看官方文档
如果你不知道如何创建pdb数据库,可查看参考文章:创建可插拔数据库PDB
因为需要将SQLServer库中的内容迁移到一个Oracle中一个全新的库中,所以需要先创建表空间和用户。

## 切换至pdb库中,使用dba用户执行
## 创建pdb2_admin表空间及用户

create  BIGFILE tablespace pdb2_admin 
datafile 'E:/H/Oracle/data_folder/pdb2_admin.dbf' size 1024m 
autoextend on next 1024m maxsize unlimited;

drop user pdb2_admin cascade;
create user pdb2_admin identified by pdb2_admin 
default tablespace pdb2_admin;
grant connect,resource,dba to pdb2_admin;

到此,已经创建了pdb库、pdb库的pdb2_admin用户,可以正式创建数据库连接了。
sql developer connection

导入流程

右键SQLServer数据库,找到“迁移到Oracle”选项。
sql developer import 1
sql developer import 2&3
sql developer import 4&5
sql developer import 6
sql developer import 7
sql developer import 8
sql developer import 9

点击完成之后就开始执行迁移任务了。

迁移结果确认

迁移任务执行结果的日志在你设定的“迁移临时文件夹中”,类似于:
sql developer import result folder

迁移完毕之后会创建跟SQLServer源库同名的用户账户,在日志的考前的位置中可以看到账户的名称及密码信息:
sql developer import result

假如你看到的是 “创建用户失败”等字样,那么大概率你是在cdb库中进行的迁移工作,请回到前置工作的步骤3尝试重新设置Oracle数据库连接。

迁移结果的确认是重点,你需要分析日志,查看哪些语句执行失败。
首先登录生成的新用户,如果登录失败,请检查账户锁定情况及密码过期情况。

– 查看用户信息
SELECT * FROM dba_users;
– 解锁用户
ALTER USER asrs_wms ACCOUNT UNLOCK;
– 修改用户密码
ALTER USER asrs_wms identified by asrs_wms;

常见迁移问题

根据迁移工具及数据库版本的不同,最终迁移生成的Oracle库表可能会存在以下问题。

字段类型转换异常

如:create_time本是datetime类型,转换失败后可能识别为varchar类型

排查方案

使用如下sql语句查看可能存在问题的表字段数据。

SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%TIME%';

解决方案

解除对应字段的非空限制,清空字段数据,修改字段类型为date,赋值(可选)

字段长度异常

如:nvarchar(4000)超出了Oracle中varchar2类型的最大长度2000,会导致转换失败。

排查方案

查看转换日志或手动对比迁移表差异,定位到未成功转换的表。

解决方案

可以的话,暂时修改源数据表中的字段类型至nvarchar(2000),然后重新执行转换。

已有数据自增主键异常

源表中的主键可能存在自增设置,在转换为Oracle表时会生成唯一约束和自增序列,然而自增序列的初始值可能并不是表数据中“最大主键的下一位”,这会导致程序在新增数据时出现“违反唯一约束条件”的错误。

排查方案

对存在数据的表的主键进行检查,通过如下语句查询一次下一个主键的生成值,确保生成值大于已有主键的最大值。

select 序列名.nextval from dual;

解决方案

方法1:修改步长快速增加序列值到想要的数值。

-- 如已有主键为20000+,序列值为100,可通过临时修改步长
alter sequence 序列名 increment by 20000;
-- 执行一次取值,此时取出的值应当为:20100
select 序列名.nextval from dual;
-- 修改成功后恢复步长为1
alter sequence 序列名 increment by 1;

但这种方法可能会出现“禁止修改”的错误,此时可以尝试方法2。

方法2:修改表主键中对应序列的初始值。
此方法通过DataGrip实现,流程如下图。
datagrip modify table

datagrip alter key seq starting number

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值