天天看点

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

在并行生成了大量的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)',  

                           || ')'),  

              '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 `    --动态加载表定义语句

      DEFAULT DIRECTORY $3 

      LOCATION(

  `cat ../DUMP_LIST/${tab_name}_par_dmp.lst`   --动态加载dump文件列表

    ));

EOF

exit