海量数据迁移之外部表加载

在并行生成了大量的dump文件后,可以在目标环境上对数据进行加载,这个加载的过程时间极短,都基本可以在毫秒级完成。
由于在外部表的加载过程中需要知道表结构的定义,所以可以通过如下的脚本得到表定义的基本语句,输出和desc类似。
因为目标环境中的表结构可能会和源dump文件中的表结构有一定的出入。所以可以在目标环境中生成表结构的定义语句。
批量加载生成的dump文件。

大体的效果如下
根据目标环境的表结构定义,生成黄色部分的表结构定义语句。然后在加载dump的时候,可以动态批量的加载dump文件,值得一提的是,甚至可以基于业务需要来选择性的加载。
CREATE TABLE T_EXT2
   (    id number,object_id number,object_name varchar2(30),object_type varchar2(30),clob_test clob
   ) 
   ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY "EXPDP_LOCATION"
      LOCATION
       ( 'cust1.dmp'
       )
    )
   PARALLEL 2;

实现的shell脚本如下:
owner=`echo "$1"|tr '[a-z]' '[A-Z]'`
tab_name=`echo "$2"|tr '[a-z]' '[A-Z]'`

dump_list=`cat  ../DUMP_LIST/${tab_name}_par_dmp.lst`
print "conn  n1/n1 
set feedback off
set linesize 100
col data_type format a30
set pages 0
set termout off
SELECT 
        t1.COLUMN_NAME,  
        t1.DATA_TYPE  
        || DECODE (  
             t1.DATA_TYPE,  
              'NUMBER', DECODE (  
                              '('  
                           || NVL (TO_CHAR (t1.DATA_PRECISION), '*')  
                           || ','  
                           || NVL (TO_CHAR (t1.DATA_SCALE), '*')  
                           || ')',  
                           '(*,*)', NULL,  
                           '(*,0)', '(38)',  
                              '('  
                           || NVL (TO_CHAR (t1.DATA_PRECISION), '*')  
                           || ','  
                           || NVL (TO_CHAR (t1.DATA_SCALE), '*')  
                           || ')'),  
              'FLOAT', '(' || t1.DATA_PRECISION || ')',  
              'DATE', NULL,  
              'TIMESTAMP(6)', NULL,  
              '(' || t1.DATA_LENGTH || ')')  ||','
           AS DATA_TYPE
           from all_tab_columns t1 where owner=upper('$1') AND table_name=upper('$2' )
order by t1.column_id;
"|sqlplus -s /nolog > ${tab_name}.temp
#ksh getddl.sh $owner $tab_name > ${tab_name}.temp
sed -e '/^$/d' -e '$s/.$//' -e  's/CLOB(4000)/CLOB/g' -e  's/BLOB(4000)/BLOB/g' ${tab_name}.temp > ../DESC_LIST/${tab_name}.desc  --过滤clob,blob显示的问题
rm ${tab_name}.temp
##body_desc=`cat ${tab_name}.desc`
##body_desc=${body_desc%?}
echo loading table ${tab_name} as ${tab_name}_EXT2
sqlplus -s n1/n1
set timing on
set echo on
CREATE TABLE  ${tab_name}_EXT2
   ( 
  `cat ../DESC_LIST/${tab_name}.desc `    --动态加载表定义语句
   ) 
   ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY $3 
      LOCATION(
  `cat ../DUMP_LIST/${tab_name}_par_dmp.lst`   --动态加载dump文件列表
    ));
EOF
exit

时间: 2024-07-30 10:57:03

海量数据迁移之外部表加载的相关文章

海量数据迁移之外部表并行抽取

在10g开始的新特性中,外部表是一个不容忽视的好工具.对于大型项目中海量数据使用sqlloader是一种全新的方式,不过很明显,sqlloader的可扩展性更强,但是基于oracle平台的数据迁移来说,外部表的性能也不错.对于数据迁移来说也是一个很好的方案. 使用外部表来做数据迁移,可以"动态"加载数据,能够很方便的从数据库中加载数据,对于数据校验来说就显得很有优势了,而对于sqlloader来说,可能得等到数据加载的时候才知道是不是有问题,如果对于数据的准确性要求极高,可以使用外部表

海量数据迁移之外部表切分

