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