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 ...
随机推荐
- 转载:/etc/resolv.conf的作用
转载网址:http://jiao-zhong.blog.sohu.com/97976004.html 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数.resolv ...
- WDCP一些常用的一健安装包可选安装组件
为有更好的性能,也为更简洁的系统,一些不是常用或不是基本的功能,都将做为可选的安装组件需要用到的就安装 memcache的安装 wget -c http://down.wdlinux.cn/in/me ...
- WDCP安装memcached
memcached安装 我们打开Web控制面板的时候其实memcached是没有安装的,所以我们要手动安装这个组件. 首先是要下载安装源代码并执行. 1 2 wget -c http://down.w ...
- php mkdir 创建多级目录实例代码
先介绍一下 mkdir() 这个函数 mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径. 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问 ...
- START WITH CONNECT BY PRIOR 链表查询
使用场景:排序 设计思路,id为主键,index为顺序,index存前一个节点的id,当然,按照这个思路可以实现双向链表的(preindex存前一个节点,nextindex存下一个节点) 这样的话排序 ...
- cat查看proc下文件帮助
cat boot_mode 查看cpu版本 cat cmdline cat cpuinfo 查看cup详细信息 cat devices cat diskstats cat dma-mappings c ...
- Altium Designer6打印PCB转印纸设置方法
在学校经常要用热转印法做一些简单的PCB板,自己用的AD6.6,学校的打印店用99的比较多,这就造成打印不方便.为了充分利用自己实验室的打印机,今天买回来两张PCB打印纸.发现用AD6打印同比例的PC ...
- Linux下静态编译Qt
Qt采用编译的方式安装的时候,配置中默认的编译方式是动态编译的,但是有时候你编写的程序要发布出去,带很多动态库文件是很繁琐的,此时就需要静态编译你的程序,Qt要实现静态编译必须库文件也是静态编译的,所 ...
- 排序功能实现 jQuery实现排序 上移 下移
效果 思路, 跟相邻元素,互换sort. 前提是每一个元素都有自己的sort值,不为零. <tr id="{sh:$vo.id}"> <td> <sp ...
- Linux系统编程(27)——线程控制
进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,那么如何在一个进程的地址空间中执行多个线程呢.有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比 ...