海量資料遷移之外部表載入

kingsql發表於2014-09-11
在並行生成了大量的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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1267554/,如需轉載,請註明出處,否則將追究法律責任。

相關文章