前置知识
SQL Server
SQL Server数据库是微软官方出品的一款数据库,官方指定的数据库连接工具为Microsoft SQL Server Management Studio xx
(简称SSMS,xx为版本代码,如11、12、13等),界面如下图。
Oracle
Oracle数据库为甲骨文公司出品的数据库,官方指定的数据库连接工具为sql developer
,界面如下图。
可选方案
方案一:由SSMS提供的导出工具
工具入口
登录SQL Server数据库后,右键想要导出的数据库。
导出流程
选择要导出的数据源配置:
选择要导入的数据源配置:
接下来的流程我没有在电脑上成功执行,报错如上图
经过多种方法尝试后我放弃了这个方案,如果读者没有在这里报错的话可以继续执行后续流程
后续流程来自于该文章:【SQLServer】sqlserver数据库导入oracle,仅供参考。
方案二:由sql developer提供的工具
参考文章:通过Oracle sql developer从sqlserver迁移数据到oracle
前置工作
1.设置驱动
向sql server中新增第三方连接驱动,用于连接SQL Server数据库。
2.连接SQL Server数据库
如果驱动被成功识别,在新建连接的时候应该会有SQLServer的选项。
(没有的话可尝试重启软件)
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用户,可以正式创建数据库连接了。
导入流程
右键SQLServer数据库,找到“迁移到Oracle”选项。
点击完成之后就开始执行迁移任务了。
迁移结果确认
迁移任务执行结果的日志在你设定的“迁移临时文件夹中”,类似于:
迁移完毕之后会创建跟SQLServer源库同名的用户账户,在日志的考前的位置中可以看到账户的名称及密码信息:
假如你看到的是 “创建用户失败”等字样,那么大概率你是在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实现,流程如下图。