MS SQL到Oracle的数据迁移笔记
MS SQL到Oracle的数据迁移笔记
一、任务背景
旧系统使用MS SQL Server数据库,新系统使用Oracle数据库,现在需要将旧系统中的数据迁移到新系统中,旧数据按照约定的规则转换后,能够在新系统中使用或查询。另外,新系统的实施人员并不清楚旧系统的数据结构,且两个新旧两个系统的使用的数据结构有较大的差异。为了叙述方便,将旧系统维护人员简称为A,新系统实施人员简称为B。
二、总体思路
1、 A与B根据各自了解的信息,一起制定中间表;
2、 A从MS SQL Server提取数据,并导出为中间表数据,保存为txt文件;
3、 B将txt文件中的数据导入Oracle中间表;
4、 B将Oracle中间表的数据,合并到业务逻辑使用的数据表。
三、具体实现
第1步,涉及到具体的业务逻辑,此处省略。
第2步,使用MS SQL Server 的BCP命令从MS SQL Server导出数据,并且使用批处理将多个表一起导出(此处只列出一个表),见下图:

第3步使用Oracle 的sqlldr命令将上一步导出的数据导入Oracle,见下图:

控制文件:

第4步,涉及到具体业务逻辑的转换,这里使用Merge合并数据,同时兼容增量导入的需要。此处也省略。
最后将这三步使用批处理连贯起来,形成一个文件,最后只需执行此批处理文件即可完成从MS SQL Server导出,到导入Oracle和执行Oracle中的Procedure的整个数据迁移过程。
目录结构见下图:

说明:
bad:存放sqlldr执行过程中发生的错误信息
bat:存放导出、导入、执行sql文件夹中SQL的批处理文件,见下图:
执行sql文件夹中SQL的批处理文件:

bat目录的文件:

ctl:存放sqlldr所需的CTL文件
data:存放BCP导出和sqlldr导入的数据
sql:存放执行Oracle 执行的SQL,在每一个sql文件中SQL语句的最后加上一句”EXIT;“
DATA_Export_Import_3in1.bat:将bat中所有批处理文件按顺序合并执行,并且输出每一步的执行log信息,见下图。运行此文件即可完成整个过程的数据迁移。

四、总结
刚开始做这个任务的时候,使用的是SQL Developer的复制表功能——从MS SQL Server数据库将表拷贝到Oracle,见下图:

使用这个方法,可以顺利将数据表拷贝到Oracle,而且操作方便简洁,但是速度比较慢,两种方法的比较见下表(由实际操作中多次导数的统计结果):