在前几篇中讨论过海量数据的并行加载,基本思路就是针对每一个物理表都会有一个对应的外部表,在做数据迁移的时候,如果表有上百G的时候,一个物理表对应一个外部表性能上会没有任何提升.如果需要做数据插入的时候,对undo是极大的挑战,从某种程度上而言,性能应该要比datapump要差.这个时候可以考虑一个物理表对应多个外部表,比如一个表有100G.可以考虑生成100个external dump 文件,然后加载生成100个外部表,每个dump文件对应一个外部表,这样做数据的插入的时候就相对容易控制了.每一

SoapUI利用Groovy把外部数据加载到request中

默认已经用Groovy把外部数据给读取出来了,关键是读取出来后,如何加载到request中去?这里提供了两种方法: 1.该Groovy脚本的名称是"setUp" def num = Integer.parseInt(testRunner.testCase.getPropertyValue( "count" )) log.info num num = (++num) % 2 testRunner.testCase.setPropertyValue( "cou

js实现网页延迟加载之外部js加载

我们的实际业务中,很多第三方资源的代码,像广告代码,一般情况这种的代码不是在首屏,所以一般做的功能是都可以做延尽加载 示例操作: 这些块广告位占了了26个链接,很80%的用户不会滚到下面. 处理前代码  代码如下 复制代码 <script type="text/javascript" id="zp_script_33" src="外部js地址/static/scripts/p.js?id=33&w=230&h=60&sl=1&

js实现页面延迟加载之外部js加载

我们的实际业务中,很多第三方资源的代码,像广告代码,一般情况这种的代码不是在首屏,所以一般做的功能是都可以做延尽加载 示例操作: 这些块广告位占了了26个链接,很80%的用户不会滚到下面. 处理前代码  代码如下 复制代码 <script type="text/javascript" id="zp_script_33" src="http://mcc.chinauma.net/static/scripts/p.js?id=33&w=230&a

数据泵对已经存在的表加载索引 imp 和impdp

这里探讨了使用imp 和impdp对含有索引的表的导入的一点差别. 使用imp可以在表存在的情况下,不删除表,且导入表的数据和索引. 1)创建实验表cust(已存在) SQL> conn scott/yang已连接.SQL> select * from cust;         ID CUTNAME                                                              ---------- ----------               

海量数据迁移之传输表空间(一)

在自己接触的很多的数据迁移工作中,使用外部表在一定程度上达到了系统的预期,对于增量,批量的数据迁移效果还是不错的,但是也不能停步不前,在很多限定的场景中,有很多物理迁移中使用传统方法还是相当不错的,传输表空间就是一个样例. 最近的有一个数据迁移任务是需要把一些全新的数据表迁移到另外一个库中,因为这些表在目标库中不存在,所以使用逻辑迁移就显得有些力不从心了.尽管在速度可以接受的情况下,最大的痛处就是大量的归档文件了. 因为需要在原有的schema下增加一些全新的数据表,不是很肯定传输表空间的校验是

Oracle数据泵如何对已经存在的表加载索引

一个朋友提到一个数据泵导入的问题,在表存在的情况下,不删除表,且导入表的数据和索引. 其实这个任务对于imp很简单,因为imp的工作方式就是如此. SQL> CREATE TABLE T_EXP 2  (ID NUMBER, NAME VARCHAR2(30)); 表已创建. SQL> CREATE INDEX IND_T_EXP_ID 2  ON T_EXP(ID); 索引已创建. SQL> INSERT INTO T_EXP 2  SELECT ROWNUM, TNAME 3  FR

使用外部表关联MySQL数据到Oracle

因为业务需要,有个临时的活动需要DBA来支持一些数据业务,问题来了,需要从MySQL端同步一部分数据到Oracle端,然后从Oracle端匹配查到相应的数据返回给MySQL,至于原因,也是不同的业务系统,不同的权限分配,还没法做到一个应用端去读取这些信息,而且也有安全的考虑,大体就是两部分的数据也是互相补充,但又彼此独立,是一个全集和子集的关系. 这个流程本来从开发的角度来看似乎是一头雾水,所以交给他们来规划就容易出现问题,最后沟通后的流程是下面的形式. 下面这个图左边是Oracle的环境,右边