海量数据迁移之外部表切分(r2笔记52天)

在前几篇中讨论过海量数据的并行加载,基本思路就是针对每一个物理表都会有一个对应的外部表,在做数据迁移的时候,如果表有上百G的时候,一个物理表对应一个外部表性能上会没有任何提升。如果需要做数据插入的时候,对undo是极大的挑战,从某种程度上而言,性能应该要比datapump要差。这个时候可以考虑一个物理表对应多个外部表,比如一个表有100G。可以考虑生成100个external dump 文件,然后加载生成100个外部表,每个dump文件对应一个外部表,这样做数据的插入的时候就相对容易控制了。每一个外部表的数据加载到目标库之后,commit一次,就能及时的释放Undo资源,提高性能。 比如表T生成了两个dump文件(t_1.dmp,t_2.dmp),就可以考虑如下的方式来加载,黄色部分是对应的dump文件。 CREATE TABLE T_EXT_1 ( 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 ( 't_1.dmp' ) ); CREATE TABLE T_EXT_2 ( 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 ( 't_2.dmp' ) ); 对应的脚本如下: 其中在DUMP目录下存放着生成的dump文件,根据动态匹配得到最终生成了几个dump文件,来决定创建几个对应的外部表。 target_owner=`echo "$2" |awk -F@ '{print $1}'|awk -F/ '{print $1}'|tr '[a-z]' '[A-Z]'` source_owner=`echo "$1" |awk -F@ '{print $1}'|awk -F/ '{print $1}'|tr '[a-z]' '[A-Z]'` tab_name=`echo "$3"|tr '[a-z]' '[A-Z]'` owner_account=$5 tmp_parallel=`ls -l ../DUMP/${tab_name}_[0-9]*.dmp|wc -l` echo parallel :$tmp_parallel for i in {1..$tmp_parallel}; do echo \'${tab_name}_$i.dmp\' >> tmp_${tab_name}_par_dmp.lst done sed -e '/^$/d' tmp_${tab_name}_par_dmp.lst > ../DUMP_LIST/${tab_name}_par_dmp.lst rm tmp_${tab_name}_par_dmp.lst dump_list=`cat ../DUMP_LIST/${tab_name}_par_dmp.lst` print " conn $1 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('$owner_account') AND table_name=upper('$3' ) order by t1.column_id; "|sqlplus -s /nolog > ${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 rm ${tab_name}.temp for i in {1..$tmp_parallel} do echo loading table ${tab_name} as ${tab_name}_EXT_$i sqlplus -s $2 <<EOF set timing on set echo on CREATE TABLE ${tab_name}_EXT_$i ( `cat ../DESC_LIST/${tab_name}.desc ` ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY $4 LOCATION( `sed -n "${i}p" ../DUMP_LIST/${tab_name}_par_dmp.lst` )); EOF done exit 生成的日志类似下面的格式: loading table T as T_EXT_1 Elapsed: 00:00:01.33 loading table T as T_EXT_2 Elapsed: 00:00:01.30

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

CPU 100%负载的性能优化分析(r7笔记第40天)

今天收到报警邮件,提示在短时间内DB time有了很大的抖动。报警邮件如下: ZABBIX-监控系统: ------------------------...

3574
来自专栏杨建荣的学习笔记

生产环境sql语句调优实战第七篇(r2笔记99天)

在数据迁移完成之后,开始了例行的后期数据库维护,早上一来就发现了一个sql执行时间很长了。达到了37279秒。最后在改进调优之后执行速度在1分钟以内。 这个速度...

3498
来自专栏杨建荣的学习笔记

完美的执行计划导致的性能问题(r4笔记第17天)

今天现场的开发同事反馈有一个job处理数据的速度很慢,从半夜2点开始运行,结果到了早上8点还没有运行完,最后无奈kill掉了进程。等我刚到公司,他们想让我查查倒...

4117
来自专栏杨建荣的学习笔记

impdp ORA-39002,ORA-39166,ORA-39164的问题及解决(r2第6天)

今天在做imp和impdp的性能测试时,发现如果表中存在lob字段,加载真是慢的厉害,每秒钟大概1000条的样子,按照这种速度,基本上不用干活了。 比如5千万条...

3227
来自专栏乐沙弥的世界

对比 PL/SQL profiler 剖析结果

      使用PL/SQL PROFILER 剖析PL/SQL代码是快速定位PL/SQL代码段最有效的方法。在上一篇文章使用PL/SQL PROFILER 定...

1261
来自专栏杨建荣的学习笔记

一条运行了3天的"简单"的sql(r2笔记82天)

早上刚到公司,查看系统的负载,就马上看到一个进程的执行时间已经有3天了。 而且cpu的消耗极高。 Tasks: 2374 total, 19 running,...

3245
来自专栏耕耘实录

记一次生产环境MySQL数据库的备份与还原

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

984
来自专栏杨建荣的学习笔记

10g,11g数据泵的导入问题及解决(19天)

今天在环境上测试expdp/impdp,环境有10.2.0.5.0,11.2.0.2.0的,11g的环境是从10g升级到11gde .是在impdp的时候都报了...

3554
来自专栏杨建荣的学习笔记

10g升级至11g exp的问题解决(23天)

昨天升级数据库,从10.2.0.5.0升级到11.2.0.2.0.按照预定的步骤很快就操作完了。升级完成后,开始跑一些应用和Job.有一个Job开始报错,Job...

4786
来自专栏乐沙弥的世界

Oracle 聚簇因子(Clustering factor)

    聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外...

1511

扫码关注云+社区

领取腾讯云代金券