从上表可以看出,使用”BCP & SQLLDR“方法在同样数据量的情况下,耗时远小于”SQL Developer“的方法。
另外在实践中,还发现使用”BCP & SQLLDR“有以下几个特点:
1、可以再导出时对要导出的数据进行筛选,通过在BCP命令中编写SQL;
2、可以对要导入的数据进行一些简单的格式化(如去除空格、替换不需要的字符等),通过在SQLLDR的CTL文件中处理。
3、整个执行过程都可以获取log,对出错问题的处理比较方便。
---------------------------------------------------------------------------------------------------------------------------------------
以上内容为个人实践总结,如有不足之处,敬请指出。
08/05 补充:
--获取CTL文件中所需的Columns,包括去掉字符串中的空格,日期和数字的转化,Clob类型数据的处理
SELECT wmsys.wm_concat(column_name)
FROM
(SELECT(
CASE data_type
WHEN 'VARCHAR2' THEN column_name || ' ' || CHR(34) || 'TRIM(REPLACE(:' ||
column_name || ',CHR(0),'''')) ' || CHR(34)
WHEN 'DATE' THEN column_name || ' ' || CHR(34) || 'TO_DATE(SUBSTR(:' ||
column_name || ',0,19),''yyyy-mm-dd-hh24.mi.ss'')' || CHR(34)
WHEN 'NUMBER' THEN column_name || ' ' || CHR(34) || 'TO_NUMBER(:' ||
column_name || ')' || CHR(34)
WHEN 'CLOB' THEN column_name || ' CHAR(100000)'
ELSE column_name
END) column_name
FROM all_tab_columns
WHERE TABLE_NAME = UPPER('TMP_PACKAGE')
ORDER BY column_id);
MS SQL到Oracle的数据迁移笔记的更多相关文章
- Oracle数据迁移笔记-Rownum与序列的自增长的组合用法技巧
Rownum与序列的自增长的组合用法技巧 根据序列自增长的步长规律,结合表行记录Rownum值的规则批量生成表的行记录主键的用法技巧 案例如下: CREATE OR REPLACE PROCEDURE ...
- 记一次简单的Oracle离线数据迁移至TiDB过程
背景 最近在支持一个从Oracle转TiDB的项目,为方便应用端兼容性测试需要把Oracle测试环境的库表结构和数据同步到TiDB中,由于数据量并不大,所以怎么方便怎么来,这里使用CSV导出导入的方式 ...
- SQL SERVER几种数据迁移/导出导入的实践
SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel.数据库与文本文件.数据库与数据库之间的导出导入). (一)数据库与Excel 方法1: 使用数据 ...
- oracle 数据库数据迁移解决方案
大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,接下来把心得与大家分享一下 去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁 ...
- MS SQL 模仿ORACLE的DESC
前言: 在ORACLE数据库的SQL*PLUS里面有个DES(DESCRIBE)命令,它可以返回数据库所存储对象的描述,如下所示 SQL> DESC STUDENT_SCORE Name T ...
- oracle impdp 数据迁移 至RDS 亚马逊云
背景: 公司年底打算将aws rds11.2.0.4 oracle 数据库升级到19c,所以需要进行升级测试,所以需要我把线上的库数据迁移到一台测试的rds oracle 亚马逊云的数据库中,然后升级 ...
- oracle跨平台数据迁移 expdp/impdp 字符集问题 导致ORA-02374 ORA-12899 ORA-02372
环境描述: 源数据库环境: 操作系统:Windows SERVER 2008R2 数据库版本:单实例 ORACLE 11.2.0.1 目标端数据库环境: 操作系统:redhat ...
- 水晶报表连接Oracle做数据报表笔记
首先,新建一个水晶报表的文件,这个时候要给这个报表文件绑定一个oracle数据源, 选择右侧菜单的这个东西,选择“数据库专家”,打开之后是这么一个界面: 选择建立新连接: 这个地方最关键,也是我为什么 ...
- sql或oracle插入数据时进行md5加密
1.sql简单直接调用: SELECT hashbytes(') ; 2.oracle要复杂些 首写需要建函数: CREATE OR REPLACE FUNCTION MD5( passwd IN V ...
随机推荐
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
如何退出Activity?如何安全退出已调用多个Activity的Application? 退出Activity直接调用finish()方法 //用户点击back键就是退出一个Activity 退出 ...
- d008: 求两数的整数商 和 商
内容: 求两数的整数商 和 商 ,商保留两位小数 输入说明: 一行 两个整数 输出说明: 一行,一个整数,一个实数(两位小数) 输入样例: 12 8 输出样例 : 1 1.50 #include ...
- MVC 中集成 AngularJS1
在 ASP.NET MVC 中集成 AngularJS(1) 介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 R ...
- nginx 中location和root
nginx 中location和root,你确定真的明白他们关系? 2016-01-17 14:48 3774人阅读 评论(1) 收藏 举报 分类: linux(17) 版权声明:本文为博主原创文 ...
- IC 小常识
IC产品的命名规则: 大部分IC产品型号的开头字母,也就是通常所说的前缀都是为生产厂家的前两个或前三个字母,比如:MAXIM公司的以MAX为前缀,AD公司的以AD为前缀,ATMEL公司的以AT为前缀, ...
- Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能
HTTP是一种很简单的请求.响应式协议,客户端发送一个请求.服务器返回一个响应.HTTP 1.1 版本规范由 RFC2616 定义.了解了 HTTP请求.响应消息在TCP数据流中的格式,很容易使用纯 ...
- HDOJ 1339 A Simple Task(简单数学题,暴力)
Problem Description Given a positive integer n and the odd integer o and the nonnegative integer p s ...
- pojo的序列化和反序列化
实例代码: package com.lky.pojo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStrea ...
- Java中setCharAt()方法介绍
--转载自网络,备忘 这是StringBuffer类里面的一个方法:主要是用来替换的,方法里面有两个参数setCharAt(int index,Char ch),第一个参数是取代的位置 索引从0开始 ...
- spring mvc json 返回乱码问题解决(vestion:3.x.x)
本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:<spring mvc json 返回乱码问题解决(vestion:3.x.x)> 工程中用springmvc返 ...